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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (585) hide show
  1. package/Package.swift +87 -0
  2. package/README.md +0 -8
  3. package/RNScreens.podspec +2 -6
  4. package/android/build.gradle +26 -1
  5. package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +5 -0
  6. package/android/src/main/cpp/NativeProxy.cpp +30 -6
  7. package/android/src/main/cpp/NativeProxy.h +7 -1
  8. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -2
  9. package/android/src/main/java/com/swmansion/rnscreens/common/container/Container.kt +8 -0
  10. package/android/src/main/java/com/swmansion/rnscreens/common/container/ContainerItem.kt +13 -1
  11. package/android/src/main/java/com/swmansion/rnscreens/common/text/ReactTextAppearance.kt +62 -0
  12. package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearance.kt +20 -0
  13. package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearanceDefaults.kt +65 -0
  14. package/android/src/main/java/com/swmansion/rnscreens/helpers/PropIconResolver.kt +17 -23
  15. package/android/src/main/java/com/swmansion/rnscreens/legacy/Screen.kt +25 -7
  16. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStack.kt +2 -0
  17. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackFragment.kt +39 -10
  18. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenViewManager.kt +5 -0
  19. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetAppearanceCoordinator.kt → native/coordinator/FormSheetAppearanceCoordinator.kt} +2 -1
  20. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetBehaviorController.kt → native/coordinator/FormSheetBehaviorController.kt} +74 -19
  21. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetDimensionsCoordinator.kt +159 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetKeyboardCoordinator.kt +101 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetNativeDismissCoordinator.kt +44 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetAvailableHeightProvider.kt +44 -0
  25. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContainer.kt → native/core/FormSheetContainer.kt} +1 -1
  26. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetDialog.kt +115 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetDialogManager.kt +89 -0
  28. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentSizeChangeDelegate.kt → native/interfaces/FormSheetContentSizeChangeDelegate.kt} +1 -1
  29. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentSizeChangeProvider.kt → native/interfaces/FormSheetContentSizeChangeProvider.kt} +1 -1
  30. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDialogEventEmitter.kt → native/interfaces/FormSheetDialogEventEmitter.kt} +5 -1
  31. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetConfig.kt → native/model/FormSheetConfig.kt} +5 -1
  32. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/model/FormSheetDetents.kt +152 -0
  33. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetAnimatorFactory.kt → native/presentation/FormSheetAnimatorFactory.kt} +9 -10
  34. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetDimmingManager.kt +115 -0
  35. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetDismissalOrigin.kt +22 -0
  36. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetPresentation.kt +173 -0
  37. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetPresentationManager.kt +290 -0
  38. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetPresentationState.kt → native/presentation/FormSheetPresentationState.kt} +2 -2
  39. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetStackRegistry.kt +28 -0
  40. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentWrapper.kt → react/contentwrapper/FormSheetContentWrapper.kt} +3 -1
  41. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentWrapperViewManager.kt → react/contentwrapper/FormSheetContentWrapperViewManager.kt} +1 -1
  42. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDetentChangedEvent.kt → react/event/FormSheetDetentChangedEvent.kt} +1 -1
  43. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDidAppearEvent.kt → react/event/FormSheetDidAppearEvent.kt} +1 -1
  44. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDidDisappearEvent.kt → react/event/FormSheetDidDisappearEvent.kt} +1 -1
  45. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/react/event/FormSheetDismissEvent.kt +29 -0
  46. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetNativeDismissEvent.kt → react/event/FormSheetNativeDismissEvent.kt} +1 -1
  47. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/react/event/FormSheetNativeDismissPreventedEvent.kt +29 -0
  48. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetSyncFlushEvent.kt → react/event/FormSheetSyncFlushEvent.kt} +1 -1
  49. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetWillAppearEvent.kt → react/event/FormSheetWillAppearEvent.kt} +1 -1
  50. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetWillDisappearEvent.kt → react/event/FormSheetWillDisappearEvent.kt} +1 -1
  51. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentView.kt → react/host/FormSheetContentView.kt} +3 -1
  52. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetHost.kt → react/host/FormSheetHost.kt} +6 -1
  53. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetHostEventEmitter.kt → react/host/FormSheetHostEventEmitter.kt} +23 -1
  54. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetHostViewManager.kt → react/host/FormSheetHostViewManager.kt} +13 -2
  55. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderApplicator.kt +380 -457
  56. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderBackPressHandler.kt +11 -0
  57. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderCoordinatorLayout.kt +150 -182
  58. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderFrameSynchronizer.kt +63 -0
  59. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderAppBarLayout.kt +240 -0
  60. package/android/src/main/java/com/swmansion/rnscreens/stack/header/{StackHeaderAppBarLayoutBehavior.kt → appbar/StackHeaderAppBarLayoutBehavior.kt} +1 -1
  61. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderContentScrimDrawable.kt +36 -0
  62. package/android/src/main/java/com/swmansion/rnscreens/stack/header/{StackHeaderScrollingViewBehavior.kt → appbar/StackHeaderScrollingViewBehavior.kt} +1 -1
  63. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderCollapsedTitleGravityMode.kt +6 -0
  64. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfig.kt +192 -167
  65. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigViewManager.kt +393 -13
  66. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationObserver.kt +0 -4
  67. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationProviding.kt +33 -3
  68. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderDelegate.kt +0 -7
  69. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderInvalidationFlags.kt +9 -3
  70. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuApplicator.kt +195 -0
  71. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuController.kt +448 -0
  72. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuDelegate.kt +10 -0
  73. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuMapper.kt +43 -21
  74. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuConfig.kt +8 -0
  75. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuElementConfig.kt → model/StackHeaderToolbarMenuElementConfig.kt} +1 -1
  76. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuGroupConfig.kt → model/StackHeaderToolbarMenuGroupConfig.kt} +1 -1
  77. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuGroupMetadata.kt +11 -0
  78. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemConfig.kt → model/StackHeaderToolbarMenuItemConfig.kt} +2 -4
  79. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemDefaults.kt → model/StackHeaderToolbarMenuItemDefaults.kt} +1 -1
  80. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemIconSource.kt → model/StackHeaderToolbarMenuItemIconSource.kt} +1 -1
  81. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemShowAsAction.kt → model/StackHeaderToolbarMenuItemShowAsAction.kt} +1 -1
  82. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemType.kt → model/StackHeaderToolbarMenuItemType.kt} +1 -1
  83. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuModel.kt +180 -0
  84. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarFieldUpdate.kt → update/StackHeaderToolbarFieldUpdate.kt} +1 -1
  85. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementOptions.kt +84 -0
  86. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementRawUpdate.kt +15 -0
  87. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementUpdate.kt +11 -0
  88. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuIconResolver.kt +18 -0
  89. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuUpdateQueue.kt → update/StackHeaderToolbarMenuUpdateQueue.kt} +24 -52
  90. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuUpdateQueueDelegate.kt +9 -0
  91. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainer.kt +103 -3
  92. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHost.kt +13 -0
  93. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHostViewManager.kt +14 -0
  94. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreen.kt +5 -0
  95. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragment.kt +20 -1
  96. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragmentDelegate.kt +12 -0
  97. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceCoordinator.kt +2 -4
  98. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/MenuHelpers.kt +5 -23
  99. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainer.kt +46 -25
  100. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHost.kt +10 -0
  101. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHostA11yCoordinator.kt +23 -2
  102. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreen.kt +17 -0
  103. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenFragment.kt +3 -0
  104. package/android/src/main/java/com/swmansion/rnscreens/utils/DimensionUtils.kt +7 -0
  105. package/android/src/main/java/com/swmansion/rnscreens/utils/StyleUtils.kt +22 -0
  106. package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_available_space.xml +8 -0
  107. package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_entire_space.xml +8 -0
  108. package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_available_space.xml +8 -0
  109. package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_entire_space.xml +8 -0
  110. package/common/cpp/react/renderer/components/rnscreens/legacy/RNSScreenShadowNode.cpp +10 -5
  111. package/cpp/legacy/RNSScreenRemovalListener.cpp +31 -1
  112. package/cpp/legacy/RNSScreenRemovalListener.h +18 -3
  113. package/ios/RNSEnums.h +2 -2
  114. package/ios/RNSOrientationProviding.h +0 -2
  115. package/ios/RNSReactMountingTransactionObserving.h +15 -0
  116. package/ios/conversion/RNSConversions.h +7 -108
  117. package/ios/legacy/RNSBarButtonItem.mm +12 -5
  118. package/ios/legacy/RNSFullWindowOverlay.mm +1 -1
  119. package/ios/legacy/RNSModalScreen.mm +1 -1
  120. package/ios/legacy/RNSScreen.h +8 -1
  121. package/ios/legacy/RNSScreen.mm +47 -36
  122. package/ios/legacy/RNSScreenContentWrapper.mm +9 -0
  123. package/ios/legacy/RNSScreenFooter.mm +2 -0
  124. package/ios/legacy/RNSScreenStack.mm +9 -4
  125. package/ios/legacy/RNSScreenStackHeaderConfig.mm +3 -1
  126. package/ios/legacy/RNSScreenStackHeaderSubview.mm +1 -1
  127. package/ios/legacy/RNSScreenWindowTraits.mm +5 -13
  128. package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.h +1 -3
  129. package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.mm +11 -22
  130. package/ios/modals/form-sheet/RNSFormSheetContentController.h +1 -1
  131. package/ios/modals/form-sheet/RNSFormSheetContentController.mm +7 -18
  132. package/ios/modals/form-sheet/RNSFormSheetContentWrapperComponentView.mm +9 -0
  133. package/ios/modals/form-sheet/RNSFormSheetHostComponentView.mm +4 -4
  134. package/ios/modals/form-sheet/RNSFormSheetHostShadowStateProxy.mm +2 -2
  135. package/ios/modals/form-sheet/RNSFormSheetUpdateFlags.h +3 -0
  136. package/ios/safe-area/RNSSafeAreaViewComponentView.mm +2 -2
  137. package/ios/scroll-to-top-guard/RNSScrollToTopGuard.h +17 -0
  138. package/ios/scroll-to-top-guard/RNSScrollToTopGuard.mm +57 -0
  139. package/ios/scroll-to-top-guard/RNSScrollToTopGuardGestureRecognizer.h +28 -0
  140. package/ios/scroll-to-top-guard/RNSScrollToTopGuardGestureRecognizer.mm +64 -0
  141. package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.mm +2 -3
  142. package/ios/split/RNSSplitAppearanceApplicator.h +36 -0
  143. package/ios/split/RNSSplitAppearanceApplicator.mm +182 -0
  144. package/ios/split/RNSSplitAppearanceCoordinator.h +26 -0
  145. package/ios/split/RNSSplitAppearanceCoordinator.mm +27 -0
  146. package/ios/split/RNSSplitAppearanceUpdateFlags.h +14 -0
  147. package/ios/split/RNSSplitHostComponentEventEmitter.h +1 -0
  148. package/ios/split/RNSSplitHostComponentEventEmitter.mm +1 -1
  149. package/ios/split/RNSSplitHostComponentView.h +5 -15
  150. package/ios/split/RNSSplitHostComponentView.mm +56 -7
  151. package/ios/split/RNSSplitHostController.h +105 -0
  152. package/ios/split/RNSSplitHostController.mm +492 -0
  153. package/ios/split/RNSSplitHostProviders.h +67 -0
  154. package/ios/split/RNSSplitNavigationController.h +31 -0
  155. package/ios/split/RNSSplitNavigationController.mm +44 -0
  156. package/ios/split/RNSSplitNavigationControllerFrameObserver.h +32 -0
  157. package/ios/split/RNSSplitNavigationControllerFrameObserver.mm +80 -0
  158. package/ios/split/RNSSplitNavigationControllerFrameOriginChangeDelegate.h +15 -0
  159. package/ios/split/RNSSplitScreenComponentView.h +0 -39
  160. package/ios/split/RNSSplitScreenComponentView.mm +35 -19
  161. package/ios/split/RNSSplitScreenController.h +68 -0
  162. package/ios/split/RNSSplitScreenController.mm +113 -0
  163. package/ios/split/RNSSplitScreenShadowStateProxy.h +1 -40
  164. package/ios/split/RNSSplitScreenShadowStateProxy.mm +1 -26
  165. package/ios/split/conversion/RNSConversions-SplitView.h +56 -0
  166. package/ios/{conversion → split/conversion}/RNSConversions-SplitView.mm +4 -1
  167. package/ios/stack/conversion/RNSConversions-Stack.h +32 -0
  168. package/ios/stack/conversion/RNSConversions-Stack.mm +55 -0
  169. package/ios/stack/header/RNSStackHeaderAppearanceMapper.h +26 -0
  170. package/ios/stack/header/RNSStackHeaderAppearanceMapper.mm +88 -0
  171. package/ios/stack/header/RNSStackHeaderConfigComponentView.h +11 -1
  172. package/ios/stack/header/RNSStackHeaderConfigComponentView.mm +108 -38
  173. package/ios/stack/header/RNSStackHeaderConfigDataProviding.h +9 -0
  174. package/ios/stack/header/RNSStackHeaderConfigShadowStateProxy.mm +1 -1
  175. package/ios/stack/header/RNSStackHeaderIconResolver.mm +7 -0
  176. package/ios/stack/header/RNSStackHeaderItemComponentView.h +3 -1
  177. package/ios/stack/header/RNSStackHeaderItemComponentView.mm +15 -2
  178. package/ios/stack/header/RNSStackHeaderItemDataProviding.h +2 -0
  179. package/ios/stack/header/RNSStackHeaderItemShadowStateProxy.mm +1 -1
  180. package/ios/stack/header/RNSStackHeaderItemSpacerComponentView.mm +2 -1
  181. package/ios/stack/header/RNSStackHeaderMenuCoordinator.h +9 -0
  182. package/ios/stack/header/RNSStackHeaderMenuCoordinator.mm +15 -0
  183. package/ios/stack/header/RNSStackHeaderMenuFinder.h +18 -3
  184. package/ios/stack/header/RNSStackHeaderMenuFinder.mm +21 -3
  185. package/ios/stack/header/RNSStackHeaderMenuMapper.mm +4 -0
  186. package/ios/stack/host/RNSStackHostComponentView.mm +3 -1
  187. package/ios/stack/host/RNSStackNavigationBar.h +25 -0
  188. package/ios/stack/host/RNSStackNavigationBar.mm +80 -0
  189. package/ios/stack/host/RNSStackNavigationBarCoordinator.h +8 -0
  190. package/ios/stack/host/RNSStackNavigationBarCoordinator.mm +11 -0
  191. package/ios/stack/host/RNSStackNavigationController.mm +14 -6
  192. package/ios/stack/host/RNSStackOperation.h +0 -2
  193. package/ios/stack/screen/RNSStackScreenComponentView.mm +9 -4
  194. package/ios/stack/screen/RNSStackScreenController.mm +12 -0
  195. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.h +14 -1
  196. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.mm +159 -28
  197. package/ios/tabs/RNSTabBarAppearanceCoordinator.mm +40 -9
  198. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.h +1 -1
  199. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.mm +4 -1
  200. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.mm +5 -2
  201. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryEventEmitter.mm +1 -1
  202. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryShadowStateProxy.mm +1 -1
  203. package/ios/tabs/conversion/RNSConversions-Tabs.h +78 -0
  204. package/ios/{conversion → tabs/conversion}/RNSConversions-Tabs.mm +8 -71
  205. package/ios/tabs/extensions/RNSTabsHostComponentView+RNSImageLoader.h +1 -1
  206. package/ios/tabs/host/RNSTabBarController.h +5 -12
  207. package/ios/tabs/host/RNSTabBarController.mm +1 -1
  208. package/ios/tabs/host/RNSTabsHostComponentView.h +2 -0
  209. package/ios/tabs/host/RNSTabsHostComponentView.mm +10 -3
  210. package/ios/tabs/host/RNSTabsHostEventEmitter.mm +1 -1
  211. package/ios/tabs/screen/RNSTabsScreenComponentView.mm +20 -5
  212. package/ios/utils/RNSDefines.h +3 -0
  213. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.ios.js +25 -0
  214. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.ios.js.map +1 -0
  215. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.js +24 -0
  216. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.js.map +1 -0
  217. package/lib/commonjs/components/scroll-to-top-guard/index.js +13 -0
  218. package/lib/commonjs/components/scroll-to-top-guard/index.js.map +1 -0
  219. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js +34 -19
  220. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  221. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js +44 -13
  222. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  223. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js +1 -22
  224. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  225. package/lib/commonjs/components/stack/header/ios/iconUtils.ios.js +33 -2
  226. package/lib/commonjs/components/stack/header/ios/iconUtils.ios.js.map +1 -1
  227. package/lib/commonjs/components/stack/header/utils.js +6 -9
  228. package/lib/commonjs/components/stack/header/utils.js.map +1 -1
  229. package/lib/commonjs/components/stack/host/StackHost.js +9 -6
  230. package/lib/commonjs/components/stack/host/StackHost.js.map +1 -1
  231. package/lib/commonjs/components/stack/index.js.map +1 -1
  232. package/lib/commonjs/components/tabs/host/TabsHost.ios.js +1 -0
  233. package/lib/commonjs/components/tabs/host/TabsHost.ios.js.map +1 -1
  234. package/lib/commonjs/experimental/index.js +11 -0
  235. package/lib/commonjs/experimental/index.js.map +1 -1
  236. package/lib/commonjs/fabric/ScrollViewMarkerNativeComponent.js.map +1 -1
  237. package/lib/commonjs/fabric/legacy/FullWindowOverlayNativeComponent.js.map +1 -1
  238. package/lib/commonjs/fabric/legacy/ModalScreenNativeComponent.js.map +1 -1
  239. package/lib/commonjs/fabric/legacy/ScreenContainerNativeComponent.js.map +1 -1
  240. package/lib/commonjs/fabric/legacy/ScreenFooterNativeComponent.js.map +1 -1
  241. package/lib/commonjs/fabric/legacy/ScreenNativeComponent.js.map +1 -1
  242. package/lib/commonjs/fabric/legacy/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  243. package/lib/commonjs/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  244. package/lib/commonjs/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  245. package/lib/commonjs/fabric/legacy/SearchBarNativeComponent.js.map +1 -1
  246. package/lib/commonjs/fabric/modals/form-sheet/FormSheetHostNativeComponent.js.map +1 -1
  247. package/lib/commonjs/fabric/safe-area/SafeAreaViewNativeComponent.js.map +1 -1
  248. package/lib/commonjs/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js +12 -0
  249. package/lib/commonjs/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js.map +1 -0
  250. package/lib/commonjs/fabric/split/SplitHostNativeComponent.js.map +1 -1
  251. package/lib/commonjs/fabric/split/SplitScreenNativeComponent.js.map +1 -1
  252. package/lib/commonjs/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  253. package/lib/commonjs/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  254. package/lib/commonjs/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  255. package/lib/commonjs/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.js.map +1 -1
  256. package/lib/commonjs/fabric/stack/StackHeaderSubviewAndroidNativeComponent.js.map +1 -1
  257. package/lib/commonjs/fabric/stack/StackHostNativeComponent.js.map +1 -1
  258. package/lib/commonjs/fabric/stack/StackScreenNativeComponent.js.map +1 -1
  259. package/lib/commonjs/fabric/tabs/TabsBottomAccessoryContentNativeComponent.js.map +1 -1
  260. package/lib/commonjs/fabric/tabs/TabsBottomAccessoryNativeComponent.js.map +1 -1
  261. package/lib/commonjs/fabric/tabs/TabsHostAndroidNativeComponent.js.map +1 -1
  262. package/lib/commonjs/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  263. package/lib/commonjs/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  264. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  265. package/lib/commonjs/flags.js +22 -1
  266. package/lib/commonjs/flags.js.map +1 -1
  267. package/lib/commonjs/legacy/components/Screen.js +6 -1
  268. package/lib/commonjs/legacy/components/Screen.js.map +1 -1
  269. package/lib/commonjs/legacy/components/ScreenStackHeaderConfig.js +5 -0
  270. package/lib/commonjs/legacy/components/ScreenStackHeaderConfig.js.map +1 -1
  271. package/lib/commonjs/legacy/components/ScreenStackItem.js.map +1 -1
  272. package/lib/commonjs/legacy/components/SearchBar.js +16 -16
  273. package/lib/commonjs/legacy/components/SearchBar.js.map +1 -1
  274. package/lib/commonjs/legacy/components/helpers/prepareHeaderBarButtonItems.js +3 -0
  275. package/lib/commonjs/legacy/components/helpers/prepareHeaderBarButtonItems.js.map +1 -1
  276. package/lib/commonjs/legacy/gesture-handler/fabricUtils.js.map +1 -1
  277. package/lib/commonjs/legacy/useTransitionProgress.js.map +1 -1
  278. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.ios.js +20 -0
  279. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.ios.js.map +1 -0
  280. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.js +18 -0
  281. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.js.map +1 -0
  282. package/lib/module/components/scroll-to-top-guard/index.js +2 -0
  283. package/lib/module/components/scroll-to-top-guard/index.js.map +1 -0
  284. package/lib/module/components/stack/header/StackHeaderConfig.android.js +35 -20
  285. package/lib/module/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  286. package/lib/module/components/stack/header/StackHeaderConfig.ios.js +48 -17
  287. package/lib/module/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  288. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js +1 -22
  289. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  290. package/lib/module/components/stack/header/ios/iconUtils.ios.js +31 -2
  291. package/lib/module/components/stack/header/ios/iconUtils.ios.js.map +1 -1
  292. package/lib/module/components/stack/header/utils.js +5 -8
  293. package/lib/module/components/stack/header/utils.js.map +1 -1
  294. package/lib/module/components/stack/host/StackHost.js +9 -6
  295. package/lib/module/components/stack/host/StackHost.js.map +1 -1
  296. package/lib/module/components/stack/index.js.map +1 -1
  297. package/lib/module/components/tabs/host/TabsHost.ios.js +1 -0
  298. package/lib/module/components/tabs/host/TabsHost.ios.js.map +1 -1
  299. package/lib/module/experimental/index.js +1 -0
  300. package/lib/module/experimental/index.js.map +1 -1
  301. package/lib/module/fabric/ScrollViewMarkerNativeComponent.js.map +1 -1
  302. package/lib/module/fabric/legacy/FullWindowOverlayNativeComponent.js.map +1 -1
  303. package/lib/module/fabric/legacy/ModalScreenNativeComponent.js.map +1 -1
  304. package/lib/module/fabric/legacy/ScreenContainerNativeComponent.js.map +1 -1
  305. package/lib/module/fabric/legacy/ScreenFooterNativeComponent.js.map +1 -1
  306. package/lib/module/fabric/legacy/ScreenNativeComponent.js.map +1 -1
  307. package/lib/module/fabric/legacy/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  308. package/lib/module/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  309. package/lib/module/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  310. package/lib/module/fabric/legacy/SearchBarNativeComponent.js.map +1 -1
  311. package/lib/module/fabric/modals/form-sheet/FormSheetHostNativeComponent.js.map +1 -1
  312. package/lib/module/fabric/safe-area/SafeAreaViewNativeComponent.js.map +1 -1
  313. package/lib/module/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js +7 -0
  314. package/lib/module/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js.map +1 -0
  315. package/lib/module/fabric/split/SplitHostNativeComponent.js.map +1 -1
  316. package/lib/module/fabric/split/SplitScreenNativeComponent.js.map +1 -1
  317. package/lib/module/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  318. package/lib/module/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  319. package/lib/module/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  320. package/lib/module/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.js.map +1 -1
  321. package/lib/module/fabric/stack/StackHeaderSubviewAndroidNativeComponent.js.map +1 -1
  322. package/lib/module/fabric/stack/StackHostNativeComponent.js.map +1 -1
  323. package/lib/module/fabric/stack/StackScreenNativeComponent.js.map +1 -1
  324. package/lib/module/fabric/tabs/TabsBottomAccessoryContentNativeComponent.js.map +1 -1
  325. package/lib/module/fabric/tabs/TabsBottomAccessoryNativeComponent.js.map +1 -1
  326. package/lib/module/fabric/tabs/TabsHostAndroidNativeComponent.js.map +1 -1
  327. package/lib/module/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  328. package/lib/module/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  329. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  330. package/lib/module/flags.js +22 -1
  331. package/lib/module/flags.js.map +1 -1
  332. package/lib/module/legacy/components/Screen.js +6 -1
  333. package/lib/module/legacy/components/Screen.js.map +1 -1
  334. package/lib/module/legacy/components/ScreenStackHeaderConfig.js +5 -0
  335. package/lib/module/legacy/components/ScreenStackHeaderConfig.js.map +1 -1
  336. package/lib/module/legacy/components/ScreenStackItem.js.map +1 -1
  337. package/lib/module/legacy/components/SearchBar.js +17 -17
  338. package/lib/module/legacy/components/SearchBar.js.map +1 -1
  339. package/lib/module/legacy/components/helpers/prepareHeaderBarButtonItems.js +4 -0
  340. package/lib/module/legacy/components/helpers/prepareHeaderBarButtonItems.js.map +1 -1
  341. package/lib/module/legacy/gesture-handler/fabricUtils.js.map +1 -1
  342. package/lib/module/legacy/useTransitionProgress.js.map +1 -1
  343. package/lib/module/private/hooks/useRenderDebugInfo.js.map +1 -1
  344. package/lib/typescript/components/modals/form-sheet/FormSheet.types.d.ts +3 -3
  345. package/lib/typescript/components/safe-area/SafeAreaView.web.d.ts +5 -2
  346. package/lib/typescript/components/safe-area/SafeAreaView.web.d.ts.map +1 -1
  347. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.d.ts +15 -0
  348. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.d.ts.map +1 -0
  349. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.ios.d.ts +12 -0
  350. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.ios.d.ts.map +1 -0
  351. package/lib/typescript/components/scroll-to-top-guard/index.d.ts +2 -0
  352. package/lib/typescript/components/scroll-to-top-guard/index.d.ts.map +1 -0
  353. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts.map +1 -1
  354. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts +639 -20
  355. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts.map +1 -1
  356. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts.map +1 -1
  357. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts +239 -2
  358. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts.map +1 -1
  359. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts +2 -2
  360. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts +5 -2
  361. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts.map +1 -1
  362. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.d.ts.map +1 -1
  363. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts +2 -0
  364. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts.map +1 -1
  365. package/lib/typescript/components/stack/header/ios/iconUtils.ios.d.ts +3 -0
  366. package/lib/typescript/components/stack/header/ios/iconUtils.ios.d.ts.map +1 -1
  367. package/lib/typescript/components/stack/header/utils.d.ts +1 -2
  368. package/lib/typescript/components/stack/header/utils.d.ts.map +1 -1
  369. package/lib/typescript/components/stack/host/StackHost.d.ts +1 -1
  370. package/lib/typescript/components/stack/host/StackHost.d.ts.map +1 -1
  371. package/lib/typescript/components/stack/host/StackHost.types.d.ts +26 -2
  372. package/lib/typescript/components/stack/host/StackHost.types.d.ts.map +1 -1
  373. package/lib/typescript/components/stack/host/StackHost.web.d.ts +6 -2
  374. package/lib/typescript/components/stack/host/StackHost.web.d.ts.map +1 -1
  375. package/lib/typescript/components/stack/index.d.ts +2 -2
  376. package/lib/typescript/components/stack/index.d.ts.map +1 -1
  377. package/lib/typescript/components/stack/screen/StackScreen.web.d.ts +5 -2
  378. package/lib/typescript/components/stack/screen/StackScreen.web.d.ts.map +1 -1
  379. package/lib/typescript/components/tabs/host/TabsHost.ios.d.ts.map +1 -1
  380. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts +16 -0
  381. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts.map +1 -1
  382. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts +3 -0
  383. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts.map +1 -1
  384. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts +5 -2
  385. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts.map +1 -1
  386. package/lib/typescript/components/tabs/screen/TabsScreen.types.d.ts +7 -3
  387. package/lib/typescript/components/tabs/screen/TabsScreen.types.d.ts.map +1 -1
  388. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts +5 -2
  389. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts.map +1 -1
  390. package/lib/typescript/experimental/index.d.ts +1 -0
  391. package/lib/typescript/experimental/index.d.ts.map +1 -1
  392. package/lib/typescript/fabric/NativeScreensModule.d.ts +1 -1
  393. package/lib/typescript/fabric/ScrollViewMarkerNativeComponent.d.ts +2 -2
  394. package/lib/typescript/fabric/ScrollViewMarkerNativeComponent.d.ts.map +1 -1
  395. package/lib/typescript/fabric/legacy/FullWindowOverlayNativeComponent.d.ts +2 -2
  396. package/lib/typescript/fabric/legacy/FullWindowOverlayNativeComponent.d.ts.map +1 -1
  397. package/lib/typescript/fabric/legacy/ModalScreenNativeComponent.d.ts +3 -2
  398. package/lib/typescript/fabric/legacy/ModalScreenNativeComponent.d.ts.map +1 -1
  399. package/lib/typescript/fabric/legacy/ScreenContainerNativeComponent.d.ts +2 -2
  400. package/lib/typescript/fabric/legacy/ScreenContainerNativeComponent.d.ts.map +1 -1
  401. package/lib/typescript/fabric/legacy/ScreenContentWrapperNativeComponent.d.ts +2 -2
  402. package/lib/typescript/fabric/legacy/ScreenContentWrapperNativeComponent.d.ts.map +1 -1
  403. package/lib/typescript/fabric/legacy/ScreenFooterNativeComponent.d.ts +2 -2
  404. package/lib/typescript/fabric/legacy/ScreenFooterNativeComponent.d.ts.map +1 -1
  405. package/lib/typescript/fabric/legacy/ScreenNativeComponent.d.ts +3 -2
  406. package/lib/typescript/fabric/legacy/ScreenNativeComponent.d.ts.map +1 -1
  407. package/lib/typescript/fabric/legacy/ScreenNavigationContainerNativeComponent.d.ts +2 -2
  408. package/lib/typescript/fabric/legacy/ScreenNavigationContainerNativeComponent.d.ts.map +1 -1
  409. package/lib/typescript/fabric/legacy/ScreenStackHeaderConfigNativeComponent.d.ts +3 -3
  410. package/lib/typescript/fabric/legacy/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -1
  411. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -2
  412. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  413. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts +2 -2
  414. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts.map +1 -1
  415. package/lib/typescript/fabric/legacy/SearchBarNativeComponent.d.ts +6 -6
  416. package/lib/typescript/fabric/legacy/SearchBarNativeComponent.d.ts.map +1 -1
  417. package/lib/typescript/fabric/modals/form-sheet/FormSheetContentWrapperNativeComponent.d.ts +2 -2
  418. package/lib/typescript/fabric/modals/form-sheet/FormSheetContentWrapperNativeComponent.d.ts.map +1 -1
  419. package/lib/typescript/fabric/modals/form-sheet/FormSheetHostNativeComponent.d.ts +2 -2
  420. package/lib/typescript/fabric/modals/form-sheet/FormSheetHostNativeComponent.d.ts.map +1 -1
  421. package/lib/typescript/fabric/safe-area/SafeAreaViewNativeComponent.d.ts +2 -2
  422. package/lib/typescript/fabric/safe-area/SafeAreaViewNativeComponent.d.ts.map +1 -1
  423. package/lib/typescript/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.d.ts +6 -0
  424. package/lib/typescript/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.d.ts.map +1 -0
  425. package/lib/typescript/fabric/split/SplitHostNativeComponent.d.ts +1 -1
  426. package/lib/typescript/fabric/split/SplitHostNativeComponent.d.ts.map +1 -1
  427. package/lib/typescript/fabric/split/SplitScreenNativeComponent.d.ts +2 -2
  428. package/lib/typescript/fabric/split/SplitScreenNativeComponent.d.ts.map +1 -1
  429. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts +53 -0
  430. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts.map +1 -1
  431. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts +27 -2
  432. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts.map +1 -1
  433. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts +4 -2
  434. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts.map +1 -1
  435. package/lib/typescript/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.d.ts +2 -2
  436. package/lib/typescript/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.d.ts.map +1 -1
  437. package/lib/typescript/fabric/stack/StackHeaderSubviewAndroidNativeComponent.d.ts +2 -2
  438. package/lib/typescript/fabric/stack/StackHeaderSubviewAndroidNativeComponent.d.ts.map +1 -1
  439. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts +4 -2
  440. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts.map +1 -1
  441. package/lib/typescript/fabric/stack/StackScreenNativeComponent.d.ts +2 -2
  442. package/lib/typescript/fabric/stack/StackScreenNativeComponent.d.ts.map +1 -1
  443. package/lib/typescript/fabric/tabs/TabsBottomAccessoryContentNativeComponent.d.ts +2 -2
  444. package/lib/typescript/fabric/tabs/TabsBottomAccessoryContentNativeComponent.d.ts.map +1 -1
  445. package/lib/typescript/fabric/tabs/TabsBottomAccessoryNativeComponent.d.ts +2 -2
  446. package/lib/typescript/fabric/tabs/TabsBottomAccessoryNativeComponent.d.ts.map +1 -1
  447. package/lib/typescript/fabric/tabs/TabsHostAndroidNativeComponent.d.ts +2 -2
  448. package/lib/typescript/fabric/tabs/TabsHostAndroidNativeComponent.d.ts.map +1 -1
  449. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts +3 -2
  450. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts.map +1 -1
  451. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts +2 -2
  452. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts.map +1 -1
  453. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts +2 -2
  454. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts.map +1 -1
  455. package/lib/typescript/flags.d.ts +13 -0
  456. package/lib/typescript/flags.d.ts.map +1 -1
  457. package/lib/typescript/legacy/TransitionProgressContext.d.ts +1 -1
  458. package/lib/typescript/legacy/TransitionProgressContext.d.ts.map +1 -1
  459. package/lib/typescript/legacy/components/Screen.d.ts +5 -3
  460. package/lib/typescript/legacy/components/Screen.d.ts.map +1 -1
  461. package/lib/typescript/legacy/components/Screen.web.d.ts +10 -2
  462. package/lib/typescript/legacy/components/Screen.web.d.ts.map +1 -1
  463. package/lib/typescript/legacy/components/ScreenContainer.web.d.ts +5 -2
  464. package/lib/typescript/legacy/components/ScreenContainer.web.d.ts.map +1 -1
  465. package/lib/typescript/legacy/components/ScreenContentWrapper.web.d.ts +5 -2
  466. package/lib/typescript/legacy/components/ScreenContentWrapper.web.d.ts.map +1 -1
  467. package/lib/typescript/legacy/components/ScreenContentWrapper.windows.d.ts +5 -2
  468. package/lib/typescript/legacy/components/ScreenContentWrapper.windows.d.ts.map +1 -1
  469. package/lib/typescript/legacy/components/ScreenFooter.web.d.ts +10 -3
  470. package/lib/typescript/legacy/components/ScreenFooter.web.d.ts.map +1 -1
  471. package/lib/typescript/legacy/components/ScreenFooter.windows.d.ts +10 -3
  472. package/lib/typescript/legacy/components/ScreenFooter.windows.d.ts.map +1 -1
  473. package/lib/typescript/legacy/components/ScreenStack.web.d.ts +5 -2
  474. package/lib/typescript/legacy/components/ScreenStack.web.d.ts.map +1 -1
  475. package/lib/typescript/legacy/components/ScreenStackHeaderConfig.d.ts +3 -1
  476. package/lib/typescript/legacy/components/ScreenStackHeaderConfig.d.ts.map +1 -1
  477. package/lib/typescript/legacy/components/ScreenStackItem.d.ts +3 -2
  478. package/lib/typescript/legacy/components/ScreenStackItem.d.ts.map +1 -1
  479. package/lib/typescript/legacy/components/SearchBar.d.ts +3 -3
  480. package/lib/typescript/legacy/components/SearchBar.d.ts.map +1 -1
  481. package/lib/typescript/legacy/components/SearchBar.web.d.ts +5 -2
  482. package/lib/typescript/legacy/components/SearchBar.web.d.ts.map +1 -1
  483. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts +15 -12
  484. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts.map +1 -1
  485. package/lib/typescript/legacy/gesture-handler/fabricUtils.d.ts +3 -2
  486. package/lib/typescript/legacy/gesture-handler/fabricUtils.d.ts.map +1 -1
  487. package/lib/typescript/legacy/types.d.ts +25 -5
  488. package/lib/typescript/legacy/types.d.ts.map +1 -1
  489. package/lib/typescript/legacy/useTransitionProgress.d.ts +2 -5
  490. package/lib/typescript/legacy/useTransitionProgress.d.ts.map +1 -1
  491. package/lib/typescript/private/hooks/useRenderDebugInfo.d.ts +2 -2
  492. package/lib/typescript/private/hooks/useRenderDebugInfo.d.ts.map +1 -1
  493. package/package.json +18 -17
  494. package/react-native.config.js +3 -0
  495. package/src/components/modals/form-sheet/FormSheet.types.ts +3 -3
  496. package/src/components/scroll-to-top-guard/ScrollToTopGuard.ios.tsx +17 -0
  497. package/src/components/scroll-to-top-guard/ScrollToTopGuard.tsx +18 -0
  498. package/src/components/scroll-to-top-guard/index.ts +1 -0
  499. package/src/components/stack/header/StackHeaderConfig.android.tsx +48 -23
  500. package/src/components/stack/header/StackHeaderConfig.android.types.ts +660 -20
  501. package/src/components/stack/header/StackHeaderConfig.ios.tsx +77 -23
  502. package/src/components/stack/header/StackHeaderConfig.ios.types.ts +251 -2
  503. package/src/components/stack/header/StackHeaderConfig.types.ts +2 -2
  504. package/src/components/stack/header/ios/StackHeaderItem.ios.tsx +1 -23
  505. package/src/components/stack/header/ios/StackHeaderItem.ios.types.ts +2 -0
  506. package/src/components/stack/header/ios/iconUtils.ios.ts +38 -2
  507. package/src/components/stack/header/utils.ts +6 -11
  508. package/src/components/stack/host/StackHost.tsx +4 -2
  509. package/src/components/stack/host/StackHost.types.ts +28 -4
  510. package/src/components/stack/index.ts +6 -1
  511. package/src/components/tabs/host/TabsHost.ios.tsx +1 -0
  512. package/src/components/tabs/host/TabsHost.ios.types.ts +16 -0
  513. package/src/components/tabs/host/TabsHost.types.ts +3 -0
  514. package/src/components/tabs/screen/TabsScreen.types.ts +7 -3
  515. package/src/experimental/index.ts +1 -0
  516. package/src/fabric/ScrollViewMarkerNativeComponent.ts +8 -2
  517. package/src/fabric/legacy/FullWindowOverlayNativeComponent.ts +6 -2
  518. package/src/fabric/legacy/ModalScreenNativeComponent.ts +8 -2
  519. package/src/fabric/legacy/ScreenContainerNativeComponent.ts +5 -2
  520. package/src/fabric/legacy/ScreenContentWrapperNativeComponent.ts +2 -2
  521. package/src/fabric/legacy/ScreenFooterNativeComponent.ts +5 -2
  522. package/src/fabric/legacy/ScreenNativeComponent.ts +8 -2
  523. package/src/fabric/legacy/ScreenNavigationContainerNativeComponent.ts +2 -2
  524. package/src/fabric/legacy/ScreenStackHeaderConfigNativeComponent.ts +8 -3
  525. package/src/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.ts +6 -2
  526. package/src/fabric/legacy/ScreenStackNativeComponent.ts +10 -2
  527. package/src/fabric/legacy/SearchBarNativeComponent.ts +10 -7
  528. package/src/fabric/modals/form-sheet/FormSheetContentWrapperNativeComponent.ts +2 -2
  529. package/src/fabric/modals/form-sheet/FormSheetHostNativeComponent.ts +7 -2
  530. package/src/fabric/safe-area/SafeAreaViewNativeComponent.ts +6 -2
  531. package/src/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.ts +10 -0
  532. package/src/fabric/split/SplitHostNativeComponent.ts +5 -2
  533. package/src/fabric/split/SplitScreenNativeComponent.ts +6 -2
  534. package/src/fabric/stack/StackHeaderConfigAndroidNativeComponent.ts +81 -1
  535. package/src/fabric/stack/StackHeaderConfigIOSNativeComponent.ts +39 -2
  536. package/src/fabric/stack/StackHeaderItemIOSNativeComponent.ts +4 -1
  537. package/src/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.ts +6 -2
  538. package/src/fabric/stack/StackHeaderSubviewAndroidNativeComponent.ts +6 -2
  539. package/src/fabric/stack/StackHostNativeComponent.ts +15 -3
  540. package/src/fabric/stack/StackScreenNativeComponent.ts +6 -2
  541. package/src/fabric/tabs/TabsBottomAccessoryContentNativeComponent.ts +6 -2
  542. package/src/fabric/tabs/TabsBottomAccessoryNativeComponent.ts +6 -2
  543. package/src/fabric/tabs/TabsHostAndroidNativeComponent.ts +7 -2
  544. package/src/fabric/tabs/TabsHostIOSNativeComponent.ts +8 -2
  545. package/src/fabric/tabs/TabsScreenAndroidNativeComponent.ts +2 -1
  546. package/src/fabric/tabs/TabsScreenIOSNativeComponent.ts +2 -1
  547. package/src/flags.ts +26 -0
  548. package/src/legacy/TransitionProgressContext.tsx +1 -1
  549. package/src/legacy/components/Screen.tsx +14 -6
  550. package/src/legacy/components/ScreenStackHeaderConfig.tsx +7 -1
  551. package/src/legacy/components/ScreenStackItem.tsx +3 -4
  552. package/src/legacy/components/SearchBar.tsx +34 -44
  553. package/src/legacy/components/helpers/prepareHeaderBarButtonItems.ts +7 -1
  554. package/src/legacy/gesture-handler/fabricUtils.ts +5 -2
  555. package/src/legacy/types.ts +28 -5
  556. package/src/legacy/useTransitionProgress.tsx +4 -2
  557. package/src/private/hooks/useRenderDebugInfo.tsx +2 -2
  558. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingView.kt +0 -83
  559. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewManager.kt +0 -89
  560. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewPointerEvents.kt +0 -18
  561. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetDetents.kt +0 -106
  562. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetDialog.kt +0 -60
  563. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetDialogManager.kt +0 -138
  564. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetDimensionsCoordinator.kt +0 -131
  565. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetNativeDismissCoordinator.kt +0 -25
  566. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetPresentationManager.kt +0 -207
  567. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderAppBarLayout.kt +0 -113
  568. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuConfig.kt +0 -60
  569. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuElementOptions.kt +0 -32
  570. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuGroupMetadata.kt +0 -16
  571. package/ios/ReactMountingTransactionObserving.swift +0 -7
  572. package/ios/bridging/Swift-Bridging.h +0 -7
  573. package/ios/conversion/RNSConversions-Stack.h +0 -32
  574. package/ios/conversion/RNSConversions-Stack.mm +0 -41
  575. package/ios/conversion/always_false.h +0 -31
  576. package/ios/orientation/RNSOrientationProviding.swift +0 -6
  577. package/ios/orientation/RNSOrientationSwift.swift +0 -14
  578. package/ios/split/RNSSplitAppearanceApplicator.swift +0 -199
  579. package/ios/split/RNSSplitAppearanceCoordinator.swift +0 -26
  580. package/ios/split/RNSSplitAppearanceUpdateFlags.swift +0 -11
  581. package/ios/split/RNSSplitHostController.swift +0 -570
  582. package/ios/split/RNSSplitNavigationController.swift +0 -46
  583. package/ios/split/RNSSplitScreenController.swift +0 -133
  584. package/ios/utils/RNSLog.swift +0 -6
  585. /package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.h +0 -0
