react-native-screens 4.24.0 → 4.25.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (971) hide show
  1. package/README.md +7 -3
  2. package/RNScreens.podspec +13 -3
  3. package/android/CMakeLists.txt +7 -22
  4. package/android/build.gradle +9 -28
  5. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +0 -2
  6. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +0 -8
  7. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +49 -13
  8. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +10 -7
  9. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +15 -89
  10. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +13 -14
  11. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +0 -4
  12. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +3 -1
  13. package/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt +1 -2
  14. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +26 -3
  15. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +1 -3
  16. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +36 -16
  17. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +38 -86
  18. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +1 -1
  19. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +1 -6
  20. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +16 -6
  21. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +21 -61
  22. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +13 -26
  23. package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +7 -37
  24. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/SheetUtils.kt +1 -17
  25. package/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt +4 -0
  26. package/android/src/main/java/com/swmansion/rnscreens/gamma/common/ShadowStateProxy.kt +58 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/gamma/common/colorscheme/ColorScheme.kt +7 -0
  28. package/android/src/main/java/com/swmansion/rnscreens/gamma/common/colorscheme/ColorSchemeCoordinator.kt +120 -0
  29. package/android/src/main/java/com/swmansion/rnscreens/gamma/common/colorscheme/ColorSchemeListener.kt +5 -0
  30. package/android/src/main/java/com/swmansion/rnscreens/gamma/common/colorscheme/ColorSchemeProviding.kt +9 -0
  31. package/android/src/main/java/com/swmansion/rnscreens/gamma/{tabs/image/TabsImageLoader.kt → helpers/ImageLoader.kt} +9 -8
  32. package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/SystemDrawable.kt +3 -2
  33. package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/UIManagerHelperExt.kt +11 -0
  34. package/android/src/main/java/com/swmansion/rnscreens/gamma/scrollviewmarker/ScrollViewMarker.kt +91 -0
  35. package/android/src/main/java/com/swmansion/rnscreens/gamma/scrollviewmarker/ScrollViewMarkerViewManager.kt +55 -0
  36. package/android/src/main/java/com/swmansion/rnscreens/gamma/scrollviewmarker/ScrollViewSeeking.kt +13 -0
  37. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/StackHeaderAppBarLayout.kt +109 -0
  38. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/StackHeaderAppBarLayoutBehavior.kt +29 -0
  39. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/StackHeaderCoordinator.kt +589 -0
  40. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/StackHeaderCoordinatorLayout.kt +100 -0
  41. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/StackHeaderScrollingViewBehavior.kt +19 -0
  42. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/config/OnHeaderConfigAttachListener.kt +5 -0
  43. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/config/OnHeaderConfigChangeListener.kt +5 -0
  44. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/config/StackHeaderConfig.kt +163 -0
  45. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/config/StackHeaderConfigProviding.kt +33 -0
  46. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/config/StackHeaderConfigViewManager.kt +192 -0
  47. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/config/StackHeaderType.kt +7 -0
  48. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/subview/OnStackHeaderSubviewChangeListener.kt +5 -0
  49. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/subview/StackHeaderSubview.kt +87 -0
  50. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/subview/StackHeaderSubviewCollapseMode.kt +20 -0
  51. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/subview/StackHeaderSubviewProviding.kt +14 -0
  52. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/subview/StackHeaderSubviewType.kt +8 -0
  53. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/header/subview/StackHeaderSubviewViewManager.kt +67 -0
  54. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/host/StackContainer.kt +17 -5
  55. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/host/StackHost.kt +27 -0
  56. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/screen/StackScreen.kt +39 -7
  57. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/screen/StackScreenFragment.kt +3 -1
  58. package/android/src/main/java/com/swmansion/rnscreens/gamma/stack/screen/StackScreenViewManager.kt +72 -0
  59. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/{TabsHostAppearanceApplicator.kt → appearance/TabsAppearanceApplicator.kt} +99 -62
  60. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/appearance/TabsAppearanceCoordinator.kt +51 -0
  61. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/appearance/TabsAppearanceModel.kt +25 -0
  62. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/container/MenuHelpers.kt +31 -0
  63. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/container/TabsActionOrigin.kt +26 -0
  64. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/container/TabsContainer.kt +645 -0
  65. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/container/TabsNavigationState.kt +60 -0
  66. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/container/TabsNavigationStateObserver.kt +53 -0
  67. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/container/TabsNavigationStateObserverRegistry.kt +88 -0
  68. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/host/TabsHost.kt +223 -0
  69. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/{TabsHostA11yCoordinator.kt → host/TabsHostA11yCoordinator.kt} +3 -1
  70. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/host/TabsHostEventEmitter.kt +77 -0
  71. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/host/TabsHostViewManager.kt +140 -0
  72. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/host/event/TabsHostTabSelectedEvent.kt +49 -0
  73. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/host/event/TabsHostTabSelectionPreventedEvent.kt +47 -0
  74. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/host/event/TabsHostTabSelectionRejectedEvent.kt +56 -0
  75. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/{TabsScreen.kt → screen/TabsScreen.kt} +25 -21
  76. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/{TabsScreenDelegate.kt → screen/TabsScreenDelegate.kt} +2 -5
  77. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/{TabsScreenEventEmitter.kt → screen/TabsScreenEventEmitter.kt} +6 -6
  78. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/{TabsScreenFragment.kt → screen/TabsScreenFragment.kt} +4 -1
  79. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/screen/TabsScreenViewManager.kt +234 -0
  80. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/{event → screen/event}/TabsScreenDidAppearEvent.kt +1 -1
  81. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/{event → screen/event}/TabsScreenDidDisappearEvent.kt +1 -1
  82. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/{event → screen/event}/TabsScreenWillAppearEvent.kt +1 -1
  83. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/{event → screen/event}/TabsScreenWillDisappearEvent.kt +1 -1
  84. package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaView.kt +1 -65
  85. package/android/src/main/java/com/swmansion/rnscreens/safearea/{paper/SafeAreaViewEdges.kt → SafeAreaViewEdges.kt} +1 -1
  86. package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaViewManager.kt +0 -9
  87. package/android/src/main/java/com/swmansion/rnscreens/utils/ColorUtils.kt +25 -0
  88. package/android/src/main/java/com/swmansion/rnscreens/utils/DimensionUtils.kt +18 -0
  89. package/android/src/main/java/com/swmansion/rnscreens/utils/DrawableUtils.kt +23 -0
  90. package/android/src/main/java/com/swmansion/rnscreens/utils/RNSLog.kt +75 -7
  91. package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +118 -34
  92. package/android/src/main/jni/rnscreens.h +3 -0
  93. package/common/cpp/react/renderer/components/rnscreens/RNSSplitScreenComponentDescriptor.h +39 -0
  94. package/common/cpp/react/renderer/components/rnscreens/RNSSplitScreenShadowNode.cpp +13 -0
  95. package/common/cpp/react/renderer/components/rnscreens/{RNSSplitViewScreenShadowNode.h → RNSSplitScreenShadowNode.h} +7 -7
  96. package/common/cpp/react/renderer/components/rnscreens/{RNSSplitViewScreenState.h → RNSSplitScreenState.h} +6 -6
  97. package/common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigComponentDescriptor.h +43 -0
  98. package/common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigShadowNode.cpp +21 -0
  99. package/common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigShadowNode.h +33 -0
  100. package/common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigState.cpp +13 -0
  101. package/common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigState.h +44 -0
  102. package/common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewComponentDescriptor.h +14 -0
  103. package/common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewShadowNode.cpp +30 -0
  104. package/common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewShadowNode.h +37 -0
  105. package/common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewState.cpp +12 -0
  106. package/common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewState.h +39 -0
  107. package/common/cpp/react/renderer/components/rnscreens/RNSStackScreenComponentDescriptor.h +42 -0
  108. package/common/cpp/react/renderer/components/rnscreens/RNSStackScreenShadowNode.cpp +15 -0
  109. package/common/cpp/react/renderer/components/rnscreens/RNSStackScreenShadowNode.h +30 -0
  110. package/common/cpp/react/renderer/components/rnscreens/RNSStackScreenState.cpp +13 -0
  111. package/common/cpp/react/renderer/components/rnscreens/RNSStackScreenState.h +44 -0
  112. package/common/cpp/react/renderer/components/rnscreens/RNSTabsBottomAccessoryShadowNode.cpp +17 -0
  113. package/common/cpp/react/renderer/components/rnscreens/RNSTabsBottomAccessoryShadowNode.h +9 -0
  114. package/common/cpp/react/renderer/components/rnscreens/RNSTabsHostShadowNode.cpp +6 -2
  115. package/common/cpp/react/renderer/components/rnscreens/RNSTabsHostShadowNode.h +7 -2
  116. package/ios/RCTConvert+RNScreens.h +3 -13
  117. package/ios/RCTConvert+RNScreens.mm +2 -67
  118. package/ios/RCTImageComponentView+RNSScreenStackHeaderConfig.h +2 -2
  119. package/ios/RCTImageComponentView+RNSScreenStackHeaderConfig.mm +0 -4
  120. package/ios/RNSConvert.h +6 -6
  121. package/ios/RNSConvert.mm +0 -14
  122. package/ios/RNSEnums.h +3 -3
  123. package/ios/RNSFullWindowOverlay.h +6 -17
  124. package/ios/RNSFullWindowOverlay.mm +7 -60
  125. package/ios/RNSModalScreen.mm +8 -17
  126. package/ios/RNSModule.h +2 -6
  127. package/ios/RNSModule.mm +2 -19
  128. package/ios/RNSScreen.h +13 -49
  129. package/ios/RNSScreen.mm +97 -339
  130. package/ios/RNSScreenContainer.h +2 -11
  131. package/ios/RNSScreenContainer.mm +6 -33
  132. package/ios/RNSScreenContentWrapper.h +4 -11
  133. package/ios/RNSScreenContentWrapper.mm +9 -38
  134. package/ios/RNSScreenFooter.h +4 -11
  135. package/ios/RNSScreenFooter.mm +7 -32
  136. package/ios/RNSScreenNavigationContainer.mm +5 -14
  137. package/ios/RNSScreenStack.h +6 -19
  138. package/ios/RNSScreenStack.mm +52 -181
  139. package/ios/RNSScreenStackAnimator.mm +1 -2
  140. package/ios/RNSScreenStackHeaderConfig.h +3 -60
  141. package/ios/RNSScreenStackHeaderConfig.mm +11 -230
  142. package/ios/RNSScreenStackHeaderSubview.h +2 -12
  143. package/ios/RNSScreenStackHeaderSubview.mm +12 -62
  144. package/ios/RNSSearchBar.mm +10 -6
  145. package/ios/bridging/RNSReactBaseView.h +0 -13
  146. package/ios/conversion/RNSConversions-ScrollViewMarker.h +26 -0
  147. package/ios/conversion/RNSConversions-ScrollViewMarker.mm +44 -0
  148. package/ios/conversion/RNSConversions-SplitView.mm +20 -22
  149. package/ios/conversion/RNSConversions-Stack.h +2 -2
  150. package/ios/conversion/RNSConversions-Stack.mm +2 -2
  151. package/ios/conversion/RNSConversions-Tabs.mm +79 -54
  152. package/ios/conversion/RNSConversions.h +33 -28
  153. package/ios/gamma/scroll-view-marker/RNSScrollViewMarkerComponentView.h +11 -0
  154. package/ios/gamma/scroll-view-marker/RNSScrollViewMarkerComponentView.mm +272 -0
  155. package/ios/gamma/scroll-view-marker/RNSScrollViewSeeking.h +15 -0
  156. package/ios/gamma/split/RNSSplitAppearanceApplicator.swift +194 -0
  157. package/ios/gamma/split/RNSSplitAppearanceCoordinator.swift +26 -0
  158. package/ios/gamma/split/RNSSplitAppearanceUpdateFlags.swift +11 -0
  159. package/ios/gamma/{split-view/RNSSplitViewHostComponentEventEmitter.h → split/RNSSplitHostComponentEventEmitter.h} +5 -5
  160. package/ios/gamma/{split-view/RNSSplitViewHostComponentEventEmitter.mm → split/RNSSplitHostComponentEventEmitter.mm} +4 -4
  161. package/ios/gamma/{split-view/RNSSplitViewHostComponentView.h → split/RNSSplitHostComponentView.h} +10 -10
  162. package/ios/gamma/{split-view/RNSSplitViewHostComponentView.mm → split/RNSSplitHostComponentView.mm} +83 -75
  163. package/ios/gamma/{split-view/RNSSplitViewHostComponentViewManager.h → split/RNSSplitHostComponentViewManager.h} +1 -1
  164. package/ios/gamma/split/RNSSplitHostComponentViewManager.mm +7 -0
  165. package/ios/gamma/{split-view/RNSSplitViewHostController.swift → split/RNSSplitHostController.swift} +82 -82
  166. package/ios/gamma/{split-view/RNSSplitViewNavigationController.swift → split/RNSSplitNavigationController.swift} +10 -10
  167. package/ios/gamma/{split-view/RNSSplitViewScreenComponentEventEmitter.h → split/RNSSplitScreenComponentEventEmitter.h} +5 -5
  168. package/ios/gamma/{split-view/RNSSplitViewScreenComponentEventEmitter.mm → split/RNSSplitScreenComponentEventEmitter.mm} +4 -4
  169. package/ios/gamma/{split-view/RNSSplitViewScreenComponentView.h → split/RNSSplitScreenComponentView.h} +17 -17
  170. package/ios/gamma/{split-view/RNSSplitViewScreenComponentView.mm → split/RNSSplitScreenComponentView.mm} +34 -24
  171. package/ios/gamma/{split-view/RNSSplitViewScreenComponentViewManager.h → split/RNSSplitScreenComponentViewManager.h} +1 -1
  172. package/ios/gamma/split/RNSSplitScreenComponentViewManager.mm +7 -0
  173. package/ios/gamma/split/RNSSplitScreenController.swift +133 -0
  174. package/ios/gamma/{split-view/RNSSplitViewScreenShadowStateProxy.h → split/RNSSplitScreenShadowStateProxy.h} +14 -14
  175. package/ios/gamma/{split-view/RNSSplitViewScreenShadowStateProxy.mm → split/RNSSplitScreenShadowStateProxy.mm} +10 -10
  176. package/ios/gamma/stack/host/RNSStackHostComponentView.h +1 -7
  177. package/ios/gamma/stack/host/RNSStackHostComponentView.mm +77 -83
  178. package/ios/gamma/stack/host/RNSStackNavigationController.h +13 -0
  179. package/ios/gamma/stack/host/RNSStackNavigationController.mm +82 -0
  180. package/ios/gamma/stack/host/RNSStackOperation.h +25 -0
  181. package/ios/gamma/stack/host/RNSStackOperation.mm +21 -0
  182. package/ios/gamma/stack/host/RNSStackOperationCoordinator.h +15 -0
  183. package/ios/gamma/stack/host/RNSStackOperationCoordinator.mm +78 -0
  184. package/ios/gamma/stack/screen/RNSStackScreenComponentView.h +1 -0
  185. package/ios/gamma/stack/screen/RNSStackScreenComponentView.mm +14 -1
  186. package/ios/gamma/stack/screen/RNSStackScreenController.h +15 -0
  187. package/ios/gamma/stack/screen/RNSStackScreenController.mm +66 -0
  188. package/ios/helpers/scroll-view/RNSScrollEdgeEffectApplicator.h +2 -1
  189. package/ios/helpers/scroll-view/RNSScrollEdgeEffectApplicator.mm +2 -1
  190. package/ios/safe-area/RNSSafeAreaViewComponentView.h +0 -17
  191. package/ios/safe-area/RNSSafeAreaViewComponentView.mm +7 -60
  192. package/ios/stubs/RNSGammaStubs.h +5 -2
  193. package/ios/stubs/RNSGammaStubs.mm +5 -2
  194. package/ios/tabs/RNSTabBarAppearanceCoordinator.h +2 -1
  195. package/ios/tabs/RNSTabBarAppearanceCoordinator.mm +1 -0
  196. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.h +4 -9
  197. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.mm +13 -15
  198. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentViewManager.mm +1 -1
  199. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.mm +10 -0
  200. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryHelper.mm +34 -5
  201. package/ios/tabs/host/RNSTabBarController.h +196 -55
  202. package/ios/tabs/host/RNSTabBarController.mm +814 -53
  203. package/ios/tabs/host/RNSTabsHostComponentView.h +20 -16
  204. package/ios/tabs/host/RNSTabsHostComponentView.mm +144 -66
  205. package/ios/tabs/host/RNSTabsHostComponentViewManager.mm +0 -3
  206. package/ios/tabs/host/RNSTabsHostEventEmitter.h +49 -12
  207. package/ios/tabs/host/RNSTabsHostEventEmitter.mm +55 -17
  208. package/ios/tabs/host/RNSTabsNavigationState.h +184 -0
  209. package/ios/tabs/host/RNSTabsNavigationState.mm +78 -0
  210. package/ios/tabs/host/RNSTabsNavigationStateObserverRegistry.h +62 -0
  211. package/ios/tabs/host/RNSTabsNavigationStateObserverRegistry.mm +104 -0
  212. package/ios/tabs/screen/RNSTabsScreenComponentView.h +8 -22
  213. package/ios/tabs/screen/RNSTabsScreenComponentView.mm +44 -105
  214. package/ios/tabs/screen/RNSTabsScreenComponentViewManager.mm +1 -1
  215. package/ios/tabs/screen/RNSTabsScreenEventEmitter.h +1 -1
  216. package/ios/tabs/screen/RNSTabsScreenEventEmitter.mm +2 -2
  217. package/ios/tabs/screen/RNSTabsScreenViewController.h +8 -5
  218. package/ios/tabs/screen/RNSTabsScreenViewController.mm +18 -12
  219. package/ios/utils/RNSLog.swift +6 -0
  220. package/ios/utils/UIView+RNSUtility.h +1 -12
  221. package/ios/utils/UIView+RNSUtility.mm +2 -19
  222. package/lib/commonjs/components/ScreenStack.js +4 -1
  223. package/lib/commonjs/components/ScreenStack.js.map +1 -1
  224. package/lib/commonjs/components/ScreenStackHeaderConfig.js +8 -1
  225. package/lib/commonjs/components/ScreenStackHeaderConfig.js.map +1 -1
  226. package/lib/commonjs/components/ScreenStackItem.js +19 -7
  227. package/lib/commonjs/components/ScreenStackItem.js.map +1 -1
  228. package/lib/commonjs/components/SearchBar.js.map +1 -1
  229. package/lib/commonjs/components/contexts/TopInsetApplicationContext.js +33 -0
  230. package/lib/commonjs/components/contexts/TopInsetApplicationContext.js.map +1 -0
  231. package/lib/commonjs/components/gamma/scroll-view-marker/ScrollViewMarker.js +23 -0
  232. package/lib/commonjs/components/gamma/scroll-view-marker/ScrollViewMarker.js.map +1 -0
  233. package/lib/commonjs/components/gamma/scroll-view-marker/ScrollViewMarker.types.js +6 -0
  234. package/lib/commonjs/components/gamma/scroll-view-marker/ScrollViewMarker.types.js.map +1 -0
  235. package/lib/commonjs/components/gamma/scroll-view-marker/index.js +13 -0
  236. package/lib/commonjs/components/gamma/scroll-view-marker/index.js.map +1 -0
  237. package/lib/commonjs/components/gamma/split/SplitHost.js +5 -5
  238. package/lib/commonjs/components/gamma/split/SplitHost.js.map +1 -1
  239. package/lib/commonjs/components/gamma/split/SplitScreen.js +3 -3
  240. package/lib/commonjs/components/gamma/split/SplitScreen.js.map +1 -1
  241. package/lib/commonjs/components/gamma/split/index.js +2 -28
  242. package/lib/commonjs/components/gamma/split/index.js.map +1 -1
  243. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.android.js +113 -0
  244. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.android.js.map +1 -0
  245. package/lib/commonjs/components/{tabs/TabsAccessoryContent.types.js → gamma/stack/header/StackHeaderConfig.android.types.js} +1 -1
  246. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.android.types.js.map +1 -0
  247. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.d.js +2 -0
  248. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.d.js.map +1 -0
  249. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.ios.js +27 -0
  250. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.ios.js.map +1 -0
  251. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.ios.types.js +2 -0
  252. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.ios.types.js.map +1 -0
  253. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.types.js +6 -0
  254. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.types.js.map +1 -0
  255. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.web.js +10 -0
  256. package/lib/commonjs/components/gamma/stack/header/StackHeaderConfig.web.js.map +1 -0
  257. package/lib/commonjs/components/gamma/stack/header/android/StackHeaderSubview.android.js +33 -0
  258. package/lib/commonjs/components/gamma/stack/header/android/StackHeaderSubview.android.js.map +1 -0
  259. package/lib/commonjs/components/gamma/stack/header/android/StackHeaderSubview.android.types.js +6 -0
  260. package/lib/commonjs/components/gamma/stack/header/android/StackHeaderSubview.android.types.js.map +1 -0
  261. package/lib/commonjs/components/gamma/stack/header/index.js +14 -0
  262. package/lib/commonjs/components/gamma/stack/header/index.js.map +1 -0
  263. package/lib/commonjs/components/gamma/stack/{StackHost.js → host/StackHost.js} +1 -1
  264. package/lib/commonjs/components/gamma/stack/host/StackHost.js.map +1 -0
  265. package/lib/commonjs/components/gamma/stack/host/StackHost.types.js.map +1 -0
  266. package/lib/commonjs/components/gamma/stack/host/StackHost.web.js.map +1 -0
  267. package/lib/commonjs/components/gamma/stack/host/index.js +14 -0
  268. package/lib/commonjs/components/gamma/stack/host/index.js.map +1 -0
  269. package/lib/commonjs/components/gamma/stack/index.js +8 -33
  270. package/lib/commonjs/components/gamma/stack/index.js.map +1 -1
  271. package/lib/commonjs/components/gamma/stack/{StackScreen.js → screen/StackScreen.js} +2 -2
  272. package/lib/commonjs/components/gamma/stack/screen/StackScreen.js.map +1 -0
  273. package/lib/commonjs/components/gamma/stack/screen/StackScreen.types.js.map +1 -0
  274. package/lib/commonjs/components/gamma/stack/screen/StackScreen.web.js.map +1 -0
  275. package/lib/commonjs/components/gamma/stack/screen/index.js +14 -0
  276. package/lib/commonjs/components/gamma/stack/screen/index.js.map +1 -0
  277. package/lib/commonjs/components/helpers/PlatformUtils.js +9 -0
  278. package/lib/commonjs/components/helpers/PlatformUtils.js.map +1 -0
  279. package/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js +4 -3
  280. package/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js.map +1 -1
  281. package/lib/commonjs/components/safe-area/SafeAreaView.js +1 -2
  282. package/lib/commonjs/components/safe-area/SafeAreaView.js.map +1 -1
  283. package/lib/commonjs/components/safe-area/SafeAreaView.web.js +2 -3
  284. package/lib/commonjs/components/safe-area/SafeAreaView.web.js.map +1 -1
  285. package/lib/commonjs/components/safe-area/index.js +13 -0
  286. package/lib/commonjs/components/safe-area/index.js.map +1 -0
  287. package/lib/commonjs/components/tabs/{TabsAccessory.js → bottom-accessory/TabsBottomAccessory.js} +4 -4
  288. package/lib/commonjs/components/tabs/bottom-accessory/TabsBottomAccessory.js.map +1 -0
  289. package/lib/commonjs/components/tabs/bottom-accessory/TabsBottomAccessory.types.js +6 -0
  290. package/lib/commonjs/components/tabs/bottom-accessory/TabsBottomAccessory.types.js.map +1 -0
  291. package/lib/commonjs/components/tabs/{TabsAccessoryContent.js → bottom-accessory/TabsBottomAccessoryContent.js} +4 -4
  292. package/lib/commonjs/components/tabs/bottom-accessory/TabsBottomAccessoryContent.js.map +1 -0
  293. package/lib/commonjs/components/tabs/bottom-accessory/TabsBottomAccessoryContent.types.js +6 -0
  294. package/lib/commonjs/components/tabs/bottom-accessory/TabsBottomAccessoryContent.types.js.map +1 -0
  295. package/lib/commonjs/components/tabs/bottom-accessory/index.js +21 -0
  296. package/lib/commonjs/components/tabs/bottom-accessory/index.js.map +1 -0
  297. package/lib/commonjs/components/tabs/host/TabsHost.android.js +67 -0
  298. package/lib/commonjs/components/tabs/host/TabsHost.android.js.map +1 -0
  299. package/lib/commonjs/components/tabs/host/TabsHost.android.types.js +2 -0
  300. package/lib/commonjs/components/tabs/host/TabsHost.android.types.js.map +1 -0
  301. package/lib/commonjs/components/tabs/host/TabsHost.d.js +2 -0
  302. package/lib/commonjs/components/tabs/host/TabsHost.d.js.map +1 -0
  303. package/lib/commonjs/components/tabs/{TabsHost.js → host/TabsHost.ios.js} +42 -31
  304. package/lib/commonjs/components/tabs/host/TabsHost.ios.js.map +1 -0
  305. package/lib/commonjs/components/tabs/host/TabsHost.ios.types.js +6 -0
  306. package/lib/commonjs/components/tabs/host/TabsHost.ios.types.js.map +1 -0
  307. package/lib/commonjs/components/tabs/host/TabsHost.types.js.map +1 -0
  308. package/lib/commonjs/components/tabs/host/TabsHost.web.js.map +1 -0
  309. package/lib/commonjs/components/tabs/host/index.js +14 -0
  310. package/lib/commonjs/components/tabs/host/index.js.map +1 -0
  311. package/lib/commonjs/components/tabs/host/useTabsHost.js +31 -0
  312. package/lib/commonjs/components/tabs/host/useTabsHost.js.map +1 -0
  313. package/lib/commonjs/components/tabs/index.js +6 -8
  314. package/lib/commonjs/components/tabs/index.js.map +1 -1
  315. package/lib/commonjs/components/tabs/screen/TabsScreen.android.js +143 -0
  316. package/lib/commonjs/components/tabs/screen/TabsScreen.android.js.map +1 -0
  317. package/lib/commonjs/components/tabs/screen/TabsScreen.android.types.js +6 -0
  318. package/lib/commonjs/components/tabs/screen/TabsScreen.android.types.js.map +1 -0
  319. package/lib/commonjs/components/tabs/screen/TabsScreen.d.js +2 -0
  320. package/lib/commonjs/components/tabs/screen/TabsScreen.d.js.map +1 -0
  321. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js +165 -0
  322. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js.map +1 -0
  323. package/lib/commonjs/components/tabs/{TabsAccessory.types.js → screen/TabsScreen.ios.types.js} +1 -1
  324. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.types.js.map +1 -0
  325. package/lib/commonjs/components/tabs/screen/TabsScreen.types.js.map +1 -0
  326. package/lib/commonjs/components/tabs/screen/TabsScreen.web.js.map +1 -0
  327. package/lib/commonjs/components/tabs/screen/index.js +14 -0
  328. package/lib/commonjs/components/tabs/screen/index.js.map +1 -0
  329. package/lib/commonjs/components/tabs/screen/useTabsScreen.js +54 -0
  330. package/lib/commonjs/components/tabs/screen/useTabsScreen.js.map +1 -0
  331. package/lib/commonjs/experimental/index.js +41 -19
  332. package/lib/commonjs/experimental/index.js.map +1 -1
  333. package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
  334. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  335. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  336. package/lib/commonjs/fabric/ScreenStackNativeComponent.js.map +1 -1
  337. package/lib/commonjs/fabric/SearchBarNativeComponent.js.map +1 -1
  338. package/lib/commonjs/fabric/gamma/ScrollViewMarkerNativeComponent.js +10 -0
  339. package/lib/commonjs/fabric/gamma/ScrollViewMarkerNativeComponent.js.map +1 -0
  340. package/lib/commonjs/fabric/gamma/{SplitViewHostNativeComponent.js → split/SplitHostNativeComponent.js} +2 -2
  341. package/lib/commonjs/fabric/gamma/split/SplitHostNativeComponent.js.map +1 -0
  342. package/lib/commonjs/fabric/gamma/{SplitViewScreenNativeComponent.js → split/SplitScreenNativeComponent.js} +2 -2
  343. package/lib/commonjs/fabric/gamma/split/SplitScreenNativeComponent.js.map +1 -0
  344. package/lib/commonjs/fabric/gamma/stack/StackHeaderConfigAndroidNativeComponent.js +13 -0
  345. package/lib/commonjs/fabric/gamma/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -0
  346. package/lib/commonjs/fabric/gamma/stack/StackHeaderConfigIOSNativeComponent.js +13 -0
  347. package/lib/commonjs/fabric/gamma/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -0
  348. package/lib/commonjs/fabric/gamma/stack/StackHeaderSubviewAndroidNativeComponent.js +13 -0
  349. package/lib/commonjs/fabric/gamma/stack/StackHeaderSubviewAndroidNativeComponent.js.map +1 -0
  350. package/lib/commonjs/fabric/gamma/stack/StackScreenNativeComponent.js +3 -1
  351. package/lib/commonjs/fabric/gamma/stack/StackScreenNativeComponent.js.map +1 -1
  352. package/lib/commonjs/fabric/safe-area/SafeAreaViewNativeComponent.js.map +1 -1
  353. package/lib/commonjs/fabric/tabs/TabsBottomAccessoryNativeComponent.js +2 -1
  354. package/lib/commonjs/fabric/tabs/TabsBottomAccessoryNativeComponent.js.map +1 -1
  355. package/lib/commonjs/fabric/tabs/TabsHostAndroidNativeComponent.js +18 -0
  356. package/lib/commonjs/fabric/tabs/TabsHostAndroidNativeComponent.js.map +1 -0
  357. package/lib/commonjs/fabric/tabs/TabsHostIOSNativeComponent.js +17 -0
  358. package/lib/commonjs/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -0
  359. package/lib/commonjs/fabric/tabs/TabsScreenAndroidNativeComponent.js +17 -0
  360. package/lib/commonjs/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -0
  361. package/lib/commonjs/fabric/tabs/{TabsScreenNativeComponent.js → TabsScreenIOSNativeComponent.js} +9 -3
  362. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -0
  363. package/lib/commonjs/flags.js +71 -12
  364. package/lib/commonjs/flags.js.map +1 -1
  365. package/lib/commonjs/index.js +13 -21
  366. package/lib/commonjs/index.js.map +1 -1
  367. package/lib/commonjs/private/hooks/useRenderDebugInfo.js +2 -1
  368. package/lib/commonjs/private/hooks/useRenderDebugInfo.js.map +1 -1
  369. package/lib/commonjs/private/index.js +2 -8
  370. package/lib/commonjs/private/index.js.map +1 -1
  371. package/lib/commonjs/private/logging.js +27 -10
  372. package/lib/commonjs/private/logging.js.map +1 -1
  373. package/lib/module/components/ScreenStack.js +4 -1
  374. package/lib/module/components/ScreenStack.js.map +1 -1
  375. package/lib/module/components/ScreenStackHeaderConfig.js +8 -1
  376. package/lib/module/components/ScreenStackHeaderConfig.js.map +1 -1
  377. package/lib/module/components/ScreenStackItem.js +18 -6
  378. package/lib/module/components/ScreenStackItem.js.map +1 -1
  379. package/lib/module/components/SearchBar.js.map +1 -1
  380. package/lib/module/components/contexts/TopInsetApplicationContext.js +24 -0
  381. package/lib/module/components/contexts/TopInsetApplicationContext.js.map +1 -0
  382. package/lib/module/components/gamma/scroll-view-marker/ScrollViewMarker.js +16 -0
  383. package/lib/module/components/gamma/scroll-view-marker/ScrollViewMarker.js.map +1 -0
  384. package/lib/module/components/gamma/scroll-view-marker/ScrollViewMarker.types.js +2 -0
  385. package/lib/module/components/gamma/scroll-view-marker/ScrollViewMarker.types.js.map +1 -0
  386. package/lib/module/components/gamma/scroll-view-marker/index.js +2 -0
  387. package/lib/module/components/gamma/scroll-view-marker/index.js.map +1 -0
  388. package/lib/module/components/gamma/split/SplitHost.js +5 -5
  389. package/lib/module/components/gamma/split/SplitHost.js.map +1 -1
  390. package/lib/module/components/gamma/split/SplitScreen.js +3 -3
  391. package/lib/module/components/gamma/split/SplitScreen.js.map +1 -1
  392. package/lib/module/components/gamma/split/index.js +1 -5
  393. package/lib/module/components/gamma/split/index.js.map +1 -1
  394. package/lib/module/components/gamma/stack/header/StackHeaderConfig.android.js +106 -0
  395. package/lib/module/components/gamma/stack/header/StackHeaderConfig.android.js.map +1 -0
  396. package/lib/module/components/gamma/stack/header/StackHeaderConfig.android.types.js +2 -0
  397. package/lib/module/components/gamma/stack/header/StackHeaderConfig.android.types.js.map +1 -0
  398. package/lib/module/components/gamma/stack/header/StackHeaderConfig.d.js +2 -0
  399. package/lib/module/components/gamma/stack/header/StackHeaderConfig.d.js.map +1 -0
  400. package/lib/module/components/gamma/stack/header/StackHeaderConfig.ios.js +21 -0
  401. package/lib/module/components/gamma/stack/header/StackHeaderConfig.ios.js.map +1 -0
  402. package/lib/module/components/gamma/stack/header/StackHeaderConfig.ios.types.js +2 -0
  403. package/lib/module/components/gamma/stack/header/StackHeaderConfig.ios.types.js.map +1 -0
  404. package/lib/module/components/gamma/stack/header/StackHeaderConfig.types.js +2 -0
  405. package/lib/module/components/gamma/stack/header/StackHeaderConfig.types.js.map +1 -0
  406. package/lib/module/components/gamma/stack/header/StackHeaderConfig.web.js +4 -0
  407. package/lib/module/components/gamma/stack/header/StackHeaderConfig.web.js.map +1 -0
  408. package/lib/module/components/gamma/stack/header/android/StackHeaderSubview.android.js +27 -0
  409. package/lib/module/components/gamma/stack/header/android/StackHeaderSubview.android.js.map +1 -0
  410. package/lib/module/components/gamma/stack/header/android/StackHeaderSubview.android.types.js +2 -0
  411. package/lib/module/components/gamma/stack/header/android/StackHeaderSubview.android.types.js.map +1 -0
  412. package/lib/module/components/gamma/stack/header/index.js +2 -0
  413. package/lib/module/components/gamma/stack/header/index.js.map +1 -0
  414. package/lib/module/components/gamma/stack/{StackHost.js → host/StackHost.js} +1 -1
  415. package/lib/module/components/gamma/stack/host/StackHost.js.map +1 -0
  416. package/lib/module/components/gamma/stack/host/StackHost.types.js.map +1 -0
  417. package/lib/module/components/gamma/stack/host/StackHost.web.js.map +1 -0
  418. package/lib/module/components/gamma/stack/host/index.js +2 -0
  419. package/lib/module/components/gamma/stack/host/index.js.map +1 -0
  420. package/lib/module/components/gamma/stack/index.js +6 -8
  421. package/lib/module/components/gamma/stack/index.js.map +1 -1
  422. package/lib/module/components/gamma/stack/{StackScreen.js → screen/StackScreen.js} +2 -2
  423. package/lib/module/components/gamma/stack/screen/StackScreen.js.map +1 -0
  424. package/lib/module/components/gamma/stack/screen/StackScreen.types.js.map +1 -0
  425. package/lib/module/components/gamma/stack/screen/StackScreen.web.js.map +1 -0
  426. package/lib/module/components/gamma/stack/screen/index.js +2 -0
  427. package/lib/module/components/gamma/stack/screen/index.js.map +1 -0
  428. package/lib/module/components/helpers/PlatformUtils.js +3 -0
  429. package/lib/module/components/helpers/PlatformUtils.js.map +1 -0
  430. package/lib/module/components/helpers/prepareHeaderBarButtonItems.js +4 -3
  431. package/lib/module/components/helpers/prepareHeaderBarButtonItems.js.map +1 -1
  432. package/lib/module/components/safe-area/SafeAreaView.js +1 -2
  433. package/lib/module/components/safe-area/SafeAreaView.js.map +1 -1
  434. package/lib/module/components/safe-area/SafeAreaView.web.js +1 -1
  435. package/lib/module/components/safe-area/SafeAreaView.web.js.map +1 -1
  436. package/lib/module/components/safe-area/index.js +2 -0
  437. package/lib/module/components/safe-area/index.js.map +1 -0
  438. package/lib/module/components/tabs/{TabsAccessory.js → bottom-accessory/TabsBottomAccessory.js} +3 -3
  439. package/lib/module/components/tabs/bottom-accessory/TabsBottomAccessory.js.map +1 -0
  440. package/lib/module/components/tabs/bottom-accessory/TabsBottomAccessory.types.js +2 -0
  441. package/lib/module/components/tabs/bottom-accessory/TabsBottomAccessory.types.js.map +1 -0
  442. package/lib/module/components/tabs/{TabsAccessoryContent.js → bottom-accessory/TabsBottomAccessoryContent.js} +3 -3
  443. package/lib/module/components/tabs/bottom-accessory/TabsBottomAccessoryContent.js.map +1 -0
  444. package/lib/module/components/tabs/bottom-accessory/TabsBottomAccessoryContent.types.js +2 -0
  445. package/lib/module/components/tabs/bottom-accessory/TabsBottomAccessoryContent.types.js.map +1 -0
  446. package/lib/module/components/tabs/bottom-accessory/index.js +3 -0
  447. package/lib/module/components/tabs/bottom-accessory/index.js.map +1 -0
  448. package/lib/module/components/tabs/host/TabsHost.android.js +62 -0
  449. package/lib/module/components/tabs/host/TabsHost.android.js.map +1 -0
  450. package/lib/module/components/tabs/host/TabsHost.android.types.js +2 -0
  451. package/lib/module/components/tabs/host/TabsHost.android.types.js.map +1 -0
  452. package/lib/module/components/tabs/host/TabsHost.d.js +2 -0
  453. package/lib/module/components/tabs/host/TabsHost.d.js.map +1 -0
  454. package/lib/module/components/tabs/host/TabsHost.ios.js +75 -0
  455. package/lib/module/components/tabs/host/TabsHost.ios.js.map +1 -0
  456. package/lib/module/components/tabs/host/TabsHost.ios.types.js +2 -0
  457. package/lib/module/components/tabs/host/TabsHost.ios.types.js.map +1 -0
  458. package/lib/module/components/tabs/host/TabsHost.types.js.map +1 -0
  459. package/lib/module/components/tabs/host/TabsHost.web.js.map +1 -0
  460. package/lib/module/components/tabs/host/index.js +2 -0
  461. package/lib/module/components/tabs/host/index.js.map +1 -0
  462. package/lib/module/components/tabs/host/useTabsHost.js +24 -0
  463. package/lib/module/components/tabs/host/useTabsHost.js.map +1 -0
  464. package/lib/module/components/tabs/index.js +3 -4
  465. package/lib/module/components/tabs/index.js.map +1 -1
  466. package/lib/module/components/tabs/screen/TabsScreen.android.js +138 -0
  467. package/lib/module/components/tabs/screen/TabsScreen.android.js.map +1 -0
  468. package/lib/module/components/tabs/screen/TabsScreen.android.types.js +2 -0
  469. package/lib/module/components/tabs/screen/TabsScreen.android.types.js.map +1 -0
  470. package/lib/module/components/tabs/screen/TabsScreen.d.js +2 -0
  471. package/lib/module/components/tabs/screen/TabsScreen.d.js.map +1 -0
  472. package/lib/module/components/tabs/screen/TabsScreen.ios.js +160 -0
  473. package/lib/module/components/tabs/screen/TabsScreen.ios.js.map +1 -0
  474. package/lib/module/components/tabs/screen/TabsScreen.ios.types.js +2 -0
  475. package/lib/module/components/tabs/screen/TabsScreen.ios.types.js.map +1 -0
  476. package/lib/module/components/tabs/screen/TabsScreen.types.js.map +1 -0
  477. package/lib/module/components/tabs/screen/TabsScreen.web.js.map +1 -0
  478. package/lib/module/components/tabs/screen/index.js +2 -0
  479. package/lib/module/components/tabs/screen/index.js.map +1 -0
  480. package/lib/module/components/tabs/screen/useTabsScreen.js +47 -0
  481. package/lib/module/components/tabs/screen/useTabsScreen.js.map +1 -0
  482. package/lib/module/experimental/index.js +5 -6
  483. package/lib/module/experimental/index.js.map +1 -1
  484. package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
  485. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  486. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  487. package/lib/module/fabric/ScreenStackNativeComponent.js.map +1 -1
  488. package/lib/module/fabric/SearchBarNativeComponent.js.map +1 -1
  489. package/lib/module/fabric/gamma/ScrollViewMarkerNativeComponent.js +5 -0
  490. package/lib/module/fabric/gamma/ScrollViewMarkerNativeComponent.js.map +1 -0
  491. package/lib/module/fabric/gamma/{SplitViewHostNativeComponent.js → split/SplitHostNativeComponent.js} +2 -2
  492. package/lib/module/fabric/gamma/split/SplitHostNativeComponent.js.map +1 -0
  493. package/lib/module/fabric/gamma/{SplitViewScreenNativeComponent.js → split/SplitScreenNativeComponent.js} +2 -2
  494. package/lib/module/fabric/gamma/split/SplitScreenNativeComponent.js.map +1 -0
  495. package/lib/module/fabric/gamma/stack/StackHeaderConfigAndroidNativeComponent.js +8 -0
  496. package/lib/module/fabric/gamma/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -0
  497. package/lib/module/fabric/gamma/stack/StackHeaderConfigIOSNativeComponent.js +8 -0
  498. package/lib/module/fabric/gamma/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -0
  499. package/lib/module/fabric/gamma/stack/StackHeaderSubviewAndroidNativeComponent.js +8 -0
  500. package/lib/module/fabric/gamma/stack/StackHeaderSubviewAndroidNativeComponent.js.map +1 -0
  501. package/lib/module/fabric/gamma/stack/StackScreenNativeComponent.js +3 -1
  502. package/lib/module/fabric/gamma/stack/StackScreenNativeComponent.js.map +1 -1
  503. package/lib/module/fabric/safe-area/SafeAreaViewNativeComponent.js.map +1 -1
  504. package/lib/module/fabric/tabs/TabsBottomAccessoryNativeComponent.js +2 -1
  505. package/lib/module/fabric/tabs/TabsBottomAccessoryNativeComponent.js.map +1 -1
  506. package/lib/module/fabric/tabs/TabsHostAndroidNativeComponent.js +17 -0
  507. package/lib/module/fabric/tabs/TabsHostAndroidNativeComponent.js.map +1 -0
  508. package/lib/module/fabric/tabs/TabsHostIOSNativeComponent.js +17 -0
  509. package/lib/module/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -0
  510. package/lib/module/fabric/tabs/TabsScreenAndroidNativeComponent.js +18 -0
  511. package/lib/module/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -0
  512. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js +20 -0
  513. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -0
  514. package/lib/module/flags.js +71 -12
  515. package/lib/module/flags.js.map +1 -1
  516. package/lib/module/index.js +5 -2
  517. package/lib/module/index.js.map +1 -1
  518. package/lib/module/private/hooks/useRenderDebugInfo.js +2 -1
  519. package/lib/module/private/hooks/useRenderDebugInfo.js.map +1 -1
  520. package/lib/module/private/index.js +1 -1
  521. package/lib/module/private/index.js.map +1 -1
  522. package/lib/module/private/logging.js +26 -8
  523. package/lib/module/private/logging.js.map +1 -1
  524. package/lib/typescript/components/DebugContainer.d.ts +1 -1
  525. package/lib/typescript/components/DebugContainer.d.ts.map +1 -1
  526. package/lib/typescript/components/FullWindowOverlay.d.ts +1 -1
  527. package/lib/typescript/components/FullWindowOverlay.d.ts.map +1 -1
  528. package/lib/typescript/components/ScreenFooter.d.ts +1 -1
  529. package/lib/typescript/components/ScreenFooter.d.ts.map +1 -1
  530. package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
  531. package/lib/typescript/components/ScreenStackHeaderConfig.d.ts.map +1 -1
  532. package/lib/typescript/components/ScreenStackHeaderConfig.web.d.ts +1 -1
  533. package/lib/typescript/components/ScreenStackHeaderConfig.web.d.ts.map +1 -1
  534. package/lib/typescript/components/ScreenStackItem.d.ts +2 -2
  535. package/lib/typescript/components/ScreenStackItem.d.ts.map +1 -1
  536. package/lib/typescript/components/SearchBar.d.ts.map +1 -1
  537. package/lib/typescript/components/contexts/TopInsetApplicationContext.d.ts +8 -0
  538. package/lib/typescript/components/contexts/TopInsetApplicationContext.d.ts.map +1 -0
  539. package/lib/typescript/components/gamma/scroll-view-marker/ScrollViewMarker.d.ts +4 -0
  540. package/lib/typescript/components/gamma/scroll-view-marker/ScrollViewMarker.d.ts.map +1 -0
  541. package/lib/typescript/components/gamma/scroll-view-marker/ScrollViewMarker.types.d.ts +39 -0
  542. package/lib/typescript/components/gamma/scroll-view-marker/ScrollViewMarker.types.d.ts.map +1 -0
  543. package/lib/typescript/components/gamma/scroll-view-marker/index.d.ts +3 -0
  544. package/lib/typescript/components/gamma/scroll-view-marker/index.d.ts.map +1 -0
  545. package/lib/typescript/components/gamma/split/SplitHost.types.d.ts +30 -29
  546. package/lib/typescript/components/gamma/split/SplitHost.types.d.ts.map +1 -1
  547. package/lib/typescript/components/gamma/split/SplitScreen.types.d.ts +5 -5
  548. package/lib/typescript/components/gamma/split/SplitScreen.types.d.ts.map +1 -1
  549. package/lib/typescript/components/gamma/split/index.d.ts +4 -4
  550. package/lib/typescript/components/gamma/split/index.d.ts.map +1 -1
  551. package/lib/typescript/components/gamma/stack/header/StackHeaderConfig.android.d.ts +8 -0
  552. package/lib/typescript/components/gamma/stack/header/StackHeaderConfig.android.d.ts.map +1 -0
  553. package/lib/typescript/components/gamma/stack/header/StackHeaderConfig.android.types.d.ts +208 -0
  554. package/lib/typescript/components/gamma/stack/header/StackHeaderConfig.android.types.d.ts.map +1 -0
  555. package/lib/typescript/components/gamma/stack/header/StackHeaderConfig.ios.d.ts +8 -0
  556. package/lib/typescript/components/gamma/stack/header/StackHeaderConfig.ios.d.ts.map +1 -0
  557. package/lib/typescript/components/gamma/stack/header/StackHeaderConfig.ios.types.d.ts +3 -0
  558. package/lib/typescript/components/gamma/stack/header/StackHeaderConfig.ios.types.d.ts.map +1 -0
  559. package/lib/typescript/components/gamma/stack/header/StackHeaderConfig.types.d.ts +50 -0
  560. package/lib/typescript/components/gamma/stack/header/StackHeaderConfig.types.d.ts.map +1 -0
  561. package/lib/typescript/components/gamma/stack/header/StackHeaderConfig.web.d.ts +4 -0
  562. package/lib/typescript/components/gamma/stack/header/StackHeaderConfig.web.d.ts.map +1 -0
  563. package/lib/typescript/components/gamma/stack/header/android/StackHeaderSubview.android.d.ts +8 -0
  564. package/lib/typescript/components/gamma/stack/header/android/StackHeaderSubview.android.d.ts.map +1 -0
  565. package/lib/typescript/components/gamma/stack/header/android/StackHeaderSubview.android.types.d.ts +9 -0
  566. package/lib/typescript/components/gamma/stack/header/android/StackHeaderSubview.android.types.d.ts.map +1 -0
  567. package/lib/typescript/components/gamma/stack/header/index.d.ts +5 -0
  568. package/lib/typescript/components/gamma/stack/header/index.d.ts.map +1 -0
  569. package/lib/typescript/components/gamma/stack/host/StackHost.d.ts.map +1 -0
  570. package/lib/typescript/components/gamma/stack/host/StackHost.types.d.ts +8 -0
  571. package/lib/typescript/components/gamma/stack/host/StackHost.types.d.ts.map +1 -0
  572. package/lib/typescript/components/gamma/stack/host/StackHost.web.d.ts.map +1 -0
  573. package/lib/typescript/components/gamma/stack/host/index.d.ts +3 -0
  574. package/lib/typescript/components/gamma/stack/host/index.d.ts.map +1 -0
  575. package/lib/typescript/components/gamma/stack/index.d.ts +9 -6
  576. package/lib/typescript/components/gamma/stack/index.d.ts.map +1 -1
  577. package/lib/typescript/components/gamma/stack/screen/StackScreen.d.ts.map +1 -0
  578. package/lib/typescript/components/gamma/stack/screen/StackScreen.types.d.ts +22 -0
  579. package/lib/typescript/components/gamma/stack/screen/StackScreen.types.d.ts.map +1 -0
  580. package/lib/typescript/components/gamma/stack/screen/StackScreen.web.d.ts.map +1 -0
  581. package/lib/typescript/components/gamma/stack/screen/index.d.ts +3 -0
  582. package/lib/typescript/components/gamma/stack/screen/index.d.ts.map +1 -0
  583. package/lib/typescript/components/helpers/PlatformUtils.d.ts +2 -0
  584. package/lib/typescript/components/helpers/PlatformUtils.d.ts.map +1 -0
  585. package/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts +81 -81
  586. package/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts.map +1 -1
  587. package/lib/typescript/components/safe-area/SafeAreaView.d.ts +1 -2
  588. package/lib/typescript/components/safe-area/SafeAreaView.d.ts.map +1 -1
  589. package/lib/typescript/components/safe-area/SafeAreaView.types.d.ts +2 -2
  590. package/lib/typescript/components/safe-area/SafeAreaView.types.d.ts.map +1 -1
  591. package/lib/typescript/components/safe-area/SafeAreaView.web.d.ts +1 -1
  592. package/lib/typescript/components/safe-area/SafeAreaView.web.d.ts.map +1 -1
  593. package/lib/typescript/components/safe-area/index.d.ts +3 -0
  594. package/lib/typescript/components/safe-area/index.d.ts.map +1 -0
  595. package/lib/typescript/components/shared/types.d.ts +4 -0
  596. package/lib/typescript/components/shared/types.d.ts.map +1 -1
  597. package/lib/typescript/components/tabs/bottom-accessory/TabsBottomAccessory.d.ts +7 -0
  598. package/lib/typescript/components/tabs/bottom-accessory/TabsBottomAccessory.d.ts.map +1 -0
  599. package/lib/typescript/components/tabs/bottom-accessory/TabsBottomAccessory.types.d.ts +9 -0
  600. package/lib/typescript/components/tabs/bottom-accessory/TabsBottomAccessory.types.d.ts.map +1 -0
  601. package/lib/typescript/components/tabs/bottom-accessory/TabsBottomAccessoryContent.d.ts +7 -0
  602. package/lib/typescript/components/tabs/bottom-accessory/TabsBottomAccessoryContent.d.ts.map +1 -0
  603. package/lib/typescript/components/tabs/bottom-accessory/TabsBottomAccessoryContent.types.d.ts +6 -0
  604. package/lib/typescript/components/tabs/bottom-accessory/TabsBottomAccessoryContent.types.d.ts.map +1 -0
  605. package/lib/typescript/components/tabs/bottom-accessory/index.d.ts +5 -0
  606. package/lib/typescript/components/tabs/bottom-accessory/index.d.ts.map +1 -0
  607. package/lib/typescript/components/tabs/host/TabsHost.android.d.ts +8 -0
  608. package/lib/typescript/components/tabs/host/TabsHost.android.d.ts.map +1 -0
  609. package/lib/typescript/components/tabs/host/TabsHost.android.types.d.ts +19 -0
  610. package/lib/typescript/components/tabs/host/TabsHost.android.types.d.ts.map +1 -0
  611. package/lib/typescript/components/tabs/{TabsHost.d.ts → host/TabsHost.ios.d.ts} +1 -1
  612. package/lib/typescript/components/tabs/host/TabsHost.ios.d.ts.map +1 -0
  613. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts +127 -0
  614. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts.map +1 -0
  615. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts +244 -0
  616. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts.map +1 -0
  617. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts.map +1 -0
  618. package/lib/typescript/components/tabs/host/index.d.ts +5 -0
  619. package/lib/typescript/components/tabs/host/index.d.ts.map +1 -0
  620. package/lib/typescript/components/tabs/host/useTabsHost.d.ts +15 -0
  621. package/lib/typescript/components/tabs/host/useTabsHost.d.ts.map +1 -0
  622. package/lib/typescript/components/tabs/index.d.ts +6 -7
  623. package/lib/typescript/components/tabs/index.d.ts.map +1 -1
  624. package/lib/typescript/components/tabs/screen/TabsScreen.android.d.ts +8 -0
  625. package/lib/typescript/components/tabs/screen/TabsScreen.android.d.ts.map +1 -0
  626. package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts +182 -0
  627. package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts.map +1 -0
  628. package/lib/typescript/components/tabs/{TabsScreen.d.ts → screen/TabsScreen.ios.d.ts} +1 -1
  629. package/lib/typescript/components/tabs/screen/TabsScreen.ios.d.ts.map +1 -0
  630. package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts +292 -0
  631. package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts.map +1 -0
  632. package/lib/typescript/components/tabs/screen/TabsScreen.types.d.ts +174 -0
  633. package/lib/typescript/components/tabs/screen/TabsScreen.types.d.ts.map +1 -0
  634. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts.map +1 -0
  635. package/lib/typescript/components/tabs/screen/index.d.ts +5 -0
  636. package/lib/typescript/components/tabs/screen/index.d.ts.map +1 -0
  637. package/lib/typescript/components/tabs/screen/useTabsScreen.d.ts +25 -0
  638. package/lib/typescript/components/tabs/screen/useTabsScreen.d.ts.map +1 -0
  639. package/lib/typescript/experimental/index.d.ts +4 -4
  640. package/lib/typescript/experimental/index.d.ts.map +1 -1
  641. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +32 -27
  642. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
  643. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +27 -27
  644. package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
  645. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts +32 -30
  646. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -1
  647. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts +1 -1
  648. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  649. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts +4 -2
  650. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts.map +1 -1
  651. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts +18 -18
  652. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts.map +1 -1
  653. package/lib/typescript/fabric/gamma/ScrollViewMarkerNativeComponent.d.ts +11 -0
  654. package/lib/typescript/fabric/gamma/ScrollViewMarkerNativeComponent.d.ts.map +1 -0
  655. package/lib/typescript/fabric/gamma/{SplitViewHostNativeComponent.d.ts → split/SplitHostNativeComponent.d.ts} +6 -6
  656. package/lib/typescript/fabric/gamma/split/SplitHostNativeComponent.d.ts.map +1 -0
  657. package/lib/typescript/fabric/gamma/split/SplitScreenNativeComponent.d.ts +13 -0
  658. package/lib/typescript/fabric/gamma/split/SplitScreenNativeComponent.d.ts.map +1 -0
  659. package/lib/typescript/fabric/gamma/stack/StackHeaderConfigAndroidNativeComponent.d.ts +20 -0
  660. package/lib/typescript/fabric/gamma/stack/StackHeaderConfigAndroidNativeComponent.d.ts.map +1 -0
  661. package/lib/typescript/fabric/gamma/stack/StackHeaderConfigIOSNativeComponent.d.ts +10 -0
  662. package/lib/typescript/fabric/gamma/stack/StackHeaderConfigIOSNativeComponent.d.ts.map +1 -0
  663. package/lib/typescript/fabric/gamma/stack/StackHeaderSubviewAndroidNativeComponent.d.ts +10 -0
  664. package/lib/typescript/fabric/gamma/stack/StackHeaderSubviewAndroidNativeComponent.d.ts.map +1 -0
  665. package/lib/typescript/fabric/gamma/stack/StackScreenNativeComponent.d.ts +6 -6
  666. package/lib/typescript/fabric/gamma/stack/StackScreenNativeComponent.d.ts.map +1 -1
  667. package/lib/typescript/fabric/safe-area/SafeAreaViewNativeComponent.d.ts +1 -1
  668. package/lib/typescript/fabric/safe-area/SafeAreaViewNativeComponent.d.ts.map +1 -1
  669. package/lib/typescript/fabric/tabs/TabsBottomAccessoryNativeComponent.d.ts +1 -1
  670. package/lib/typescript/fabric/tabs/TabsBottomAccessoryNativeComponent.d.ts.map +1 -1
  671. package/lib/typescript/fabric/tabs/TabsHostAndroidNativeComponent.d.ts +39 -0
  672. package/lib/typescript/fabric/tabs/TabsHostAndroidNativeComponent.d.ts.map +1 -0
  673. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts +50 -0
  674. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts.map +1 -0
  675. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts +51 -0
  676. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts.map +1 -0
  677. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts +68 -0
  678. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts.map +1 -0
  679. package/lib/typescript/flags.d.ts +31 -2
  680. package/lib/typescript/flags.d.ts.map +1 -1
  681. package/lib/typescript/index.d.ts +3 -2
  682. package/lib/typescript/index.d.ts.map +1 -1
  683. package/lib/typescript/private/hooks/useRenderDebugInfo.d.ts.map +1 -1
  684. package/lib/typescript/private/index.d.ts +1 -1
  685. package/lib/typescript/private/index.d.ts.map +1 -1
  686. package/lib/typescript/private/logging.d.ts +6 -2
  687. package/lib/typescript/private/logging.d.ts.map +1 -1
  688. package/lib/typescript/types.d.ts +209 -188
  689. package/lib/typescript/types.d.ts.map +1 -1
  690. package/package.json +21 -21
  691. package/react-native.config.js +4 -1
  692. package/src/components/DebugContainer.tsx +1 -1
  693. package/src/components/FullWindowOverlay.tsx +1 -1
  694. package/src/components/ScreenFooter.tsx +1 -1
  695. package/src/components/ScreenStack.tsx +5 -0
  696. package/src/components/ScreenStackHeaderConfig.tsx +8 -0
  697. package/src/components/ScreenStackHeaderConfig.web.tsx +1 -1
  698. package/src/components/ScreenStackItem.tsx +38 -26
  699. package/src/components/SearchBar.tsx +3 -1
  700. package/src/components/contexts/TopInsetApplicationContext.ts +27 -0
  701. package/src/components/gamma/scroll-view-marker/ScrollViewMarker.tsx +17 -0
  702. package/src/components/gamma/scroll-view-marker/ScrollViewMarker.types.ts +42 -0
  703. package/src/components/gamma/scroll-view-marker/index.ts +3 -0
  704. package/src/components/gamma/split/SplitHost.tsx +9 -9
  705. package/src/components/gamma/split/SplitHost.types.ts +36 -40
  706. package/src/components/gamma/split/SplitScreen.tsx +5 -5
  707. package/src/components/gamma/split/SplitScreen.types.ts +13 -5
  708. package/src/components/gamma/split/index.ts +19 -5
  709. package/src/components/gamma/stack/header/StackHeaderConfig.android.tsx +166 -0
  710. package/src/components/gamma/stack/header/StackHeaderConfig.android.types.ts +213 -0
  711. package/src/components/gamma/stack/header/StackHeaderConfig.d.ts +17 -0
  712. package/src/components/gamma/stack/header/StackHeaderConfig.ios.tsx +18 -0
  713. package/src/components/gamma/stack/header/StackHeaderConfig.ios.types.ts +2 -0
  714. package/src/components/gamma/stack/header/StackHeaderConfig.types.ts +51 -0
  715. package/src/components/gamma/stack/header/StackHeaderConfig.web.tsx +5 -0
  716. package/src/components/gamma/stack/header/android/StackHeaderSubview.android.tsx +33 -0
  717. package/src/components/gamma/stack/header/android/StackHeaderSubview.android.types.ts +16 -0
  718. package/src/components/gamma/stack/header/index.ts +6 -0
  719. package/src/components/gamma/stack/{StackHost.tsx → host/StackHost.tsx} +1 -1
  720. package/src/components/gamma/stack/host/StackHost.types.ts +13 -0
  721. package/src/components/gamma/stack/host/index.ts +3 -0
  722. package/src/components/gamma/stack/index.ts +28 -7
  723. package/src/components/gamma/stack/{StackScreen.tsx → screen/StackScreen.tsx} +2 -2
  724. package/src/components/gamma/stack/{StackScreen.types.ts → screen/StackScreen.types.ts} +9 -9
  725. package/src/components/gamma/stack/screen/index.ts +3 -0
  726. package/src/components/helpers/PlatformUtils.ts +4 -0
  727. package/src/components/helpers/prepareHeaderBarButtonItems.ts +4 -2
  728. package/src/components/safe-area/SafeAreaView.tsx +1 -3
  729. package/src/components/safe-area/SafeAreaView.types.ts +2 -2
  730. package/src/components/safe-area/SafeAreaView.web.tsx +1 -1
  731. package/src/components/safe-area/index.ts +3 -0
  732. package/src/components/shared/types.ts +37 -0
  733. package/src/components/tabs/{TabsAccessory.tsx → bottom-accessory/TabsBottomAccessory.tsx} +3 -3
  734. package/src/components/tabs/bottom-accessory/TabsBottomAccessory.types.ts +15 -0
  735. package/src/components/tabs/bottom-accessory/TabsBottomAccessoryContent.tsx +19 -0
  736. package/src/components/tabs/bottom-accessory/TabsBottomAccessoryContent.types.ts +6 -0
  737. package/src/components/tabs/bottom-accessory/index.ts +5 -0
  738. package/src/components/tabs/host/TabsHost.android.tsx +65 -0
  739. package/src/components/tabs/host/TabsHost.android.types.ts +18 -0
  740. package/src/components/tabs/host/TabsHost.d.ts +15 -0
  741. package/src/components/tabs/host/TabsHost.ios.tsx +94 -0
  742. package/src/components/tabs/host/TabsHost.ios.types.ts +139 -0
  743. package/src/components/tabs/host/TabsHost.types.ts +274 -0
  744. package/src/components/tabs/host/index.ts +6 -0
  745. package/src/components/tabs/host/useTabsHost.ts +49 -0
  746. package/src/components/tabs/index.ts +43 -8
  747. package/src/components/tabs/screen/TabsScreen.android.tsx +198 -0
  748. package/src/components/tabs/screen/TabsScreen.android.types.ts +189 -0
  749. package/src/components/tabs/screen/TabsScreen.d.ts +15 -0
  750. package/src/components/tabs/screen/TabsScreen.ios.tsx +235 -0
  751. package/src/components/tabs/screen/TabsScreen.ios.types.ts +312 -0
  752. package/src/components/tabs/screen/TabsScreen.types.ts +202 -0
  753. package/src/components/tabs/screen/index.ts +6 -0
  754. package/src/components/tabs/screen/useTabsScreen.ts +97 -0
  755. package/src/experimental/index.ts +5 -8
  756. package/src/fabric/ModalScreenNativeComponent.ts +41 -27
  757. package/src/fabric/ScreenNativeComponent.ts +35 -27
  758. package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +36 -30
  759. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +1 -1
  760. package/src/fabric/ScreenStackNativeComponent.ts +7 -2
  761. package/src/fabric/SearchBarNativeComponent.ts +24 -18
  762. package/src/fabric/gamma/ScrollViewMarkerNativeComponent.ts +15 -0
  763. package/src/fabric/gamma/{SplitViewHostNativeComponent.ts → split/SplitHostNativeComponent.ts} +8 -6
  764. package/src/fabric/gamma/split/SplitScreenNativeComponent.ts +24 -0
  765. package/src/fabric/gamma/stack/StackHeaderConfigAndroidNativeComponent.ts +39 -0
  766. package/src/fabric/gamma/stack/StackHeaderConfigIOSNativeComponent.ts +18 -0
  767. package/src/fabric/gamma/stack/StackHeaderSubviewAndroidNativeComponent.ts +27 -0
  768. package/src/fabric/gamma/stack/StackScreenNativeComponent.ts +11 -7
  769. package/src/fabric/safe-area/SafeAreaViewNativeComponent.ts +8 -6
  770. package/src/fabric/tabs/TabsBottomAccessoryNativeComponent.ts +4 -1
  771. package/src/fabric/tabs/TabsHostAndroidNativeComponent.ts +69 -0
  772. package/src/fabric/tabs/TabsHostIOSNativeComponent.ts +91 -0
  773. package/src/fabric/tabs/TabsScreenAndroidNativeComponent.ts +112 -0
  774. package/src/fabric/tabs/TabsScreenIOSNativeComponent.ts +171 -0
  775. package/src/flags.ts +94 -14
  776. package/src/index.tsx +6 -2
  777. package/src/private/hooks/useRenderDebugInfo.tsx +2 -1
  778. package/src/private/index.ts +1 -4
  779. package/src/private/logging.ts +27 -12
  780. package/src/types.tsx +262 -231
  781. package/android/src/main/java/com/swmansion/rnscreens/CustomAppBarLayout.kt +0 -25
  782. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigShadowNode.kt +0 -28
  783. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +0 -24
  784. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHost.kt +0 -566
  785. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostAppearanceCoordinator.kt +0 -46
  786. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostEventEmitter.kt +0 -26
  787. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostViewManager.kt +0 -222
  788. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsScreenViewManager.kt +0 -246
  789. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabsHostNativeFocusChangeEvent.kt +0 -47
  790. package/android/src/main/java/com/swmansion/rnscreens/safearea/paper/SafeAreaViewLocalData.kt +0 -10
  791. package/android/src/main/java/com/swmansion/rnscreens/safearea/paper/SafeAreaViewShadowNode.kt +0 -124
  792. package/android/src/main/java/com/swmansion/rnscreens/utils/PaddingBundle.kt +0 -9
  793. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSafeAreaViewManagerDelegate.java +0 -37
  794. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSafeAreaViewManagerInterface.java +0 -20
  795. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerDelegate.java +0 -27
  796. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java +0 -17
  797. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerDelegate.java +0 -27
  798. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java +0 -17
  799. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerDelegate.java +0 -27
  800. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java +0 -17
  801. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +0 -156
  802. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +0 -60
  803. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +0 -128
  804. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +0 -50
  805. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java +0 -39
  806. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +0 -20
  807. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java +0 -33
  808. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java +0 -17
  809. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerDelegate.java +0 -107
  810. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java +0 -40
  811. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSStackHostManagerDelegate.java +0 -27
  812. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSStackHostManagerInterface.java +0 -17
  813. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSStackScreenManagerDelegate.java +0 -39
  814. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSStackScreenManagerInterface.java +0 -20
  815. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSTabsHostManagerDelegate.java +0 -91
  816. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSTabsHostManagerInterface.java +0 -37
  817. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSTabsScreenManagerDelegate.java +0 -114
  818. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSTabsScreenManagerInterface.java +0 -46
  819. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +0 -56
  820. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledHeaderSubviewViewGroup.kt +0 -19
  821. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +0 -19
  822. package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +0 -23
  823. package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +0 -35
  824. package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenComponentDescriptor.h +0 -40
  825. package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenShadowNode.cpp +0 -13
  826. package/ios/RNSInvalidatedComponentsRegistry.h +0 -15
  827. package/ios/RNSInvalidatedComponentsRegistry.mm +0 -34
  828. package/ios/RNSViewControllerInvalidating.h +0 -15
  829. package/ios/RNSViewControllerInvalidator.h +0 -17
  830. package/ios/RNSViewControllerInvalidator.mm +0 -23
  831. package/ios/gamma/split-view/RNSSplitViewAppearanceApplicator.swift +0 -194
  832. package/ios/gamma/split-view/RNSSplitViewAppearanceCoordinator.swift +0 -26
  833. package/ios/gamma/split-view/RNSSplitViewAppearanceUpdateFlags.swift +0 -11
  834. package/ios/gamma/split-view/RNSSplitViewHostComponentViewManager.mm +0 -7
  835. package/ios/gamma/split-view/RNSSplitViewScreenComponentViewManager.mm +0 -7
  836. package/ios/gamma/split-view/RNSSplitViewScreenController.swift +0 -133
  837. package/ios/gamma/stack/host/RNSStackController.swift +0 -65
  838. package/ios/gamma/stack/screen/RNSStackScreenController.swift +0 -64
  839. package/ios/safe-area/paper/RNSSafeAreaViewEdges.h +0 -16
  840. package/ios/safe-area/paper/RNSSafeAreaViewEdges.mm +0 -37
  841. package/ios/safe-area/paper/RNSSafeAreaViewLocalData.h +0 -22
  842. package/ios/safe-area/paper/RNSSafeAreaViewLocalData.mm +0 -20
  843. package/ios/safe-area/paper/RNSSafeAreaViewManager.h +0 -16
  844. package/ios/safe-area/paper/RNSSafeAreaViewManager.mm +0 -28
  845. package/ios/safe-area/paper/RNSSafeAreaViewShadowView.h +0 -16
  846. package/ios/safe-area/paper/RNSSafeAreaViewShadowView.mm +0 -152
  847. package/ios/tabs/host/RNSTabBarControllerDelegate.h +0 -11
  848. package/ios/tabs/host/RNSTabBarControllerDelegate.mm +0 -87
  849. package/lib/commonjs/components/gamma/stack/StackHost.js.map +0 -1
  850. package/lib/commonjs/components/gamma/stack/StackHost.types.js.map +0 -1
  851. package/lib/commonjs/components/gamma/stack/StackHost.web.js.map +0 -1
  852. package/lib/commonjs/components/gamma/stack/StackScreen.js.map +0 -1
  853. package/lib/commonjs/components/gamma/stack/StackScreen.types.js.map +0 -1
  854. package/lib/commonjs/components/gamma/stack/StackScreen.web.js.map +0 -1
  855. package/lib/commonjs/components/tabs/TabsAccessory.js.map +0 -1
  856. package/lib/commonjs/components/tabs/TabsAccessory.types.js.map +0 -1
  857. package/lib/commonjs/components/tabs/TabsAccessoryContent.js.map +0 -1
  858. package/lib/commonjs/components/tabs/TabsAccessoryContent.types.js.map +0 -1
  859. package/lib/commonjs/components/tabs/TabsHost.js.map +0 -1
  860. package/lib/commonjs/components/tabs/TabsHost.types.js.map +0 -1
  861. package/lib/commonjs/components/tabs/TabsHost.web.js.map +0 -1
  862. package/lib/commonjs/components/tabs/TabsScreen.js +0 -257
  863. package/lib/commonjs/components/tabs/TabsScreen.js.map +0 -1
  864. package/lib/commonjs/components/tabs/TabsScreen.types.js.map +0 -1
  865. package/lib/commonjs/components/tabs/TabsScreen.web.js.map +0 -1
  866. package/lib/commonjs/experimental/types.js +0 -61
  867. package/lib/commonjs/experimental/types.js.map +0 -1
  868. package/lib/commonjs/fabric/gamma/SplitViewHostNativeComponent.js.map +0 -1
  869. package/lib/commonjs/fabric/gamma/SplitViewScreenNativeComponent.js.map +0 -1
  870. package/lib/commonjs/fabric/tabs/TabsHostNativeComponent.js +0 -18
  871. package/lib/commonjs/fabric/tabs/TabsHostNativeComponent.js.map +0 -1
  872. package/lib/commonjs/fabric/tabs/TabsScreenNativeComponent.js.map +0 -1
  873. package/lib/module/components/gamma/stack/StackHost.js.map +0 -1
  874. package/lib/module/components/gamma/stack/StackHost.types.js.map +0 -1
  875. package/lib/module/components/gamma/stack/StackHost.web.js.map +0 -1
  876. package/lib/module/components/gamma/stack/StackScreen.js.map +0 -1
  877. package/lib/module/components/gamma/stack/StackScreen.types.js.map +0 -1
  878. package/lib/module/components/gamma/stack/StackScreen.web.js.map +0 -1
  879. package/lib/module/components/tabs/TabsAccessory.js.map +0 -1
  880. package/lib/module/components/tabs/TabsAccessory.types.js +0 -2
  881. package/lib/module/components/tabs/TabsAccessory.types.js.map +0 -1
  882. package/lib/module/components/tabs/TabsAccessoryContent.js.map +0 -1
  883. package/lib/module/components/tabs/TabsAccessoryContent.types.js +0 -2
  884. package/lib/module/components/tabs/TabsAccessoryContent.types.js.map +0 -1
  885. package/lib/module/components/tabs/TabsHost.js +0 -64
  886. package/lib/module/components/tabs/TabsHost.js.map +0 -1
  887. package/lib/module/components/tabs/TabsHost.types.js.map +0 -1
  888. package/lib/module/components/tabs/TabsHost.web.js.map +0 -1
  889. package/lib/module/components/tabs/TabsScreen.js +0 -251
  890. package/lib/module/components/tabs/TabsScreen.js.map +0 -1
  891. package/lib/module/components/tabs/TabsScreen.types.js.map +0 -1
  892. package/lib/module/components/tabs/TabsScreen.web.js.map +0 -1
  893. package/lib/module/experimental/types.js +0 -11
  894. package/lib/module/experimental/types.js.map +0 -1
  895. package/lib/module/fabric/gamma/SplitViewHostNativeComponent.js.map +0 -1
  896. package/lib/module/fabric/gamma/SplitViewScreenNativeComponent.js.map +0 -1
  897. package/lib/module/fabric/tabs/TabsHostNativeComponent.js +0 -15
  898. package/lib/module/fabric/tabs/TabsHostNativeComponent.js.map +0 -1
  899. package/lib/module/fabric/tabs/TabsScreenNativeComponent.js +0 -10
  900. package/lib/module/fabric/tabs/TabsScreenNativeComponent.js.map +0 -1
  901. package/lib/typescript/components/gamma/stack/StackHost.d.ts.map +0 -1
  902. package/lib/typescript/components/gamma/stack/StackHost.types.d.ts +0 -8
  903. package/lib/typescript/components/gamma/stack/StackHost.types.d.ts.map +0 -1
  904. package/lib/typescript/components/gamma/stack/StackHost.web.d.ts.map +0 -1
  905. package/lib/typescript/components/gamma/stack/StackScreen.d.ts.map +0 -1
  906. package/lib/typescript/components/gamma/stack/StackScreen.types.d.ts +0 -22
  907. package/lib/typescript/components/gamma/stack/StackScreen.types.d.ts.map +0 -1
  908. package/lib/typescript/components/gamma/stack/StackScreen.web.d.ts.map +0 -1
  909. package/lib/typescript/components/tabs/TabsAccessory.d.ts +0 -7
  910. package/lib/typescript/components/tabs/TabsAccessory.d.ts.map +0 -1
  911. package/lib/typescript/components/tabs/TabsAccessory.types.d.ts +0 -9
  912. package/lib/typescript/components/tabs/TabsAccessory.types.d.ts.map +0 -1
  913. package/lib/typescript/components/tabs/TabsAccessoryContent.d.ts +0 -7
  914. package/lib/typescript/components/tabs/TabsAccessoryContent.d.ts.map +0 -1
  915. package/lib/typescript/components/tabs/TabsAccessoryContent.types.d.ts +0 -6
  916. package/lib/typescript/components/tabs/TabsAccessoryContent.types.d.ts.map +0 -1
  917. package/lib/typescript/components/tabs/TabsHost.d.ts.map +0 -1
  918. package/lib/typescript/components/tabs/TabsHost.types.d.ts +0 -257
  919. package/lib/typescript/components/tabs/TabsHost.types.d.ts.map +0 -1
  920. package/lib/typescript/components/tabs/TabsHost.web.d.ts.map +0 -1
  921. package/lib/typescript/components/tabs/TabsScreen.d.ts.map +0 -1
  922. package/lib/typescript/components/tabs/TabsScreen.types.d.ts +0 -536
  923. package/lib/typescript/components/tabs/TabsScreen.types.d.ts.map +0 -1
  924. package/lib/typescript/components/tabs/TabsScreen.web.d.ts.map +0 -1
  925. package/lib/typescript/experimental/types.d.ts +0 -10
  926. package/lib/typescript/experimental/types.d.ts.map +0 -1
  927. package/lib/typescript/fabric/gamma/SplitViewHostNativeComponent.d.ts.map +0 -1
  928. package/lib/typescript/fabric/gamma/SplitViewScreenNativeComponent.d.ts +0 -13
  929. package/lib/typescript/fabric/gamma/SplitViewScreenNativeComponent.d.ts.map +0 -1
  930. package/lib/typescript/fabric/tabs/TabsHostNativeComponent.d.ts +0 -34
  931. package/lib/typescript/fabric/tabs/TabsHostNativeComponent.d.ts.map +0 -1
  932. package/lib/typescript/fabric/tabs/TabsScreenNativeComponent.d.ts +0 -82
  933. package/lib/typescript/fabric/tabs/TabsScreenNativeComponent.d.ts.map +0 -1
  934. package/src/components/gamma/stack/StackHost.types.ts +0 -10
  935. package/src/components/tabs/TabsAccessory.types.ts +0 -13
  936. package/src/components/tabs/TabsAccessoryContent.tsx +0 -17
  937. package/src/components/tabs/TabsAccessoryContent.types.ts +0 -6
  938. package/src/components/tabs/TabsHost.tsx +0 -105
  939. package/src/components/tabs/TabsHost.types.ts +0 -297
  940. package/src/components/tabs/TabsScreen.tsx +0 -382
  941. package/src/components/tabs/TabsScreen.types.ts +0 -630
  942. package/src/experimental/types.ts +0 -10
  943. package/src/fabric/gamma/SplitViewScreenNativeComponent.ts +0 -24
  944. package/src/fabric/tabs/TabsHostNativeComponent.ts +0 -75
  945. package/src/fabric/tabs/TabsScreenNativeComponent.ts +0 -175
  946. /package/lib/commonjs/components/gamma/stack/{StackHost.types.js → host/StackHost.types.js} +0 -0
  947. /package/lib/commonjs/components/gamma/stack/{StackHost.web.js → host/StackHost.web.js} +0 -0
  948. /package/lib/commonjs/components/gamma/stack/{StackScreen.types.js → screen/StackScreen.types.js} +0 -0
  949. /package/lib/commonjs/components/gamma/stack/{StackScreen.web.js → screen/StackScreen.web.js} +0 -0
  950. /package/lib/commonjs/components/tabs/{TabsHost.types.js → host/TabsHost.types.js} +0 -0
  951. /package/lib/commonjs/components/tabs/{TabsHost.web.js → host/TabsHost.web.js} +0 -0
  952. /package/lib/commonjs/components/tabs/{TabsScreen.types.js → screen/TabsScreen.types.js} +0 -0
  953. /package/lib/commonjs/components/tabs/{TabsScreen.web.js → screen/TabsScreen.web.js} +0 -0
  954. /package/lib/module/components/gamma/stack/{StackHost.types.js → host/StackHost.types.js} +0 -0
  955. /package/lib/module/components/gamma/stack/{StackHost.web.js → host/StackHost.web.js} +0 -0
  956. /package/lib/module/components/gamma/stack/{StackScreen.types.js → screen/StackScreen.types.js} +0 -0
  957. /package/lib/module/components/gamma/stack/{StackScreen.web.js → screen/StackScreen.web.js} +0 -0
  958. /package/lib/module/components/tabs/{TabsHost.types.js → host/TabsHost.types.js} +0 -0
  959. /package/lib/module/components/tabs/{TabsHost.web.js → host/TabsHost.web.js} +0 -0
  960. /package/lib/module/components/tabs/{TabsScreen.types.js → screen/TabsScreen.types.js} +0 -0
  961. /package/lib/module/components/tabs/{TabsScreen.web.js → screen/TabsScreen.web.js} +0 -0
  962. /package/lib/typescript/components/gamma/stack/{StackHost.d.ts → host/StackHost.d.ts} +0 -0
  963. /package/lib/typescript/components/gamma/stack/{StackHost.web.d.ts → host/StackHost.web.d.ts} +0 -0
  964. /package/lib/typescript/components/gamma/stack/{StackScreen.d.ts → screen/StackScreen.d.ts} +0 -0
  965. /package/lib/typescript/components/gamma/stack/{StackScreen.web.d.ts → screen/StackScreen.web.d.ts} +0 -0
  966. /package/lib/typescript/components/tabs/{TabsHost.web.d.ts → host/TabsHost.web.d.ts} +0 -0
  967. /package/lib/typescript/components/tabs/{TabsScreen.web.d.ts → screen/TabsScreen.web.d.ts} +0 -0
  968. /package/src/components/gamma/stack/{StackHost.web.tsx → host/StackHost.web.tsx} +0 -0
  969. /package/src/components/gamma/stack/{StackScreen.web.tsx → screen/StackScreen.web.tsx} +0 -0
  970. /package/src/components/tabs/{TabsHost.web.tsx → host/TabsHost.web.tsx} +0 -0
  971. /package/src/components/tabs/{TabsScreen.web.tsx → screen/TabsScreen.web.tsx} +0 -0
