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

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