@@ -0,0 +1,492 @@
1
+ #import "RNSSplitHostController.h"
2
+
3
+ #import <React/RCTAssert.h>
4
+ #import "RNSDefines.h"
5
+ #import "RNSSplitAppearanceApplicator.h"
6
+ #import "RNSSplitAppearanceCoordinator.h"
7
+ #import "RNSSplitNavigationController.h"
8
+ #import "RNSSplitNavigationControllerFrameOriginChangeDelegate.h"
9
+ #import "RNSSplitScreenController.h"
10
+
11
+ [[maybe_unused]] static const NSInteger minNumberOfColumns = 2;
12
+ [[maybe_unused]] static const NSInteger maxNumberOfColumns = 3;
13
+ [[maybe_unused]] static const NSInteger maxNumberOfInspectors = 1;
14
+
15
+ @interface RNSSplitHostController () <UISplitViewControllerDelegate,
16
+ RNSSplitNavigationControllerFrameOriginChangeDelegate>
17
+ @end
18
+
19
+ @implementation RNSSplitHostController {
20
+ BOOL _needsChildViewControllersUpdate;
21
+
22
+ RNSSplitAppearanceCoordinator *_splitAppearanceCoordinator;
23
+ RNSSplitAppearanceApplicator *_splitAppearanceApplicator;
24
+
25
+ /**
26
+ * This variable is keeping the value of how many columns were set in the initial render. It's used for validation,
27
+ * because Split doesn't support changing number of columns dynamically.
28
+ */
29
+ NSInteger _fixedColumnsCount;
30
+
31
+ /**
32
+ * Tracks currently visible columns of the UISplitViewController.
33
+ *
34
+ * This set is kept in sync via `UISplitViewControllerDelegate` methods (`willShow` / `willHide`)
35
+ * to reflect which columns are currently rendered in the UI.
36
+ * It ensures that only visible columns are considered (e.g. for accessing topViewController),
37
+ * avoiding crashes when certain columns are collapsed or hidden.
38
+ */
39
+ NSMutableSet<NSNumber *> *_visibleColumns;
40
+ }
41
+
42
+ - (instancetype)initWithNumberOfColumns:(NSInteger)numberOfColumns
43
+ {
44
+ if (self = [super initWithStyle:[RNSSplitHostController styleByNumberOfColumns:numberOfColumns]]) {
45
+ _splitAppearanceCoordinator = [RNSSplitAppearanceCoordinator new];
46
+ _splitAppearanceApplicator = [RNSSplitAppearanceApplicator new];
47
+ _fixedColumnsCount = numberOfColumns;
48
+ _needsChildViewControllersUpdate = NO;
49
+ _visibleColumns = [NSMutableSet set];
50
+
51
+ self.delegate = self;
52
+ }
53
+
54
+ return self;
55
+ }
56
+
57
+ #pragma mark - Signals
58
+
59
+ - (void)setNeedsUpdateOfChildViewControllers
60
+ {
61
+ _needsChildViewControllersUpdate = YES;
62
+ }
63
+
64
+ - (void)setNeedsAppearanceUpdate
65
+ {
66
+ [_splitAppearanceCoordinator needs:RNSSplitAppearanceUpdateFlagsGeneralUpdate];
67
+ }
68
+
69
+ - (void)setNeedsSecondaryScreenNavBarUpdate
70
+ {
71
+ // We noticed a bug on the pure-native component, which is blocking dynamic updates for showsSecondaryOnlyButton.
72
+ // Toggling this flag doesn't refresh the component and is updated after triggerig some other interaction, like
73
+ // changing layout.
74
+ // We noticed that we can forcefully refresh navigation bar from UINavigationController level by toggling
75
+ // setNavigationBarHidden.
76
+ // After some testing, it looks well and I haven't noticed any flicker - missing button is appearing naturally.
77
+ // Please note that this is a hack rather than a solution so feel free to remove this code in case of any problems and
78
+ // treat the bug with toggling button as a platform's issue.
79
+ [_splitAppearanceCoordinator needs:RNSSplitAppearanceUpdateFlagsSecondaryScreenNavBarUpdate];
80
+ }
81
+
82
+ - (void)setNeedsDisplayModeUpdate
83
+ {
84
+ [_splitAppearanceCoordinator needs:RNSSplitAppearanceUpdateFlagsDisplayModeUpdate];
85
+ }
86
+
87
+ - (void)setNeedsOrientationUpdate
88
+ {
89
+ [_splitAppearanceCoordinator needs:RNSSplitAppearanceUpdateFlagsOrientationUpdate];
90
+ }
91
+
92
+ #pragma mark - Updating
93
+
94
+ - (void)updateChildViewControllersIfNeeded
95
+ {
96
+ if (_needsChildViewControllersUpdate) {
97
+ [self updateChildViewControllers];
98
+ }
99
+ }
100
+
101
+ - (void)updateChildViewControllers
102
+ {
103
+ RCTAssert(_needsChildViewControllersUpdate,
104
+ @"[RNScreens] Child view controller must be invalidated when update is forced!");
105
+
106
+ NSArray<RNSSplitScreenController *> *currentColumns = [self.columnsProvider columnControllers];
107
+ NSArray<RNSSplitScreenController *> *currentInspectors = [self.columnsProvider inspectorControllers];
108
+
109
+ [self validateColumns:currentColumns];
110
+ [self validateInspectors:currentInspectors];
111
+
112
+ NSMutableArray<RNSSplitNavigationController *> *currentViewControllers =
113
+ [NSMutableArray arrayWithCapacity:currentColumns.count];
114
+ for (RNSSplitScreenController *columnController in currentColumns) {
115
+ [currentViewControllers addObject:[[RNSSplitNavigationController alloc] initWithRootViewController:columnController
116
+ frameOriginChangeDelegate:self]];
117
+ }
118
+
119
+ self.viewControllers = currentViewControllers;
120
+
121
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
122
+ if (@available(iOS 26.0, *)) {
123
+ [self maybeSetupInspector:currentInspectors];
124
+ }
125
+ #endif
126
+
127
+ _needsChildViewControllersUpdate = NO;
128
+ }
129
+
130
+ - (void)updateSplitAppearanceIfNeeded
131
+ {
132
+ [_splitAppearanceApplicator updateAppearanceIfNeeded:self.appearanceProvider
133
+ splitHostController:self
134
+ appearanceCoordinator:_splitAppearanceCoordinator];
135
+ }
136
+
137
+ - (void)refreshSecondaryNavBar
138
+ {
139
+ UIViewController *secondaryViewController = [self viewControllerForColumn:UISplitViewControllerColumnSecondary];
140
+ RCTAssert(secondaryViewController != nil,
141
+ @"[RNScreens] Failed to refresh secondary nav bar. Secondary view controller is nil.");
142
+ RCTAssert([secondaryViewController isKindOfClass:UINavigationController.class],
143
+ @"[RNScreens] Expected UINavigationController but got %@",
144
+ NSStringFromClass(secondaryViewController.class));
145
+ UINavigationController *navigationController = (UINavigationController *)secondaryViewController;
146
+
147
+ /** The assumption is that it should come in a single batch and it won't cause any delays in rendering the content. */
148
+ [navigationController setNavigationBarHidden:YES animated:NO];
149
+ [navigationController setNavigationBarHidden:NO animated:NO];
150
+ }
151
+
152
+ #pragma mark - Helpers
153
+
154
+ /**
155
+ * @brief Gets the appropriate style for a specified number of columns.
156
+ *
157
+ * This utility maps a given number of columns to the corresponding UISplitViewController.Style.
158
+ *
159
+ * @param numberOfColumns The number of columns for the SplitView.
160
+ * @return A UISplitViewController.Style corresponding to the provided column count.
161
+ */
162
+ + (UISplitViewControllerStyle)styleByNumberOfColumns:(NSInteger)numberOfColumns
163
+ {
164
+ switch (numberOfColumns) {
165
+ case 2:
166
+ return UISplitViewControllerStyleDoubleColumn;
167
+ case 3:
168
+ return UISplitViewControllerStyleTripleColumn;
169
+ default:
170
+ return UISplitViewControllerStyleUnspecified;
171
+ }
172
+ }
173
+
174
+ #pragma mark - Public setters
175
+
176
+ - (void)toggleSplitViewInspector:(BOOL)showInspector
177
+ {
178
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
179
+ if (@available(iOS 26.0, *)) {
180
+ if (showInspector) {
181
+ [self maybeShowInspector];
182
+ } else {
183
+ [self maybeHideInspector];
184
+ }
185
+ }
186
+ #endif
187
+ }
188
+
189
+ - (void)showColumnNamed:(NSString *)columnName
190
+ {
191
+ NSNumber *column = [self splitViewColumnFromString:columnName];
192
+ RCTAssert(column != nil, @"[RNScreens] Unknown column name: %@", columnName);
193
+ if (column == nil) {
194
+ return;
195
+ }
196
+
197
+ [self showColumn:(UISplitViewControllerColumn)column.integerValue];
198
+ }
199
+
200
+ /**
201
+ * @brief Maps a string column name to its corresponding `UISplitViewController.Column` value.
202
+ *
203
+ * @param name The column name string: `"primary"`, `"supplementary"`, or `"secondary"`.
204
+ * @return The corresponding `UISplitViewController.Column`, or `nil` if the name is not recognized.
205
+ */
206
+ - (nullable NSNumber *)splitViewColumnFromString:(NSString *)name
207
+ {
208
+ if ([name isEqualToString:@"primary"]) {
209
+ return @(UISplitViewControllerColumnPrimary);
210
+ }
211
+ if ([name isEqualToString:@"supplementary"]) {
212
+ return @(UISplitViewControllerColumnSupplementary);
213
+ }
214
+ if ([name isEqualToString:@"secondary"]) {
215
+ return @(UISplitViewControllerColumnSecondary);
216
+ }
217
+
218
+ return nil;
219
+ }
220
+
221
+ #pragma mark - RNSReactMountingTransactionObserving
222
+
223
+ /** @brief Called before mounting transaction. */
224
+ - (void)reactMountingTransactionWillMount
225
+ {
226
+ // noop
227
+ }
228
+
229
+ /**
230
+ * @brief Called after mounting transaction.
231
+ *
232
+ * Updates children and the appearance, checks if the hierarchy is valid after applying updates.
233
+ */
234
+ - (void)reactMountingTransactionDidMount
235
+ {
236
+ [self updateChildViewControllersIfNeeded];
237
+ [self updateSplitAppearanceIfNeeded];
238
+ [self validateSplitViewHierarchy];
239
+ }
240
+
241
+ #pragma mark - RNSOrientationProviding
242
+
243
+ - (RNSOrientation)evaluateOrientation
244
+ {
245
+ return self.appearanceProvider.orientation;
246
+ }
247
+
248
+ #pragma mark - Validators
249
+
250
+ /** @brief Validates that child structure meets required constraints defined for columns and the inspector. */
251
+ - (void)validateSplitViewHierarchy
252
+ {
253
+ [self validateColumns:[self.columnsProvider columnControllers]];
254
+ [self validateInspectors:[self.columnsProvider inspectorControllers]];
255
+ }
256
+
257
+ /** @brief Ensures that number of columns is valid and hasn't changed dynamically. */
258
+ - (void)validateColumns:(NSArray<RNSSplitScreenController *> *)columns
259
+ {
260
+ RCTAssert((NSInteger)columns.count >= minNumberOfColumns && (NSInteger)columns.count <= maxNumberOfColumns,
261
+ @"[RNScreens] Split can only have from %ld to %ld columns",
262
+ (long)minNumberOfColumns,
263
+ (long)maxNumberOfColumns);
264
+
265
+ RCTAssert((NSInteger)columns.count == _fixedColumnsCount,
266
+ @"[RNScreens] Split number of columns shouldn't change dynamically");
267
+ }
268
+
269
+ /** @brief Ensures that at most one inspector is present. */
270
+ - (void)validateInspectors:(NSArray<RNSSplitScreenController *> *)inspectors
271
+ {
272
+ RCTAssert((NSInteger)inspectors.count <= maxNumberOfInspectors,
273
+ @"[RNScreens] Split can only have %ld inspector",
274
+ (long)maxNumberOfInspectors);
275
+ }
276
+
277
+ /**
278
+ * @brief Gets the children RNSSplitScreenController instances.
279
+ *
280
+ * Accesses Split controllers associated with presented columns. It asserts that each view controller is a navigation
281
+ * controller and its topViewController is of type RNSSplitScreenController.
282
+ *
283
+ * @return An array of RNSSplitScreenController corresponding to current split view columns.
284
+ */
285
+ - (NSArray<RNSSplitScreenController *> *)splitScreenControllers
286
+ {
287
+ NSMutableArray<RNSSplitScreenController *> *splitScreenControllers =
288
+ [NSMutableArray arrayWithCapacity:_visibleColumns.count];
289
+
290
+ for (NSNumber *columnNumber in _visibleColumns) {
291
+ UISplitViewControllerColumn column = (UISplitViewControllerColumn)columnNumber.integerValue;
292
+ UIViewController *viewController = [self viewControllerForColumn:column];
293
+ RCTAssert(viewController != nil, @"[RNScreens] viewController for column %ld is nil.", (long)column);
294
+
295
+ RNSSplitNavigationController *splitNavigationController =
296
+ [viewController isKindOfClass:RNSSplitNavigationController.class]
297
+ ? (RNSSplitNavigationController *)viewController
298
+ : nil;
299
+ RCTAssert(splitNavigationController != nil,
300
+ @"[RNScreens] Expected RNSSplitNavigationController but got %@",
301
+ NSStringFromClass(viewController.class));
302
+
303
+ UIViewController *maybeSplitScreenController = splitNavigationController.topViewController;
304
+ RCTAssert(
305
+ maybeSplitScreenController != nil, @"[RNScreens] RNSSplitScreenController is nil for column %ld", (long)column);
306
+ RCTAssert([maybeSplitScreenController isKindOfClass:RNSSplitScreenController.class],
307
+ @"[RNScreens] Expected RNSSplitScreenController but got %@",
308
+ NSStringFromClass(maybeSplitScreenController.class));
309
+
310
+ if ([maybeSplitScreenController isKindOfClass:RNSSplitScreenController.class]) {
311
+ [splitScreenControllers addObject:(RNSSplitScreenController *)maybeSplitScreenController];
312
+ }
313
+ }
314
+
315
+ return splitScreenControllers;
316
+ }
317
+
318
+ #pragma mark - RNSSplitNavigationControllerFrameOriginChangeDelegate
319
+
320
+ /**
321
+ * @brief Notifies that an origin of parent RNSSplitNavigationController frame has changed.
322
+ *
323
+ * It iterates over children controllers and notifies them for the layout update.
324
+ *
325
+ * @param splitNavCtrl The navigation controller whose frame origin changed.
326
+ */
327
+ - (void)splitNavigationControllerFrameOriginDidChange:(RNSSplitNavigationController *)splitNavCtrl
328
+ {
329
+ for (RNSSplitScreenController *controller in self.splitScreenControllers) {
330
+ [controller columnPositioningDidChangeInSplitViewController:self];
331
+ }
332
+ }
333
+
334
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
335
+
336
+ /**
337
+ * @brief Sets up the inspector column if available.
338
+ * @remarks Inspector columns is available only on iOS 26 or higher.
339
+ *
340
+ * Attaches a view controller for the inspector column.
341
+ *
342
+ * @param inspectors An array of controllers of the inspector-type columns.
343
+ */
344
+ - (void)maybeSetupInspector:(NSArray<RNSSplitScreenController *> *)inspectors
345
+ {
346
+ #if !TARGET_OS_TV
347
+ if (@available(iOS 26.0, *)) {
348
+ RNSSplitScreenController *inspector = inspectors.firstObject;
349
+ if (inspector != nil) {
350
+ RNSSplitNavigationController *inspectorViewController =
351
+ [[RNSSplitNavigationController alloc] initWithRootViewController:inspector];
352
+ [self setViewController:inspectorViewController forColumn:UISplitViewControllerColumnInspector];
353
+ }
354
+ }
355
+ #endif
356
+ }
357
+
358
+ /**
359
+ * @brief Shows the inspector column when available.
360
+ * @remarks Inspector columns is available only on iOS 26 or higher.
361
+ *
362
+ * Uses the UISplitViewController's new API introduced in iOS 26 to show the inspector column.
363
+ */
364
+ - (void)maybeShowInspector
365
+ {
366
+ #if !TARGET_OS_TV
367
+ if (@available(iOS 26.0, *)) {
368
+ [self showColumn:UISplitViewControllerColumnInspector];
369
+ }
370
+ #endif
371
+ }
372
+
373
+ /**
374
+ * @brief Hides the inspector column when available.
375
+ * @remarks Inspector columns is available only on iOS 26 or higher.
376
+ *
377
+ * Uses the UISplitViewController's new API introduced in iOS 26 to hide the inspector column.
378
+ */
379
+ - (void)maybeHideInspector
380
+ {
381
+ #if !TARGET_OS_TV
382
+ if (@available(iOS 26.0, *)) {
383
+ [self hideColumn:UISplitViewControllerColumnInspector];
384
+ }
385
+ #endif
386
+ }
387
+
388
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
389
+
390
+ #pragma mark - UISplitViewControllerDelegate
391
+
392
+ - (void)splitViewController:(UISplitViewController *)svc willShowColumn:(UISplitViewControllerColumn)column
393
+ {
394
+ [_visibleColumns addObject:@(column)];
395
+ }
396
+
397
+ - (void)splitViewController:(UISplitViewController *)svc willHideColumn:(UISplitViewControllerColumn)column
398
+ {
399
+ [_visibleColumns removeObject:@(column)];
400
+ }
401
+
402
+ - (void)splitViewControllerDidCollapse:(UISplitViewController *)svc
403
+ {
404
+ [self.eventsDelegate splitHostControllerDidCollapse:self];
405
+ }
406
+
407
+ - (void)splitViewControllerDidExpand:(UISplitViewController *)svc
408
+ {
409
+ [self.eventsDelegate splitHostControllerDidExpand:self];
410
+ }
411
+
412
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
413
+
414
+ /**
415
+ * @brief Called after a column in the split view controller has been hidden from the interface.
416
+ *
417
+ * Currently emits onHideInspector event for the inspector if applicable.
418
+ *
419
+ * @param svc The split view controller that just hid the column.
420
+ * @param column The column that was hidden.
421
+ */
422
+ - (void)splitViewController:(UISplitViewController *)svc didHideColumn:(UISplitViewControllerColumn)column
423
+ {
424
+ #if !TARGET_OS_TV
425
+ if (@available(iOS 26.0, *)) {
426
+ // TODO: we may consider removing this logic, because it could be handled by onViewDidDisappear on the column level
427
+ // On the other hand, maybe dedicated event related to the inspector would be a better approach.
428
+ // For now I am leaving it, but feel free to drop this method if there's any reason that `onDidDisappear` works
429
+ // better.
430
+
431
+ if (column != UISplitViewControllerColumnInspector) {
432
+ return;
433
+ }
434
+
435
+ // `didHide` for modal is called on finger down for dismiss, what is problematic, because we can cancel dismissing
436
+ // modal.
437
+ // In this scenario, the modal inspector might receive an invalid state and will deviate from the JS value.
438
+ // Therefore, for event emissions, we need to ensure that the view was detached from the view hierarchy, by checking
439
+ // its window.
440
+ UIViewController *inspectorViewController = [self viewControllerForColumn:UISplitViewControllerColumnInspector];
441
+ if (inspectorViewController != nil) {
442
+ if (inspectorViewController.view.window == nil) {
443
+ [self.eventsDelegate splitHostControllerDidHideInspector:self];
444
+ }
445
+ }
446
+ }
447
+ #endif
448
+ }
449
+
450
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
451
+
452
+ - (void)splitViewController:(UISplitViewController *)svc
453
+ willChangeToDisplayMode:(UISplitViewControllerDisplayMode)displayMode
454
+ {
455
+ if (self.displayMode != displayMode) {
456
+ [self.eventsDelegate splitHostController:self willChangeDisplayModeFrom:self.displayMode to:displayMode];
457
+ }
458
+
459
+ __weak auto weakSelf = self;
460
+ void (^notifyColumnPositioningDidChange)(void) = ^{
461
+ auto strongSelf = weakSelf;
462
+ if (strongSelf == nil) {
463
+ return;
464
+ }
465
+
466
+ for (RNSSplitScreenController *controller in [strongSelf splitScreenControllers]) {
467
+ [controller columnPositioningDidChangeInSplitViewController:strongSelf];
468
+ }
469
+ };
470
+
471
+ id<UIViewControllerTransitionCoordinator> coordinator = svc.transitionCoordinator;
472
+ if (coordinator != nil) {
473
+ [coordinator animateAlongsideTransition:nil
474
+ completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
475
+ notifyColumnPositioningDidChange();
476
+ }];
477
+ } else {
478
+ notifyColumnPositioningDidChange();
479
+ }
480
+ }
481
+
482
+ - (UISplitViewControllerColumn)splitViewController:(UISplitViewController *)svc
483
+ topColumnForCollapsingToProposedTopColumn:(UISplitViewControllerColumn)proposedTopColumn
484
+ {
485
+ if (self.behaviorProvider.hasCustomTopColumnForCollapsing) {
486
+ return self.behaviorProvider.topColumnForCollapsingColumn;
487
+ }
488
+
489
+ return proposedTopColumn;
490
+ }
491
+
492
+ @end
@@ -0,0 +1,67 @@
1
+ #pragma once
2
+
3
+ #import <UIKit/UIKit.h>
4
+ #import "RNSDefines.h"
5
+ #import "RNSEnums.h"
6
+
7
+ NS_ASSUME_NONNULL_BEGIN
8
+
9
+ @class RNSSplitScreenController;
10
+
11
+ /**
12
+ * @brief Configuration of the UISplitViewController appearance.
13
+ */
14
+ @protocol RNSSplitHostAppearanceProvider <NSObject>
15
+
16
+ - (UISplitViewControllerSplitBehavior)preferredSplitBehavior;
17
+ - (UISplitViewControllerPrimaryEdge)primaryEdge;
18
+ - (UISplitViewControllerDisplayMode)preferredDisplayMode;
19
+ - (UISplitViewControllerDisplayModeButtonVisibility)displayModeButtonVisibility;
20
+ #if !TARGET_OS_TV
21
+ - (UISplitViewControllerBackgroundStyle)primaryBackgroundStyle;
22
+ #endif // !TARGET_OS_TV
23
+ - (BOOL)presentsWithGesture;
24
+ - (BOOL)showSecondaryToggleButton;
25
+ - (BOOL)showInspector;
26
+
27
+ - (double)minimumPrimaryColumnWidth;
28
+ - (double)maximumPrimaryColumnWidth;
29
+ - (double)preferredPrimaryColumnWidthOrFraction;
30
+ - (double)minimumSupplementaryColumnWidth;
31
+ - (double)maximumSupplementaryColumnWidth;
32
+ - (double)preferredSupplementaryColumnWidthOrFraction;
33
+
34
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
35
+ - (double)minimumSecondaryColumnWidth;
36
+ - (double)preferredSecondaryColumnWidthOrFraction;
37
+ - (double)minimumInspectorColumnWidth;
38
+ - (double)maximumInspectorColumnWidth;
39
+ - (double)preferredInspectorColumnWidthOrFraction;
40
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
41
+
42
+ - (RNSOrientation)orientation;
43
+ - (UIUserInterfaceStyle)colorScheme;
44
+
45
+ @end
46
+
47
+ /**
48
+ * @brief Behavior consulted by the UISplitViewController delegate callbacks.
49
+ */
50
+ @protocol RNSSplitHostBehaviorProvider <NSObject>
51
+
52
+ - (BOOL)hasCustomTopColumnForCollapsing;
53
+ - (UISplitViewControllerColumn)topColumnForCollapsingColumn;
54
+
55
+ @end
56
+
57
+ /**
58
+ * @brief Controllers of the columns mounted in the host, in React order, split by column type.
59
+ */
60
+ @protocol RNSSplitHostColumnsProvider <NSObject>
61
+
62
+ - (NSArray<RNSSplitScreenController *> *)columnControllers;
63
+ - (NSArray<RNSSplitScreenController *> *)inspectorControllers;
64
+
65
+ @end
66
+
67
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,31 @@
1
+ #pragma once
2
+
3
+ #import <UIKit/UIKit.h>
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ @protocol RNSSplitNavigationControllerFrameOriginChangeDelegate;
8
+
9
+ /**
10
+ * @class RNSSplitNavigationController
11
+ * @brief A subclass of UINavigationController, creates a view that wraps view associated with
12
+ * RNSSplitScreenController.
13
+ *
14
+ * UISplitViewController resizes column views natively - on display mode change or column resize, so
15
+ * these updates should be passed to React to allow syncing the ShadowTree layout of SplitViewScreen
16
+ * subtree. This controller observes its own view's frame via KVO and notifies `viewFrameOriginChangeDelegate`
17
+ * whenever the frame origin changes.
18
+ */
19
+ @interface RNSSplitNavigationController : UINavigationController
20
+
21
+ /**
22
+ * Initializes the controller with a delegate notified whenever the origin of this controller's
23
+ * view frame changes.
24
+ */
25
+ - (instancetype)initWithRootViewController:(UIViewController *)rootViewController
26
+ frameOriginChangeDelegate:
27
+ (nullable id<RNSSplitNavigationControllerFrameOriginChangeDelegate>)frameOriginChangeDelegate;
28
+
29
+ @end
30
+
31
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,44 @@
1
+ #import "RNSSplitNavigationController.h"
2
+ #import "RNSSplitNavigationControllerFrameObserver.h"
3
+ #import "RNSSplitNavigationControllerFrameOriginChangeDelegate.h"
4
+
5
+ @implementation RNSSplitNavigationController {
6
+ RNSSplitNavigationControllerFrameObserver *_frameObserver;
7
+ id<RNSSplitNavigationControllerFrameOriginChangeDelegate> __weak _frameOriginChangeDelegate;
8
+ }
9
+
10
+ - (instancetype)initWithRootViewController:(UIViewController *)rootViewController
11
+ frameOriginChangeDelegate:
12
+ (id<RNSSplitNavigationControllerFrameOriginChangeDelegate>)frameOriginChangeDelegate
13
+ {
14
+ if (self = [super initWithRootViewController:rootViewController]) {
15
+ _frameOriginChangeDelegate = frameOriginChangeDelegate;
16
+ }
17
+
18
+ return self;
19
+ }
20
+
21
+ /**
22
+ * @brief Called after the view controller’s view has been loaded.
23
+ *
24
+ * Sets up a frame-origin Key-Value Observer to monitor view position changes and propagate them via delegate to
25
+ * RNSSplitHostController.
26
+ */
27
+ - (void)viewDidLoad
28
+ {
29
+ [super viewDidLoad];
30
+
31
+ if (_frameObserver == nil) {
32
+ _frameObserver = [[RNSSplitNavigationControllerFrameObserver alloc]
33
+ initWithSplitNavigationController:self
34
+ delegate:_frameOriginChangeDelegate];
35
+ }
36
+ [_frameObserver registerForViewFrameChanges];
37
+ }
38
+
39
+ - (void)dealloc
40
+ {
41
+ [_frameObserver unregisterForViewFrameChanges];
42
+ }
43
+
44
+ @end
@@ -0,0 +1,32 @@
1
+ #pragma once
2
+
3
+ #import <UIKit/UIKit.h>
4
+ #import "RNSSplitNavigationController.h"
5
+
6
+ NS_ASSUME_NONNULL_BEGIN
7
+
8
+ @protocol RNSSplitNavigationControllerFrameOriginChangeDelegate;
9
+
10
+ /**
11
+ * @class RNSSplitNavigationControllerFrameObserver
12
+ * @brief Class responsible for observing frame origin changes of RNSSplitNavigationController's view.
13
+ */
14
+ @interface RNSSplitNavigationControllerFrameObserver : NSObject
15
+
16
+ - (instancetype)initWithSplitNavigationController:(RNSSplitNavigationController *)navigationController
17
+ delegate:(nullable id<RNSSplitNavigationControllerFrameOriginChangeDelegate>)
18
+ frameOriginChangeDelegate;
19
+
20
+ /**
21
+ * Registers KVO for the frame of navigation controller's view.
22
+ * It must be called after the navigation controller's view is loaded.
23
+ */
24
+ - (void)registerForViewFrameChanges;
25
+ /**
26
+ * Removes the KVO registration set up by `registerForViewFrameChanges`.
27
+ */
28
+ - (void)unregisterForViewFrameChanges;
29
+
30
+ @end
31
+
32
+ NS_ASSUME_NONNULL_END