@@ -1,12 +1,89 @@
1
1
  #import "RNSTabBarController.h"
2
2
  #import <React/RCTAssert.h>
3
3
  #import <React/RCTLog.h>
4
+ #import <objc/message.h>
5
+ #import <objc/runtime.h>
6
+ #import <limits>
7
+ #import "NSString+RNSUtility.h"
4
8
  #import "RNSLog.h"
5
9
  #import "RNSScreenWindowTraits.h"
10
+ #import "RNSTabsHostComponentView.h"
11
+ #import "RNSTabsNavigationStateObserverRegistry.h"
12
+
13
+ #define RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE !TARGET_OS_TV && !TARGET_OS_VISION
14
+
15
+ // We need UINavigationControllerDelegate to handle navigation within `moreNavigationController`
16
+ @interface RNSTabBarController () <UITabBarControllerDelegate, UINavigationControllerDelegate>
17
+ @end
18
+
19
+ @interface RNSTabBarController ()
20
+
21
+ /// Consulted by the ISA-swizzled `pushViewController:animated:` on `moreNavigationController`
22
+ /// to decide whether a push should proceed.
23
+ - (BOOL)moreNavigationController:(UINavigationController *)navigationController
24
+ shouldPushViewController:(UIViewController *)viewController;
25
+
26
+ @property (nonatomic, readwrite) BOOL shouldProgressStateOnMoreNavigationControllerPush;
27
+
28
+ @end
29
+
30
+ #if RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
31
+ /**
32
+ * Replacement implementation for `pushViewController:animated:` injected into
33
+ * a dynamic subclass of `UIMoreNavigationController` via ISA-swizzle.
34
+ *
35
+ * Before allowing the push, this function consults the owning `RNSTabBarController`
36
+ * (reached via UIKit's `tabBarController` property on the parent chain)
37
+ * to check whether the push should be prevented (e.g. due to `preventNativeSelection`).
38
+ */
39
+ static void rns_pushViewController(__unsafe_unretained id self,
40
+ SEL _cmd,
41
+ UIViewController *viewController,
42
+ BOOL animated)
43
+ {
44
+ UITabBarController *rawTabBarController = static_cast<UIViewController *>(self).tabBarController;
45
+
46
+ RCTAssert([rawTabBarController isKindOfClass:RNSTabBarController.class],
47
+ @"[RNScreens] Expected tabBarController to be of class %@, got: %@",
48
+ RNSTabBarController.class,
49
+ rawTabBarController.class);
50
+ RNSTabBarController *tabBarController = static_cast<RNSTabBarController *>(rawTabBarController);
51
+
52
+ if ([tabBarController moreNavigationController:self shouldPushViewController:viewController]) {
53
+ struct objc_super superInfo = {
54
+ .receiver = self,
55
+ .super_class = class_getSuperclass(object_getClass(self)),
56
+ };
57
+ const auto msgSendSuperPushViewController =
58
+ reinterpret_cast<void (*)(struct objc_super *, SEL, UIViewController *, BOOL)>(objc_msgSendSuper);
59
+
60
+ [tabBarController setShouldProgressStateOnMoreNavigationControllerPush:YES];
61
+ msgSendSuperPushViewController(&superInfo, _cmd, viewController, animated);
62
+ }
63
+ }
64
+ #endif // RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
6
65
 
7
66
  @implementation RNSTabBarController {
8
67
  NSArray<RNSTabsScreenViewController *> *_Nullable _tabScreenControllers;
9
68
 
69
+ /// This property is nullable until first container update. Later it MUST NOT be nil.
70
+ RNSTabsNavigationState *_Nullable _navigationState;
71
+
72
+ /// Holds last state that has been a result of UI-side navigation (user request).
73
+ /// This one is also updated in cases where UIKit modifies the selected tab implicitly,
74
+ /// e.g. when user resizes the app and more tab disappears.
75
+ ///
76
+ /// This property is nullable until first container update. Later it MUST NOT be nil.
77
+ RNSTabsNavigationState *_Nullable _lastUINavigationState;
78
+
79
+ RNSTabsNavigationStateUpdateRequest *_Nullable _pendingStateUpdate;
80
+
81
+ /// When YES, the controller is inside an explicit selection-changing code path (container update,
82
+ /// delegate handling). Setter overrides skip reconciliation while this flag is set.
83
+ BOOL _isHandlingExplicitSelectionUpdate;
84
+
85
+ RNSTabsNavigationStateObserverRegistry *_observerRegistry;
86
+
10
87
  #if !RCT_NEW_ARCH_ENABLED
11
88
  BOOL _isControllerFlushBlockScheduled;
12
89
  #endif // !RCT_NEW_ARCH_ENABLED
@@ -18,6 +95,13 @@
18
95
  _tabScreenControllers = nil;
19
96
  _tabBarAppearanceCoordinator = [RNSTabBarAppearanceCoordinator new];
20
97
  _tabsHostComponentView = nil;
98
+ _navigationState = nil;
99
+ _pendingStateUpdate = nil;
100
+ _shouldProgressStateOnMoreNavigationControllerPush = NO;
101
+ _observerRegistry = [RNSTabsNavigationStateObserverRegistry new];
102
+
103
+ // Delegate field retains weakly, no risk of cycle.
104
+ self.delegate = self;
21
105
 
22
106
  #if !RCT_NEW_ARCH_ENABLED
23
107
  _isControllerFlushBlockScheduled = NO;
@@ -26,6 +110,41 @@
26
110
  return self;
27
111
  }
28
112
 
113
+ #pragma mark - Public API
114
+
115
+ - (void)submitSelectionOfTabsScreenWithKey:(nonnull NSString *)screenKey
116
+ {
117
+ RCTAssert(screenKey != nil, @"[RNScreens] Requested screenKey MUST NOT be nil");
118
+ int baseProvenance = _navigationState != nil ? _navigationState.provenance : std::numeric_limits<int>::min();
119
+ RNSTabsNavigationStateUpdateRequest *request =
120
+ [RNSTabsNavigationStateUpdateRequest requestWithSelectedScreenKey:screenKey
121
+ baseProvenance:baseProvenance
122
+ actionOrigin:RNSTabsActionOriginProgrammaticNative];
123
+ [self setPendingNavigationStateUpdate:request];
124
+ }
125
+
126
+ - (void)flushPendingUpdates
127
+ {
128
+ [self performContainerUpdate];
129
+ }
130
+
131
+ - (BOOL)addNavigationStateObserver:(id<RNSTabsNavigationStateObserver>)observer
132
+ {
133
+ return [_observerRegistry addObserver:observer];
134
+ }
135
+
136
+ - (BOOL)removeNavigationStateObserver:(id<RNSTabsNavigationStateObserver>)observer
137
+ {
138
+ return [_observerRegistry removeObserver:observer];
139
+ }
140
+
141
+ - (void)tearDown
142
+ {
143
+ [_observerRegistry clear];
144
+ _pendingStateUpdate = nil;
145
+ _tabsHostComponentView = nil;
146
+ }
147
+
29
148
  - (instancetype)initWithTabsHostComponentView:(nullable RNSTabsHostComponentView *)tabsHostComponentView
30
149
  {
31
150
  if (self = [self init]) {
@@ -34,35 +153,54 @@
34
153
  return self;
35
154
  }
36
155
 
156
+ #pragma mark - UIKit callbacks
157
+
158
+ - (void)didMoveToParentViewController:(UIViewController *)parent
159
+ {
160
+ [super didMoveToParentViewController:parent];
161
+
162
+ if (parent != nil) {
163
+ [self updateLayoutDirectionBelowIOS17IfNeeded];
164
+ }
165
+ }
166
+
37
167
  - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
38
168
  {
39
169
  RNSLog(@"TabBar: %@ didSelectItem: %@", tabBar, item);
40
170
  }
41
171
 
42
- #pragma mark-- Signals
172
+ - (void)setSelectedIndex:(NSUInteger)selectedIndex
173
+ {
174
+ [super setSelectedIndex:selectedIndex];
175
+ if (!_isHandlingExplicitSelectionUpdate) {
176
+ [self reconcileNavigationStateWithUIKitState];
177
+ }
178
+ }
43
179
 
44
- - (void)childViewControllersHaveChangedTo:(NSArray<RNSTabsScreenViewController *> *)reactChildControllers
180
+ - (void)setSelectedViewController:(__kindof UIViewController *)selectedViewController
45
181
  {
46
- _tabScreenControllers = reactChildControllers;
47
- self.needsUpdateOfReactChildrenControllers = true;
182
+ [super setSelectedViewController:selectedViewController];
183
+ if (!_isHandlingExplicitSelectionUpdate) {
184
+ [self reconcileNavigationStateWithUIKitState];
185
+ }
48
186
  }
49
187
 
50
- - (void)setNeedsUpdateOfReactChildrenControllers:(bool)needsReactChildrenUpdate
188
+ #pragma mark - Signals
189
+
190
+ - (void)setPendingNavigationStateUpdate:(nullable RNSTabsNavigationStateUpdateRequest *)stateUpdate
51
191
  {
52
- _needsUpdateOfReactChildrenControllers = true;
53
- self.needsUpdateOfSelectedTab = true;
54
- #if !RCT_NEW_ARCH_ENABLED
55
- [self scheduleControllerUpdateIfNeeded];
56
- #endif // !RCT_NEW_ARCH_ENABLED
192
+ _pendingStateUpdate = stateUpdate;
57
193
  }
58
194
 
59
- - (void)setNeedsUpdateOfSelectedTab:(bool)needsSelectedTabUpdate
195
+ - (void)childViewControllersHaveChangedTo:(NSArray<RNSTabsScreenViewController *> *)reactChildControllers
60
196
  {
61
- _needsUpdateOfSelectedTab = needsSelectedTabUpdate;
197
+ _tabScreenControllers = reactChildControllers;
198
+ self.needsUpdateOfChildViewControllers = true;
199
+ }
62
200
 
63
- if (needsSelectedTabUpdate) {
64
- _needsOrientationUpdate = true;
65
- }
201
+ - (void)setNeedsUpdateOfChildViewControllers:(bool)needsReactChildrenUpdate
202
+ {
203
+ _needsUpdateOfChildViewControllers = true;
66
204
  #if !RCT_NEW_ARCH_ENABLED
67
205
  [self scheduleControllerUpdateIfNeeded];
68
206
  #endif // !RCT_NEW_ARCH_ENABLED
@@ -84,7 +222,12 @@
84
222
  #endif // !RCT_NEW_ARCH_ENABLED
85
223
  }
86
224
 
87
- #pragma mark-- RNSReactTransactionObserving
225
+ - (void)setNeedsLayoutDirectionUpdateBelowIOS17:(bool)needsLayoutDirectionUpdate
226
+ {
227
+ _needsLayoutDirectionUpdateBelowIOS17 = needsLayoutDirectionUpdate;
228
+ }
229
+
230
+ #pragma mark - RNSReactTransactionObserving
88
231
 
89
232
  - (void)reactMountingTransactionWillMount
90
233
  {
@@ -94,18 +237,225 @@
94
237
  - (void)reactMountingTransactionDidMount
95
238
  {
96
239
  RNSLog(@"TabBarCtrl mountintTransactionDidMount running updates");
97
- [self updateReactChildrenControllersIfNeeded];
240
+ [self performContainerUpdate];
241
+ }
242
+
243
+ #pragma mark - Container update
244
+
245
+ - (void)performContainerUpdate
246
+ {
247
+ _isHandlingExplicitSelectionUpdate = YES;
248
+ [self updateChildViewControllersIfNeeded];
98
249
  [self updateSelectedViewControllerIfNeeded];
250
+ _isHandlingExplicitSelectionUpdate = NO;
251
+
99
252
  [self updateTabBarAppearanceIfNeeded];
100
253
  [self updateTabBarA11yIfNeeded];
101
254
  [self updateOrientationIfNeeded];
102
255
  }
103
256
 
104
- #pragma mark-- Signals related
257
+ /**
258
+ * Update UIKit model and associated navigation state.
259
+ *
260
+ * This method will advance state in case the selected view controller is repeated.
261
+ *
262
+ * This method MUST be called only in situations where `UITabBarController` state has not been updated yet.
263
+ * Otherwise it'll progress the state incorrectly.
264
+ *
265
+ * @returns whether the state has been updated or not.
266
+ */
267
+ - (BOOL)updateSelectedViewControllerTo:(nullable UIViewController *)nextSelectedViewController
268
+ withKey:(nullable NSString *)screenKey
269
+ {
270
+ if (nextSelectedViewController == nil) {
271
+ return NO;
272
+ }
273
+
274
+ UIViewController *currSelectedViewController = self.selectedViewController;
275
+
276
+ RCTAssert(![NSString rnscreens_isBlankOrNull:screenKey],
277
+ @"[RNScreens] The screenKey MUST NOT be null if the view controller is not null");
278
+
279
+ [self progressNavigationState:screenKey withOrigin:RNSTabsActionOriginProgrammaticJs];
280
+
281
+ if (currSelectedViewController == nextSelectedViewController) {
282
+ return YES;
283
+ }
284
+
285
+ [self setSelectedViewController:nextSelectedViewController];
286
+ return YES;
287
+ }
288
+
289
+ /**
290
+ * Update tabs navigation state in reaction to UIKit model update.
291
+ *
292
+ * This method does not update the UIKit model. It assumes that exactly one model update happened,
293
+ * and will sync the state with the UIKit and progress the provenance.
294
+ */
295
+ - (void)updateNavigationStateOnModelUpdate
296
+ {
297
+ [self progressNavigationState:[self screenKeyForSelectedViewController] withOrigin:RNSTabsActionOriginUser];
298
+ }
299
+
300
+ - (void)userDidRepeatViewControllerSelection:(nonnull UIViewController *)viewController
301
+ {
302
+ RCTAssert(self.selectedViewController == viewController,
303
+ @"[RNScreens] Expected UIKit to update selectedViewController");
304
+
305
+ if ([self isSelectedViewControllerTheMoreNavigationController]) {
306
+ // We don't want to run neither state update nor side effects.
307
+ return;
308
+ }
309
+
310
+ [self updateNavigationStateOnModelUpdate];
311
+
312
+ // After state progression we trigger the special effect.
313
+ BOOL repeatedSelectionHandledBySpecialEffect = [[self selectedScreenViewController] tabScreenSelectedRepeatedly];
314
+
315
+ auto *updateContext =
316
+ [[RNSTabsNavigationStateUpdateContext alloc] initWithNavState:_navigationState
317
+ isRepeated:YES
318
+ hasTriggeredSpecialEffect:repeatedSelectionHandledBySpecialEffect
319
+ actionOrigin:RNSTabsActionOriginUser];
320
+ [_observerRegistry emitDidUpdateStateTo:_navigationState withContext:updateContext sender:self];
321
+ }
322
+
323
+ - (void)userDidSelectViewController:(nonnull UIViewController *)viewController
324
+ {
325
+ // At this moment the `UITabBarController` model is already updated.
326
+ RCTAssert(self.selectedViewController == viewController,
327
+ @"[RNScreens] Expected UIKit to update selectedViewController");
328
+
329
+ if ([self isSelectedViewControllerTheMoreNavigationController]) {
330
+ [self disableNavigationBarInMoreNavigationController];
331
+ [self prepareForMoreNavigationControllerHandlingIfNeeded];
332
+
333
+ // We don't want to progress state in case a user selected the more navigation controller.
334
+ // Instead, we emit a dedicated event so JS knows the More tab was tapped.
335
+ [_observerRegistry emitDidSelectMoreTabWithCurrentState:_navigationState sender:self];
336
+ } else {
337
+ [self updateNavigationStateOnModelUpdate];
338
+ auto *updateContext = [[RNSTabsNavigationStateUpdateContext alloc] initWithNavState:_navigationState
339
+ isRepeated:NO
340
+ hasTriggeredSpecialEffect:NO
341
+ actionOrigin:RNSTabsActionOriginUser];
342
+ [_observerRegistry emitDidUpdateStateTo:_navigationState withContext:updateContext sender:self];
343
+ }
344
+ }
345
+
346
+ - (void)onDidPreventUserFromSelectingViewControllerWithKey:(nonnull NSString *)screenKey
347
+ {
348
+ [_observerRegistry emitPreventedSelectionOf:screenKey currentState:_navigationState sender:self];
349
+ }
350
+
351
+ - (BOOL)shouldPreventNativeTabSelection:(nonnull UIViewController *)nextViewController
352
+ {
353
+ if (![nextViewController isKindOfClass:RNSTabsScreenViewController.class]) {
354
+ // Allow for more view controller selection
355
+ return NO;
356
+ }
357
+
358
+ auto *screenViewController = static_cast<RNSTabsScreenViewController *>(nextViewController);
359
+ return screenViewController.isPreventNativeSelectionEnabled;
360
+ }
361
+
362
+ #pragma mark - UITabBarControllerDelegate
363
+
364
+ // These methods are not called on programatic selection!
365
+ // They are called only when a user taps on tab bar.
105
366
 
106
- - (void)updateReactChildrenControllersIfNeeded
367
+ - (BOOL)tabBarController:(UITabBarController *)tabBarController
368
+ shouldSelectViewController:(UIViewController *)viewController
107
369
  {
108
- if (_needsUpdateOfReactChildrenControllers) {
370
+ RCTAssert(tabBarController == self, @"[RNScreens] Unexpected type of controller: %@", tabBarController.class);
371
+
372
+ // Can be UINavigationController in case of MoreNavigationController
373
+ RCTAssert([viewController isKindOfClass:RNSTabsScreenViewController.class] ||
374
+ [viewController isKindOfClass:UINavigationController.class],
375
+ @"[RNScreens] Unexpected type of controller: %@",
376
+ viewController.class);
377
+
378
+ // TODO: handle enforcing orientation with natively-driven tabs
379
+
380
+ // Detect repeated selection and inform tabScreenController
381
+ BOOL repeatedSelection = self.selectedViewController == viewController;
382
+
383
+ if (repeatedSelection) {
384
+ // On repeated selection we return false to prevent native *pop to root* effect that works only starting from iOS 26
385
+ // and interferes with our implementation (which is necessary for controlled tabs).
386
+
387
+ // We trigger the state update from here, because `tabBarController:didSelectViewController:` won't be called.
388
+ [self userDidRepeatViewControllerSelection:viewController];
389
+
390
+ return NO;
391
+ }
392
+
393
+ BOOL shouldPreventTabSelection = [self shouldPreventNativeTabSelection:viewController];
394
+
395
+ if (shouldPreventTabSelection) {
396
+ // Ideally we'd call this AFTER we prevent, but there is no appropriate callback.
397
+ // As long as we emit the event asynchronously this is rather fine.
398
+ [self onDidPreventUserFromSelectingViewControllerWithKey:[self screenKeyForViewController:viewController]];
399
+ return NO;
400
+ }
401
+
402
+ // If we're gonna allow navigation to `moreNavigationController`, then we need to ensure
403
+ // that on top of its stack there is no controller with preventNativeSelection enabled.
404
+ // In such case, we want to pop to root.
405
+ // We do it here, because in `tabBarController:didSelectViewController:` we won't receive
406
+ // `moreNavigationController` in case there is already a tab pushed on the stack.
407
+ if ([self isViewControllerTheMoreNavigationController:viewController]) {
408
+ auto *poppedViewController = [self popToRootInMoreNavigationControllerRespectSelectionPrevention:YES animated:NO];
409
+ if (poppedViewController != nil) {
410
+ // We actually popped something -> let's notify JS realm of this fact.
411
+ [self onDidPreventUserFromSelectingViewControllerWithKey:[self screenKeyForViewController:poppedViewController]];
412
+ }
413
+ }
414
+
415
+ _isHandlingExplicitSelectionUpdate = YES;
416
+ return YES;
417
+ }
418
+
419
+ - (void)tabBarController:(UITabBarController *)tabBarController
420
+ didSelectViewController:(UIViewController *)viewController
421
+ {
422
+ RCTAssert(self == tabBarController, @"[RNScreens] Unexpected type of controller: %@", tabBarController.class);
423
+
424
+ // Can be UINavigationController in case of MoreNavigationController
425
+ RCTAssert([viewController isKindOfClass:RNSTabsScreenViewController.class] ||
426
+ [viewController isKindOfClass:UINavigationController.class],
427
+ @"[RNScreens] Unexpected type of controller: %@",
428
+ viewController.class);
429
+
430
+ [self userDidSelectViewController:viewController];
431
+ _isHandlingExplicitSelectionUpdate = NO;
432
+ }
433
+
434
+ #pragma mark - UINavigationControllerDelegate
435
+
436
+ - (void)navigationController:(UINavigationController *)navigationController
437
+ willShowViewController:(UIViewController *)viewController
438
+ animated:(BOOL)animated
439
+ {
440
+ #if RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
441
+ RCTAssert(self.moreNavigationController == navigationController,
442
+ @"[RNScreens] Unexpected view controller called delegate method: %@",
443
+ navigationController);
444
+
445
+ // The root view controller is of different type.
446
+ if ([viewController isKindOfClass:RNSTabsScreenViewController.class] &&
447
+ [self shouldProgressStateOnMoreNavigationControllerPush]) {
448
+ [self userDidSelectViewController:viewController];
449
+ [self setShouldProgressStateOnMoreNavigationControllerPush:NO];
450
+ }
451
+ #endif // RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
452
+ }
453
+
454
+ #pragma mark - Signals related
455
+
456
+ - (void)updateChildViewControllersIfNeeded
457
+ {
458
+ if (_needsUpdateOfChildViewControllers) {
109
459
  [self updateReactChildrenControllers];
110
460
  }
111
461
  }
@@ -113,7 +463,7 @@
113
463
  - (void)updateReactChildrenControllers
114
464
  {
115
465
  RNSLog(@"TabBarCtrl updateReactChildrenControllers");
116
- _needsUpdateOfReactChildrenControllers = false;
466
+ _needsUpdateOfChildViewControllers = false;
117
467
 
118
468
  if (_tabScreenControllers == nil) {
119
469
  RCTLogWarn(@"[RNScreens] Attempt to update react children while the _updatedChildren array is nil!");
@@ -125,46 +475,85 @@
125
475
 
126
476
  - (void)updateSelectedViewControllerIfNeeded
127
477
  {
128
- if (_needsUpdateOfSelectedTab) {
478
+ if (_pendingStateUpdate != nil) {
129
479
  [self updateSelectedViewController];
130
480
  }
131
481
  }
132
482
 
133
483
  - (void)updateSelectedViewController
134
484
  {
135
- RNSLog(@"TabBarCtrl updateSelectedViewController");
136
- _needsUpdateOfSelectedTab = false;
137
-
138
- #if !defined(NDEBUG)
139
- [self assertExactlyOneFocusedTab];
140
- #endif
141
-
142
- RNSTabsScreenViewController *_Nullable selectedViewController = nil;
143
- for (RNSTabsScreenViewController *tabViewController in self.viewControllers) {
144
- RNSLog(
145
- @"Update Selected View Controller [%ld] isFocused %d",
146
- tabViewController.tabScreenComponentView.tag,
147
- tabViewController.tabScreenComponentView.isSelectedScreen);
148
- if (tabViewController.tabScreenComponentView.isSelectedScreen == true) {
149
- selectedViewController = tabViewController;
150
- break;
151
- }
485
+ if (_pendingStateUpdate == nil || self.viewControllers.count == 0) {
486
+ return;
152
487
  }
153
488
 
154
- RCTAssert(selectedViewController != nil, @"[RNScreens] No selected view controller!");
489
+ RNSLog(@"TabBarCtrl updateSelectedViewController");
490
+ [self updateSelectedViewControllerInner];
491
+ _pendingStateUpdate = nil;
492
+ }
155
493
 
156
- RNSLog(@"Change selected view controller to: %@", selectedViewController);
494
+ /**
495
+ * NEVER call this method directly. Call the proper function `updateSelectedViewController`
496
+ *
497
+ * The logic is extracted to an inner method to correctly manage `_pendingStateUpdate` cleanup.
498
+ */
499
+ - (void)updateSelectedViewControllerInner
500
+ {
501
+ UIViewController *_Nonnull currSelectedViewController = self.selectedViewController;
502
+
503
+ NSString *_Nonnull nextSelectedViewControllerKey = _pendingStateUpdate.selectedScreenKey;
504
+ UIViewController *nextSelectedViewController = [self findChildViewControllerForKey:nextSelectedViewControllerKey];
505
+
506
+ RCTAssert(nextSelectedViewController != nil,
507
+ @"[RNScreens] Failed to determine next selected view controller for key: %@",
508
+ nextSelectedViewControllerKey);
509
+
510
+ RCTAssert([nextSelectedViewController isKindOfClass:RNSTabsScreenViewController.class],
511
+ @"[RNScreens] nextSelectedViewController MUST be %@, got: %@",
512
+ RNSTabsScreenViewController.class,
513
+ nextSelectedViewController.class);
514
+
515
+ if (self.rejectStaleNavigationStateUpdates && [self isNavigationStateUpdateStale:_pendingStateUpdate]) {
516
+ [_observerRegistry emitRejectedStateUpdate:_pendingStateUpdate
517
+ currentState:_navigationState
518
+ withReason:RNSTabsNavigationStateRejectionReasonStale
519
+ sender:self];
520
+ return;
521
+ }
522
+
523
+ if (currSelectedViewController == nextSelectedViewController && _navigationState != nil) {
524
+ // Nothing to do, we don't allow for programmatic repeat selection, unless
525
+ // we're during first render.
526
+ [_observerRegistry emitRejectedStateUpdate:_pendingStateUpdate
527
+ currentState:_navigationState
528
+ withReason:RNSTabsNavigationStateRejectionReasonRepeated
529
+ sender:self];
530
+ return;
531
+ }
157
532
 
533
+ // TODO: This code MUST be moved to some callback.
534
+ // Should this be called only on JS updates?
535
+ auto *screenViewController = static_cast<RNSTabsScreenViewController *>(nextSelectedViewController);
158
536
  if (@available(iOS 26.0, *)) {
159
537
  // On iOS 26, we need to set user interface style 2 parent views above the tab bar
160
538
  // for this prop to take effect.
161
539
  self.tabBar.superview.superview.overrideUserInterfaceStyle =
162
- selectedViewController.tabScreenComponentView.userInterfaceStyle;
540
+ screenViewController.tabScreenComponentView.userInterfaceStyle;
163
541
  } else {
164
- self.tabBar.overrideUserInterfaceStyle = selectedViewController.tabScreenComponentView.userInterfaceStyle;
542
+ self.tabBar.overrideUserInterfaceStyle = screenViewController.tabScreenComponentView.userInterfaceStyle;
165
543
  }
166
544
 
167
- [self setSelectedViewController:selectedViewController];
545
+ RNSLog(@"Change selected view controller to: %@", nextSelectedViewControllerKey);
546
+ BOOL hasStateProgressed = [self updateSelectedViewControllerTo:nextSelectedViewController
547
+ withKey:nextSelectedViewControllerKey];
548
+
549
+ if (hasStateProgressed) {
550
+ RNSTabsNavigationStateUpdateContext *context =
551
+ [[RNSTabsNavigationStateUpdateContext alloc] initWithNavState:_navigationState
552
+ isRepeated:NO
553
+ hasTriggeredSpecialEffect:NO
554
+ actionOrigin:_pendingStateUpdate.actionOrigin];
555
+ [_observerRegistry emitDidUpdateStateTo:_navigationState withContext:context sender:self];
556
+ }
168
557
  }
169
558
 
170
559
  - (void)updateTabBarAppearanceIfNeeded
@@ -199,19 +588,366 @@
199
588
  }
200
589
  }
201
590
 
202
- #if !defined(NDEBUG)
203
- - (void)assertExactlyOneFocusedTab
591
+ #pragma mark - Utility
592
+
593
+ - (nullable RNSTabsScreenViewController *)findChildViewControllerForKey:(nullable NSString *)screenKey
204
594
  {
205
- int selectedCount = 0;
206
- for (RNSTabsScreenViewController *tabViewController in _tabScreenControllers) {
207
- if (tabViewController.tabScreenComponentView.isSelectedScreen) {
208
- ++selectedCount;
595
+ if (screenKey == nil) {
596
+ return nil;
597
+ }
598
+ for (UIViewController *viewController in self.viewControllers) {
599
+ RCTAssert([viewController isKindOfClass:RNSTabsScreenViewController.class],
600
+ @"[RNScreens] Unexpected type of controller: %@",
601
+ viewController.class);
602
+ auto *screenViewController = static_cast<RNSTabsScreenViewController *>(viewController);
603
+ if ([screenViewController.getScreenKeyOrNull isEqualToString:screenKey]) {
604
+ return screenViewController;
209
605
  }
210
606
  }
211
- RCTAssert(
212
- selectedCount == 1, @"[RNScreens] Invariant violation. Expected exactly 1 focused tab, got: %d", selectedCount);
607
+ return nil;
608
+ }
609
+
610
+ - (void)progressNavigationState:(nonnull NSString *)newSelectedScreenKey withOrigin:(RNSTabsActionOrigin)origin
611
+ {
612
+ RCTAssert(newSelectedScreenKey != nil, @"[RNScreens] newSelectedScreenKey MUST NOT be nil");
613
+
614
+ if (_navigationState == nil) {
615
+ _navigationState = [RNSTabsNavigationState stateWithSelectedScreenKey:newSelectedScreenKey provenance:0];
616
+ return;
617
+ }
618
+
619
+ _navigationState = [RNSTabsNavigationState stateWithSelectedScreenKey:newSelectedScreenKey
620
+ provenance:_navigationState.provenance + 1];
621
+
622
+ if (origin != RNSTabsActionOriginProgrammaticJs) {
623
+ _lastUINavigationState = [_navigationState cloneState];
624
+ }
625
+ }
626
+
627
+ /**
628
+ * Be sure to call this method IF AND ONLY IF you know that the `self.selectedViewController`
629
+ * is not the `moreNavigationController`.
630
+ */
631
+ - (RNSTabsScreenViewController *)selectedScreenViewController
632
+ {
633
+ RCTAssert([self.selectedViewController isKindOfClass:RNSTabsScreenViewController.class],
634
+ @"[RNScreens] Unexpected type of selectedViewController: %@",
635
+ self.selectedViewController.class);
636
+ return static_cast<RNSTabsScreenViewController *>(self.selectedViewController);
637
+ }
638
+
639
+ - (nonnull NSString *)screenKeyForViewController:(nonnull UIViewController *)viewController
640
+ {
641
+ RCTAssert([viewController isKindOfClass:RNSTabsScreenViewController.class],
642
+ @"[RNScreens] Expected selected view controller to be of class %@, got: %@",
643
+ RNSTabsScreenViewController.class,
644
+ viewController.class);
645
+
646
+ auto *screenKey = static_cast<RNSTabsScreenViewController *>(viewController).getScreenKeyOrNull;
647
+ RCTAssert(screenKey != nil, @"[RNScreens] screenKey MUST NOT be nil");
648
+ return screenKey;
649
+ }
650
+
651
+ - (nonnull NSString *)screenKeyForSelectedViewController
652
+ {
653
+ return [self screenKeyForViewController:self.selectedViewController];
654
+ }
655
+
656
+ /**
657
+ * Detect and fix any mismatch between `_navigationState` and UIKit's actual selected view controller.
658
+ *
659
+ * This is called from the `setSelectedIndex:` / `setSelectedViewController:` overrides when
660
+ * the change was NOT initiated by a known code path (container update, delegate handling).
661
+ * The primary case is UIKit restoring a tab when the More navigation controller disappears
662
+ * during a horizontal size class transition on iPad.
663
+ */
664
+ - (void)reconcileNavigationStateWithUIKitState
665
+ {
666
+ if (_navigationState == nil) {
667
+ // Before the first container update, _navigationState is nil — there is no established baseline
668
+ // to drift from. The normal initialization path (performContainerUpdate → progressNavigationState:)
669
+ // handles the nil → first state transition. Reconciling here would prematurely initialize state
670
+ // and emit a delegate notification before the controller is fully set up.
671
+ return;
672
+ }
673
+
674
+ if ([self isSelectedViewControllerTheMoreNavigationController]) {
675
+ // We don't want to progress the state in case of more navigation controller.
676
+ // If we're reconciling here, it means that it won't be handled correctly.
677
+ // I'm not aware of any flow where this could happen, hence assertion.
678
+ RCTAssert(NO, @"[RNScreens] Unexpected state reconciliation with More Navigation Controller");
679
+ return;
680
+ }
681
+
682
+ if (![self.selectedViewController isKindOfClass:RNSTabsScreenViewController.class]) {
683
+ RCTAssert(NO,
684
+ @"[RNScreens] Unexpected controller type during state reconciliation: %@",
685
+ self.selectedViewController.class);
686
+ return;
687
+ }
688
+
689
+ NSString *selectedScreenKey = [self screenKeyForSelectedViewController];
690
+ if ([_navigationState.selectedScreenKey isEqualToString:selectedScreenKey]) {
691
+ return;
692
+ }
693
+
694
+ RNSLog(@"TabBarCtrl reconcileNavigationStateWithUIKitState: %@ -> %@",
695
+ _navigationState.selectedScreenKey,
696
+ selectedScreenKey);
697
+ [self progressNavigationState:selectedScreenKey withOrigin:RNSTabsActionOriginImplicit];
698
+
699
+ auto *context = [[RNSTabsNavigationStateUpdateContext alloc] initWithNavState:_navigationState
700
+ isRepeated:NO
701
+ hasTriggeredSpecialEffect:NO
702
+ actionOrigin:RNSTabsActionOriginImplicit];
703
+ [_observerRegistry emitDidUpdateStateTo:_navigationState withContext:context sender:self];
704
+ }
705
+
706
+ /**
707
+ * This function assumes that the source of the state is NOT user. In current model, user update is never stale.
708
+ */
709
+ - (BOOL)isNavigationStateUpdateStale:(nullable RNSTabsNavigationStateUpdateRequest *)stateUpdate
710
+ {
711
+ if (stateUpdate == nil) {
712
+ return YES;
713
+ }
714
+
715
+ if (_navigationState == nil || _lastUINavigationState == nil) {
716
+ return NO;
717
+ }
718
+
719
+ return stateUpdate.baseProvenance < _lastUINavigationState.provenance;
720
+ }
721
+
722
+ #pragma mark-- More Navigation Controller
723
+
724
+ - (BOOL)canHaveMoreNavigationController
725
+ {
726
+ #if RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
727
+ // https://developer.apple.com/documentation/uikit/uitabbarcontroller?language=objc#The-More-navigation-controller
728
+ return self.viewControllers.count > 5;
729
+ #else
730
+ return NO;
731
+ #endif // RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
732
+ }
733
+
734
+ - (BOOL)isViewControllerTheMoreNavigationController:(nonnull UIViewController *)viewController
735
+ {
736
+ #if RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
737
+ return [self canHaveMoreNavigationController] && viewController == self.moreNavigationController;
738
+ #else
739
+ return NO;
740
+ #endif // RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
741
+ }
742
+
743
+ - (BOOL)isSelectedViewControllerTheMoreNavigationController
744
+ {
745
+ return [self isViewControllerTheMoreNavigationController:self.selectedViewController];
746
+ }
747
+
748
+ - (BOOL)isMoreNavigationControllerPresentInTabBar
749
+ {
750
+ #if RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
751
+ return [self canHaveMoreNavigationController] &&
752
+ [self.tabBar.items containsObject:self.moreNavigationController.tabBarItem];
753
+ #else
754
+ return NO;
755
+ #endif // RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
756
+ }
757
+
758
+ - (BOOL)isMoreNavigationControllerTabBarItemSelected
759
+ {
760
+ #if RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
761
+ return [self canHaveMoreNavigationController] && self.tabBar.selectedItem == self.moreNavigationController.tabBarItem;
762
+ #else
763
+ return NO;
764
+ #endif // RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
765
+ }
766
+
767
+ - (void)disableNavigationBarInMoreNavigationController
768
+ {
769
+ #if RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
770
+ if (!self.moreNavigationController.navigationBar.isHidden) {
771
+ [self.moreNavigationController setNavigationBarHidden:YES animated:NO];
772
+ }
773
+ #endif // RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
774
+ }
775
+
776
+ - (nullable UIViewController *)popToRootInMoreNavigationControllerRespectSelectionPrevention:
777
+ (BOOL)shouldRespectSelectionPrevention
778
+ animated:(BOOL)shouldAnimate
779
+ {
780
+ #if RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
781
+ if ([self isMoreNavigationControllerPresentInTabBar] && self.moreNavigationController.viewControllers.count > 1) {
782
+ // We quietly assume here, that the root view controller is the `UIMoreListViewController`.
783
+ if (shouldRespectSelectionPrevention) {
784
+ UIViewController *topViewController = self.moreNavigationController.topViewController;
785
+ RCTAssert([topViewController isKindOfClass:RNSTabsScreenViewController.class],
786
+ @"[RNScreens] Unexpected type of view controller on moreNavigationControllerStack: %@",
787
+ topViewController.class);
788
+ RNSTabsScreenViewController *screenController = static_cast<RNSTabsScreenViewController *>(topViewController);
789
+ if (screenController.isPreventNativeSelectionEnabled) {
790
+ return [self popToRootMoreNavigationController:self.moreNavigationController animated:shouldAnimate];
791
+ }
792
+ } else {
793
+ return [self popToRootMoreNavigationController:self.moreNavigationController animated:shouldAnimate];
794
+ }
795
+ }
796
+ #endif // RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
797
+ return nil;
798
+ }
799
+
800
+ /**
801
+ * Pops the top view controller from more navigation controller. We expect at most two controllers on the stack of more
802
+ * navigation controller. If this assumption ever becomes invalid, this method needs to be updated.
803
+ *
804
+ * @returns nil if there was nothing to pop, the topViewController otherwise.
805
+ */
806
+ - (nullable UIViewController *)popToRootMoreNavigationController:
807
+ (nonnull UINavigationController *)moreNavigationController
808
+ animated:(BOOL)animated
809
+ {
810
+ if (moreNavigationController.viewControllers.count < 2) {
811
+ return nil;
812
+ }
813
+
814
+ auto *poppedViewControllers = [moreNavigationController popToRootViewControllerAnimated:animated];
815
+ RCTAssert(poppedViewControllers != nil && poppedViewControllers.count == 1,
816
+ @"[RNScreens] Expected exactly one view controller to be popped");
817
+ return [poppedViewControllers firstObject];
818
+ }
819
+
820
+ - (void)prepareForMoreNavigationControllerHandlingIfNeeded
821
+ {
822
+ #if RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
823
+ // This can be called multiple times in lifetime of `RNSTabBarController`.
824
+ // UIKit reuses the same `UIMoreNavigationController` instance, but resets both
825
+ // the delegate and the isa pointer when the More controller disappears from the
826
+ // tab bar (e.g. user resizing the app on iPad). We re-apply both unconditionally.
827
+ if (self.moreNavigationController.delegate == nil) {
828
+ self.moreNavigationController.delegate = self;
829
+ }
830
+ [self ensurePushInterceptorOnMoreNavigationController];
831
+ #endif // RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
832
+ }
833
+
834
+ /// Creates a dynamic subclass of the runtime class of `moreNavigationController`
835
+ /// (which is the private `UIMoreNavigationController`) and overrides `pushViewController:animated:`
836
+ /// with our gating implementation.
837
+ ///
838
+ /// The subclass name is derived from the actual runtime class of `moreNavigationController`
839
+ /// (e.g. `RNS_UIMoreNavigationController`), so if another library ISA-swizzles it first or Apple
840
+ /// changes the private class, each distinct original class gets its own correct dynamic subclass.
841
+ ///
842
+ /// This method is idempotent — safe to call multiple times regardless of whether UIKit has
843
+ /// reset the ISA between calls. When the ISA already carries our `RNS_` prefix, we return
844
+ /// early. When UIKit has reset the ISA (e.g. iPad app resize crossing the threshold at which UIKit introduces the More
845
+ /// controller (currently >5 tabs)), the dynamic subclass is looked up (or created) and re-applied.
846
+ - (void)ensurePushInterceptorOnMoreNavigationController
847
+ {
848
+ #if RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
849
+ Class currentClass = object_getClass(self.moreNavigationController);
850
+ const char *currentClassName = class_getName(currentClass);
851
+
852
+ // If the ISA already points to our dynamic subclass, the interceptor is in place.
853
+ // Without this guard, repeated calls when UIKit has NOT reset the ISA would stack
854
+ // `RNS_RNS_...` subclasses, causing infinite recursion in rns_pushViewController's
855
+ // objc_msgSendSuper call.
856
+ if (strncmp(currentClassName, "RNS_", 4) == 0) {
857
+ return;
858
+ }
859
+
860
+ // Build a unique subclass name per original runtime class: "RNS_<originalClassName>"
861
+ char dynamicSubclassName[256];
862
+ snprintf(dynamicSubclassName, sizeof(dynamicSubclassName), "RNS_%s", currentClassName);
863
+
864
+ Class dynamicSubclass = objc_getClass(dynamicSubclassName);
865
+
866
+ if (dynamicSubclass == nil) {
867
+ dynamicSubclass = objc_allocateClassPair(currentClass, dynamicSubclassName, 0);
868
+ RCTAssert(dynamicSubclass != nil, @"[RNScreens] Failed to allocate dynamic subclass of %s", currentClassName);
869
+
870
+ Method pushMethod = class_getInstanceMethod(currentClass, @selector(pushViewController:animated:));
871
+ class_addMethod(dynamicSubclass,
872
+ @selector(pushViewController:animated:),
873
+ (IMP)rns_pushViewController,
874
+ method_getTypeEncoding(pushMethod));
875
+
876
+ objc_registerClassPair(dynamicSubclass);
877
+ }
878
+
879
+ object_setClass(self.moreNavigationController, dynamicSubclass);
880
+ #endif // RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
881
+ }
882
+
883
+ /// Decides whether `moreNavigationController` should be allowed to push `viewController`.
884
+ /// This mirrors the logic in `shouldPreventNativeTabSelection:` for the More list context.
885
+ - (BOOL)moreNavigationController:(UINavigationController *)navigationController
886
+ shouldPushViewController:(UIViewController *)viewController
887
+ {
888
+ BOOL shouldPrevent = [self shouldPreventNativeTabSelection:viewController];
889
+
890
+ if (shouldPrevent) {
891
+ [self onDidPreventUserFromSelectingViewControllerWithKey:[self screenKeyForViewController:viewController]];
892
+ [self deselectMoreListSelectionInNavigationController:navigationController];
893
+ }
894
+
895
+ return !shouldPrevent;
896
+ }
897
+
898
+ /// When we prevent a push from the More list, the tapped table view cell stays highlighted
899
+ /// because UIKit expects the push to handle deselection on return. We deselect it manually.
900
+ - (void)deselectMoreListSelectionInNavigationController:(UINavigationController *)navigationController
901
+ {
902
+ #if RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
903
+ UIViewController *topVC = navigationController.topViewController;
904
+ UITableView *tableView = [self findTableViewInView:topVC.view];
905
+
906
+ if (tableView != nil) {
907
+ NSIndexPath *selectedIndexPath = tableView.indexPathForSelectedRow;
908
+ if (selectedIndexPath != nil) {
909
+ [tableView deselectRowAtIndexPath:selectedIndexPath animated:YES];
910
+ }
911
+ } else {
912
+ RCTLogWarn(@"[RNScreens] Failed to find a table view to clear focus!");
913
+ }
914
+ #endif // RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
915
+ }
916
+
917
+ /**
918
+ * Unbounded DFS looking for ANY `UITableView` in the subtree rooted at view.
919
+ * The `view` parameter is included in the search.
920
+ */
921
+ - (nullable UITableView *)findTableViewInView:(UIView *)view
922
+ {
923
+ if ([view isKindOfClass:UITableView.class]) {
924
+ return (UITableView *)view;
925
+ }
926
+ for (UIView *subview in view.subviews) {
927
+ UITableView *result = [self findTableViewInView:subview];
928
+ if (result != nil) {
929
+ return result;
930
+ }
931
+ }
932
+ return nil;
933
+ }
934
+
935
+ /**
936
+ * This method allows getting the `moreNavigationController` instance under a couple of conditions.
937
+ *
938
+ * First, it verifies whether we are on an appropriate platform, where the `moreNavigationController`
939
+ * is available.
940
+ * Second, it verifies whether the `moreNavigationController` can even be in the interface right now.
941
+ */
942
+ - (nullable UINavigationController *)resolveMoreNavigationController
943
+ {
944
+ #if RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
945
+ if ([self canHaveMoreNavigationController]) {
946
+ return self.moreNavigationController;
947
+ }
948
+ #endif // RNS_MORE_NAVIGATION_CONTROLLER_AVAILABLE
949
+ return nil;
213
950
  }
214
- #endif
215
951
 
216
952
  #if !RCT_NEW_ARCH_ENABLED
217
953
 
@@ -254,6 +990,31 @@
254
990
  [RNSScreenWindowTraits enforceDesiredDeviceOrientation];
255
991
  }
256
992
 
993
+ - (void)updateLayoutDirectionBelowIOS17IfNeeded
994
+ {
995
+ if (_needsLayoutDirectionUpdateBelowIOS17) {
996
+ [self updateLayoutDirectionBelowIOS17];
997
+ }
998
+ }
999
+
1000
+ - (void)updateLayoutDirectionBelowIOS17
1001
+ {
1002
+ _needsLayoutDirectionUpdateBelowIOS17 = false;
1003
+
1004
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(17_0)
1005
+ if (@available(iOS 17.0, *)) {
1006
+ return;
1007
+ }
1008
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(17_0)
1009
+
1010
+ RCTAssert(self.parentViewController != nil,
1011
+ @"[RNScreens] Expected non-null parent view controller for layout direction update.");
1012
+ [self.parentViewController
1013
+ setOverrideTraitCollection:[UITraitCollection
1014
+ traitCollectionWithLayoutDirection:self.tabsHostComponentView.layoutDirection]
1015
+ forChildViewController:self];
1016
+ }
1017
+
257
1018
  #pragma mark - RNSOrientationProviding
258
1019
 
259
1020
  #if !TARGET_OS_TV