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
@@ -85,6 +85,12 @@ class ScreenStackFragment :
85
85
 
86
86
  private var lastInsetsCompat: WindowInsetsCompat? = null
87
87
 
88
+ // Container reference is captured at registration, because `screen.container` is already
89
+ // null during teardown. Necessary for unregistering inset & layout listeners in `onDestroyView`.
90
+ private var containerWithSheetListeners: ScreenContainer? = null
91
+ private var containerOnLayoutChangeListener: View.OnLayoutChangeListener? = null
92
+ private var containerOnApplyWindowInsetsListener: View.OnApplyWindowInsetsListener? = null
93
+
88
94
  @SuppressLint("ValidFragment")
89
95
  constructor(screenView: Screen) : super(screenView)
90
96
 
@@ -337,6 +343,7 @@ class ScreenStackFragment :
337
343
  // - Screen.fragment
338
344
  lastActiveHeaderConfig?.clearActionBarIfOwned(activity as? AppCompatActivity)
339
345
  lastActiveHeaderConfig = null
346
+ detachInsetsAndLayoutListenersFromContainer()
340
347
  super.onDestroyView()
341
348
  }
342
349
 
@@ -522,15 +529,20 @@ class ScreenStackFragment :
522
529
  // Mark: Avoiding top inset by BottomSheet
523
530
 
524
531
  private fun attachInsetsAndLayoutListenersToBottomSheet(sheetTransitionCoordinator: BottomSheetTransitionCoordinator) {
525
- screen.container?.apply {
532
+ screen.container?.let { container ->
533
+ containerWithSheetListeners = container
534
+
526
535
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
527
- setOnApplyWindowInsetsListener { _, insets ->
528
- val insetsCompat = WindowInsetsCompat.toWindowInsetsCompat(insets, this)
529
- handleInsetsUpdateAndNotifyTransition(
530
- insetsCompat,
531
- )
532
- insets
533
- }
536
+ val insetsListener =
537
+ View.OnApplyWindowInsetsListener { _, insets ->
538
+ val insetsCompat = WindowInsetsCompat.toWindowInsetsCompat(insets, container)
539
+ handleInsetsUpdateAndNotifyTransition(
540
+ insetsCompat,
541
+ )
542
+ insets
543
+ }
544
+ containerOnApplyWindowInsetsListener = insetsListener
545
+ container.setOnApplyWindowInsetsListener(insetsListener)
534
546
  } else {
535
547
  val bottomSheetWindowInsetListenerChain = requireBottomSheetWindowInsetsListenerChain()
536
548
  bottomSheetWindowInsetListenerChain.addListener { _, windowInsets ->
@@ -540,11 +552,28 @@ class ScreenStackFragment :
540
552
  windowInsets
541
553
  }
542
554
  }
555
+
556
+ val layoutChangeListener =
557
+ View.OnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
558
+ sheetTransitionCoordinator.onScreenContainerLayoutChanged(screen)
559
+ }
560
+ containerOnLayoutChangeListener = layoutChangeListener
561
+ container.addOnLayoutChangeListener(layoutChangeListener)
543
562
  }
563
+ }
544
564
 
545
- screen.container?.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
546
- sheetTransitionCoordinator.onScreenContainerLayoutChanged(screen)
565
+ private fun detachInsetsAndLayoutListenersFromContainer() {
566
+ containerWithSheetListeners?.let { container ->
567
+ if (containerOnLayoutChangeListener != null) {
568
+ container.removeOnLayoutChangeListener(containerOnLayoutChangeListener)
569
+ }
570
+ if (containerOnApplyWindowInsetsListener != null) {
571
+ container.setOnApplyWindowInsetsListener(null)
572
+ }
547
573
  }
574
+ containerWithSheetListeners = null
575
+ containerOnLayoutChangeListener = null
576
+ containerOnApplyWindowInsetsListener = null
548
577
  }
549
578
 
550
579
  private fun handleInsetsUpdateAndNotifyTransition(insetsCompat: WindowInsetsCompat) {
@@ -323,6 +323,11 @@ open class ScreenViewManager :
323
323
  value: Boolean,
324
324
  ) = Unit
325
325
 
326
+ override fun setIosOrientationInheritanceFixEnabled(
327
+ view: Screen?,
328
+ value: Boolean,
329
+ ) = Unit
330
+
326
331
  // END mark: iOS-only
327
332
 
328
333
  override fun setAndroidResetScreenShadowStateOnOrientationChangeEnabled(
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.native.coordinator
2
2
 
3
3
  import android.os.Build
4
4
  import android.widget.FrameLayout
@@ -6,6 +6,7 @@ import androidx.core.view.doOnNextLayout
6
6
  import com.google.android.material.shape.CornerFamily
7
7
  import com.google.android.material.shape.MaterialShapeDrawable
8
8
  import com.google.android.material.shape.ShapeAppearanceModel
9
+ import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetConfig
9
10
  import com.swmansion.rnscreens.utils.dpToPx
10
11
 
11
12
  internal class FormSheetAppearanceCoordinator(
@@ -1,8 +1,9 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.native.coordinator
2
2
 
3
3
  import android.view.View
4
4
  import android.widget.FrameLayout
5
5
  import com.google.android.material.bottomsheet.BottomSheetBehavior
6
+ import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetDetents
6
7
 
7
8
  internal class FormSheetBehaviorController(
8
9
  private val sheetView: FrameLayout,
@@ -12,6 +13,7 @@ internal class FormSheetBehaviorController(
12
13
 
13
14
  private var currentDetentsCount: Int = 1
14
15
  private var lastEmittedDetentIndex: Int = FORM_SHEET_UNKNOWN_DETENT_INDEX
16
+ private var lastStableState: Int = BottomSheetBehavior.STATE_COLLAPSED
15
17
 
16
18
  private val bottomSheetCallback =
17
19
  object : BottomSheetBehavior.BottomSheetCallback() {
@@ -19,6 +21,8 @@ internal class FormSheetBehaviorController(
19
21
  bottomSheet: View,
20
22
  newState: Int,
21
23
  ) {
24
+ rememberStateIfStable(newState)
25
+
22
26
  val index = mapStateToDetentIndex(newState)
23
27
  if (index != FORM_SHEET_UNKNOWN_DETENT_INDEX && index != lastEmittedDetentIndex) {
24
28
  lastEmittedDetentIndex = index
@@ -34,6 +38,7 @@ internal class FormSheetBehaviorController(
34
38
 
35
39
  init {
36
40
  behavior.isHideable = true
41
+ rememberStateIfStable(behavior.state)
37
42
  }
38
43
 
39
44
  internal fun setup() {
@@ -44,7 +49,29 @@ internal class FormSheetBehaviorController(
44
49
  behavior.removeBottomSheetCallback(bottomSheetCallback)
45
50
  }
46
51
 
52
+ internal fun restoreLastStableState() {
53
+ if (behavior.state != BottomSheetBehavior.STATE_HIDDEN) {
54
+ return
55
+ }
56
+
57
+ behavior.state = lastStableState
58
+ }
59
+
60
+ private fun rememberStateIfStable(state: Int) {
61
+ val isVisibleRestingState =
62
+ state == BottomSheetBehavior.STATE_EXPANDED ||
63
+ state == BottomSheetBehavior.STATE_COLLAPSED ||
64
+ state == BottomSheetBehavior.STATE_HALF_EXPANDED
65
+
66
+ if (isVisibleRestingState) {
67
+ lastStableState = state
68
+ }
69
+ }
70
+
47
71
  /**
72
+ * Expected to be called from the measure pass, before the sheet is measured (see
73
+ * `FormSheetAvailableHeightProvider`), so the metrics below are consumed by the ongoing traversal.
74
+ *
48
75
  * @param detents - parsed detents configuration.
49
76
  * @param sheetAvailableSpace - the full window height that detent fractions are measured against.
50
77
  * Using the full height lets a BottomSheet with large detent configured to slide
@@ -53,7 +80,11 @@ internal class FormSheetBehaviorController(
53
80
  * Used exclusively when the sheet is in `fitToContents` mode.
54
81
  * @param nativeContainerPaddingBottom - the bottom system inset. In `fitToContents` mode, this is added to the
55
82
  * BottomSheet's height to extend its background behind the system bars, while the inner content remains within
56
- * the safe area.
83
+ * the safe area. For fractional detents it is subtracted from the collapsed peek height, which Material resolves
84
+ * above the inset, so the lowest detent lands at its fraction of [sheetAvailableSpace] like the other ones.
85
+ * @param keyboardLift - the part of the keyboard inset above [nativeContainerPaddingBottom]. Every resting position
86
+ * is extended by it so the sheet is pushed above the keyboard as far as [sheetAvailableSpace] allows,
87
+ * see [FormSheetDetents].
57
88
  * @param initialDetentIndex - the index of the detent the sheet should snap to while opening.
58
89
  * @param applyInitialDetent - whether the sheet should forcefully snap to the initial detent state.
59
90
  * This should typically be `true` only when the sheet transitions from closed to open.
@@ -63,6 +94,7 @@ internal class FormSheetBehaviorController(
63
94
  sheetAvailableSpace: Int,
64
95
  contentHeightForFitToContents: Int = 0,
65
96
  nativeContainerPaddingBottom: Int = 0,
97
+ keyboardLift: Int = 0,
66
98
  initialDetentIndex: Int = 0,
67
99
  applyInitialDetent: Boolean = false,
68
100
  ) {
@@ -73,22 +105,39 @@ internal class FormSheetBehaviorController(
73
105
  }
74
106
 
75
107
  if (detents.isFitToContents) {
76
- configureFitToContents(detents, sheetAvailableSpace, contentHeightForFitToContents, nativeContainerPaddingBottom)
108
+ configureFitToContents(
109
+ detents,
110
+ sheetAvailableSpace,
111
+ contentHeightForFitToContents,
112
+ nativeContainerPaddingBottom,
113
+ keyboardLift,
114
+ )
77
115
  } else {
78
116
  when (detents.count) {
79
- 1 -> configureSingleDetent(detents, sheetAvailableSpace)
80
- 2 -> configureTwoDetents(detents, sheetAvailableSpace, initialDetentIndex, applyInitialDetent)
81
- 3 -> configureThreeDetents(detents, sheetAvailableSpace, initialDetentIndex, applyInitialDetent)
117
+ 1 -> configureSingleDetent(detents, sheetAvailableSpace, keyboardLift)
118
+ 2 ->
119
+ configureTwoDetents(
120
+ detents,
121
+ sheetAvailableSpace,
122
+ nativeContainerPaddingBottom,
123
+ keyboardLift,
124
+ initialDetentIndex,
125
+ applyInitialDetent,
126
+ )
127
+ 3 ->
128
+ configureThreeDetents(
129
+ detents,
130
+ sheetAvailableSpace,
131
+ nativeContainerPaddingBottom,
132
+ keyboardLift,
133
+ initialDetentIndex,
134
+ applyInitialDetent,
135
+ )
82
136
  else -> throw IllegalStateException(
83
137
  "[RNScreens] Unsupported detent count ${detents.count}.",
84
138
  )
85
139
  }
86
140
  }
87
-
88
- // Metrics were mutated on an already-measured sheet; force a fresh layout
89
- // pass so the behavior re-settles to the new detent instead of keeping its
90
- // stale height.
91
- sheetView.requestLayout()
92
141
  }
93
142
 
94
143
  private fun configureFitToContents(
@@ -96,33 +145,37 @@ internal class FormSheetBehaviorController(
96
145
  sheetAvailableSpace: Int,
97
146
  contentHeight: Int,
98
147
  bottomInset: Int,
148
+ keyboardLift: Int,
99
149
  ) = behavior.apply {
100
150
  skipCollapsed = true
101
151
  isFitToContents = true
102
- maxHeight = detents.maxAllowedHeightForFitToContents(sheetAvailableSpace, contentHeight, bottomInset)
152
+ maxHeight = detents.maxAllowedHeightForFitToContents(sheetAvailableSpace, contentHeight, bottomInset, keyboardLift)
103
153
  state = BottomSheetBehavior.STATE_EXPANDED
104
154
  }
105
155
 
106
156
  private fun configureSingleDetent(
107
157
  detents: FormSheetDetents,
108
158
  sheetAvailableSpace: Int,
159
+ keyboardLift: Int,
109
160
  ) = behavior.apply {
110
161
  skipCollapsed = true
111
162
  isFitToContents = true
112
- maxHeight = detents.maxAllowedHeight(sheetAvailableSpace)
163
+ maxHeight = detents.maxAllowedHeight(sheetAvailableSpace, keyboardLift)
113
164
  state = BottomSheetBehavior.STATE_EXPANDED
114
165
  }
115
166
 
116
167
  private fun configureTwoDetents(
117
168
  detents: FormSheetDetents,
118
169
  sheetAvailableSpace: Int,
170
+ bottomInset: Int,
171
+ keyboardLift: Int,
119
172
  initialDetentIndex: Int,
120
173
  applyInitialDetent: Boolean,
121
174
  ) = behavior.apply {
122
175
  skipCollapsed = false
123
176
  isFitToContents = true
124
- peekHeight = detents.firstHeight(sheetAvailableSpace)
125
- maxHeight = detents.maxAllowedHeight(sheetAvailableSpace)
177
+ peekHeight = detents.peekHeight(sheetAvailableSpace, bottomInset, keyboardLift)
178
+ maxHeight = detents.maxAllowedHeight(sheetAvailableSpace, keyboardLift)
126
179
  if (applyInitialDetent) {
127
180
  state = resolveStateFromIndex(initialDetentIndex, detents.count)
128
181
  }
@@ -131,15 +184,17 @@ internal class FormSheetBehaviorController(
131
184
  private fun configureThreeDetents(
132
185
  detents: FormSheetDetents,
133
186
  sheetAvailableSpace: Int,
187
+ bottomInset: Int,
188
+ keyboardLift: Int,
134
189
  initialDetentIndex: Int,
135
190
  applyInitialDetent: Boolean,
136
191
  ) = behavior.apply {
137
192
  skipCollapsed = false
138
193
  isFitToContents = false
139
- peekHeight = detents.firstHeight(sheetAvailableSpace)
140
- halfExpandedRatio = detents.halfExpandedRatio()
141
- expandedOffset = detents.expandedOffsetFromTop(sheetAvailableSpace)
142
- maxHeight = detents.maxAllowedHeight(sheetAvailableSpace)
194
+ peekHeight = detents.peekHeight(sheetAvailableSpace, bottomInset, keyboardLift)
195
+ halfExpandedRatio = detents.halfExpandedRatio(sheetAvailableSpace, keyboardLift)
196
+ expandedOffset = detents.expandedOffsetFromTop(sheetAvailableSpace, keyboardLift = keyboardLift)
197
+ maxHeight = detents.maxAllowedHeight(sheetAvailableSpace, keyboardLift)
143
198
  if (applyInitialDetent) {
144
199
  state = resolveStateFromIndex(initialDetentIndex, detents.count)
145
200
  }
@@ -0,0 +1,159 @@
1
+ package com.swmansion.rnscreens.modals.formsheet.native.coordinator
2
+
3
+ import android.view.ViewGroup
4
+ import android.widget.FrameLayout
5
+ import androidx.core.view.ViewCompat
6
+ import androidx.core.view.WindowInsetsCompat
7
+ import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetAvailableHeightProvider
8
+ import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetContainer
9
+ import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetDialog
10
+ import com.swmansion.rnscreens.modals.formsheet.native.interfaces.FormSheetContentSizeChangeDelegate
11
+ import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetDetents
12
+
13
+ internal class FormSheetDimensionsCoordinator(
14
+ private val dialog: FormSheetDialog,
15
+ private val container: FormSheetContainer,
16
+ private val behaviorController: FormSheetBehaviorController?,
17
+ ) : FormSheetContentSizeChangeDelegate,
18
+ FormSheetAvailableHeightProvider.OnAvailableHeightMeasuredListener {
19
+ private var lastTopInset = 0
20
+ private var lastBottomInset = 0
21
+ private var lastImeInset = 0
22
+ private var currentDetents: FormSheetDetents? = null
23
+ private var currentInitialDetentIndex: Int = 0
24
+ private var shouldApplyInitialDetent: Boolean = false
25
+
26
+ private var currentContentHeight: Int = 0
27
+
28
+ // Height the metrics were last resolved against. Any other value reported by the measure pass
29
+ // means the window has been resized and metrics have to be recomputed.
30
+ private var resolvedAvailableSpace: Int = 0
31
+ private var isGeometryDirty: Boolean = false
32
+
33
+ internal fun setup() {
34
+ dialog.availableHeightProvider.availableHeightListener = this
35
+ setupWindowInsetsListener()
36
+ }
37
+
38
+ private fun setupWindowInsetsListener() {
39
+ ViewCompat.setOnApplyWindowInsetsListener(container) { _, insets ->
40
+ val topInset = getTopInset(insets)
41
+ val bottomInset = getBottomInset(insets)
42
+ val imeInset = getImeInset(insets)
43
+ if (topInset != lastTopInset || bottomInset != lastBottomInset || imeInset != lastImeInset) {
44
+ lastTopInset = topInset
45
+ lastBottomInset = bottomInset
46
+ lastImeInset = imeInset
47
+ invalidateGeometry()
48
+ }
49
+ insets
50
+ }
51
+ }
52
+
53
+ override fun onContentHeightChanged(newHeight: Int) {
54
+ if (currentContentHeight != newHeight) {
55
+ currentContentHeight = newHeight
56
+ invalidateGeometry()
57
+ }
58
+ }
59
+
60
+ internal fun updateFormSheetDimensions(
61
+ detents: FormSheetDetents?,
62
+ initialDetentIndex: Int = 0,
63
+ applyInitialDetent: Boolean = false,
64
+ ) {
65
+ currentDetents = detents
66
+ currentInitialDetentIndex = initialDetentIndex
67
+ shouldApplyInitialDetent = applyInitialDetent
68
+ invalidateGeometry()
69
+ }
70
+
71
+ // Schedules a measure pass; the metrics are resolved from there. The provider is a sibling of the sheet
72
+ // subtree, not an ancestor, so it has to be asked for a re-measure explicitly. No-op while the dialog
73
+ // is not shown - the first traversal after `show()` measures everything anyway.
74
+ private fun invalidateGeometry() {
75
+ isGeometryDirty = true
76
+ dialog.availableHeightProvider.requestLayout()
77
+ container.requestLayout()
78
+ }
79
+
80
+ override fun onAvailableHeightMeasured(height: Int) {
81
+ if (!isGeometryDirty && height == resolvedAvailableSpace) {
82
+ return
83
+ }
84
+ isGeometryDirty = false
85
+ resolvedAvailableSpace = height
86
+ resolveGeometry(height)
87
+ }
88
+
89
+ /**
90
+ * For Yoga we require the container height to be "stable" to avoid updating content size in flight.
91
+ * If left as MATCH_PARENT, BottomSheetDialog dynamically applies insets as padding when sheet overflows
92
+ * status bar or display cutout. This causes Yoga to recalculate the layout, resulting in UI flickering
93
+ * during the drag gesture. By calculating and enforcing a static height that explicitly subtracts
94
+ * the system insets, we completely bypass these redundant layout passes.
95
+ *
96
+ * Runs inside the measure pass of `FormSheetAvailableHeightProvider`, i.e. before Material's container, the sheet and
97
+ * our container are measured, so the values applied here are picked up by the very same traversal.
98
+ */
99
+ private fun resolveGeometry(sheetAvailableSpace: Int) {
100
+ currentDetents?.let { detents ->
101
+ behaviorController?.updateSheetBehavior(
102
+ detents = detents,
103
+ sheetAvailableSpace = sheetAvailableSpace,
104
+ contentHeightForFitToContents = currentContentHeight,
105
+ nativeContainerPaddingBottom = lastBottomInset,
106
+ keyboardLift = keyboardLift,
107
+ initialDetentIndex = currentInitialDetentIndex,
108
+ applyInitialDetent = shouldApplyInitialDetent,
109
+ )
110
+ shouldApplyInitialDetent = false
111
+ }
112
+
113
+ val sheetContainerHeight =
114
+ currentDetents?.sheetContainerHeight(
115
+ sheetAvailableSpace,
116
+ lastTopInset,
117
+ lastBottomInset,
118
+ currentContentHeight,
119
+ keyboardLift,
120
+ ) ?: (sheetAvailableSpace - lastTopInset - lastBottomInset - keyboardLift).coerceAtLeast(0)
121
+
122
+ val layoutParams =
123
+ container.layoutParams
124
+ ?: FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, sheetContainerHeight)
125
+
126
+ if (layoutParams.width != ViewGroup.LayoutParams.MATCH_PARENT || layoutParams.height != sheetContainerHeight) {
127
+ layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
128
+ layoutParams.height = sheetContainerHeight
129
+ container.layoutParams = layoutParams
130
+ }
131
+ }
132
+
133
+ /**
134
+ * The part of the keyboard inset that sticks out above the bottom system inset. Material pads the sheet by
135
+ * the larger of the two, so this is exactly how much the sheet has to be extended to keep its detent-sized
136
+ * part above the keyboard.
137
+ */
138
+ private val keyboardLift: Int
139
+ get() = (lastImeInset - lastBottomInset).coerceAtLeast(0)
140
+
141
+ private fun getImeInset(insetsCompat: WindowInsetsCompat): Int = insetsCompat.getInsets(WindowInsetsCompat.Type.ime()).bottom
142
+
143
+ private fun getTopInset(insetsCompat: WindowInsetsCompat): Int =
144
+ insetsCompat
145
+ .getInsets(
146
+ WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout(),
147
+ ).top
148
+
149
+ private fun getBottomInset(insetsCompat: WindowInsetsCompat): Int =
150
+ insetsCompat
151
+ .getInsets(
152
+ WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout(),
153
+ ).bottom
154
+
155
+ internal fun destroy() {
156
+ dialog.availableHeightProvider.availableHeightListener = null
157
+ ViewCompat.setOnApplyWindowInsetsListener(container, null)
158
+ }
159
+ }
@@ -0,0 +1,101 @@
1
+ package com.swmansion.rnscreens.modals.formsheet.native.coordinator
2
+
3
+ import android.widget.FrameLayout
4
+ import androidx.core.view.ViewCompat
5
+ import androidx.core.view.WindowInsetsAnimationCompat
6
+ import androidx.core.view.WindowInsetsCompat
7
+ import androidx.core.view.doOnLayout
8
+
9
+ internal class FormSheetKeyboardCoordinator(
10
+ private val bottomSheetView: FrameLayout,
11
+ ) {
12
+ /**
13
+ * Whether the sheet should track the keyboard animation. Kept `false` while an enter / exit
14
+ * transition owns `translationY`. Tracking the keyboard (`true`) should be allowed only when
15
+ * the sheet is in PRESENTED state.
16
+ */
17
+ internal var isTrackingEnabled: Boolean = false
18
+
19
+ private val insetsAnimationCallback = KeyboardInsetsAnimationCallback()
20
+
21
+ internal fun setup() {
22
+ // BottomSheetBehavior registers an internal `WindowInsetsAnimationCallback` on the
23
+ // sheet view during its first `onLayoutChild`. That callback drives `translationY` to track
24
+ // animated inset changes, what interferes with our slide-in custom animation.
25
+ //
26
+ // We manage insets ourselves by setting a fixed height for FormSheetContainer, so we can
27
+ // clear the Material's callback to remove the conflict entirely.
28
+ //
29
+ // This method must run after the first layout pass.
30
+ bottomSheetView.doOnLayout {
31
+ ViewCompat.setWindowInsetsAnimationCallback(it, insetsAnimationCallback)
32
+ }
33
+ }
34
+
35
+ internal fun destroy() {
36
+ ViewCompat.setWindowInsetsAnimationCallback(bottomSheetView, null)
37
+ }
38
+
39
+ private inner class KeyboardInsetsAnimationCallback : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_STOP) {
40
+ private var startTop = 0
41
+ private var startTranslationY = 0f
42
+
43
+ // Decided once per keyboard animation, in `onPrepare`. Tracking can't be picked up mid-animation
44
+ // because of no start position to translate from.
45
+ private var isTracking = false
46
+
47
+ private val isActive: Boolean
48
+ get() = isTracking && isTrackingEnabled
49
+
50
+ override fun onPrepare(animation: WindowInsetsAnimationCompat) {
51
+ if (!animation.isKeyboardAnimation() || !isTrackingEnabled) {
52
+ return
53
+ }
54
+
55
+ // Saving sheet's position before applying keyboard insets.
56
+ startTop = bottomSheetView.top
57
+ isTracking = true
58
+ }
59
+
60
+ override fun onStart(
61
+ animation: WindowInsetsAnimationCompat,
62
+ bounds: WindowInsetsAnimationCompat.BoundsCompat,
63
+ ): WindowInsetsAnimationCompat.BoundsCompat {
64
+ if (!animation.isKeyboardAnimation() || !isActive) {
65
+ return bounds
66
+ }
67
+
68
+ // The end sheet position is known - move the sheet and let the animation progress
69
+ // bring it to the new position.
70
+ startTranslationY = (startTop - bottomSheetView.top).toFloat()
71
+ bottomSheetView.translationY = startTranslationY
72
+ return bounds
73
+ }
74
+
75
+ override fun onProgress(
76
+ insets: WindowInsetsCompat,
77
+ runningAnimations: List<WindowInsetsAnimationCompat>,
78
+ ): WindowInsetsCompat {
79
+ if (!isActive) {
80
+ return insets
81
+ }
82
+
83
+ val keyboardAnimation = runningAnimations.firstOrNull { it.isKeyboardAnimation() } ?: return insets
84
+ bottomSheetView.translationY = startTranslationY * (1f - keyboardAnimation.interpolatedFraction)
85
+ return insets
86
+ }
87
+
88
+ override fun onEnd(animation: WindowInsetsAnimationCompat) {
89
+ if (!animation.isKeyboardAnimation()) {
90
+ return
91
+ }
92
+
93
+ if (isActive) {
94
+ bottomSheetView.translationY = 0f
95
+ }
96
+ isTracking = false
97
+ }
98
+
99
+ private fun WindowInsetsAnimationCompat.isKeyboardAnimation(): Boolean = typeMask and WindowInsetsCompat.Type.ime() != 0
100
+ }
101
+ }
@@ -0,0 +1,44 @@
1
+ package com.swmansion.rnscreens.modals.formsheet.native.coordinator
2
+
3
+ import androidx.activity.OnBackPressedCallback
4
+ import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetDialog
5
+
6
+ internal class FormSheetNativeDismissCoordinator(
7
+ private val dialog: FormSheetDialog,
8
+ private val behaviorController: FormSheetBehaviorController?,
9
+ private val onDismissAllowed: () -> Unit,
10
+ private val onDismissPrevented: () -> Unit,
11
+ ) : FormSheetDialog.CancelRequestInterceptor {
12
+ private val preventNativeDismissBackPressCallback =
13
+ object : OnBackPressedCallback(false) {
14
+ override fun handleOnBackPressed() {
15
+ handleCancelRequest()
16
+ }
17
+ }
18
+
19
+ internal var shouldPreventDismiss: Boolean = false
20
+ set(value) {
21
+ field = value
22
+ preventNativeDismissBackPressCallback.isEnabled = value
23
+ }
24
+
25
+ internal fun setup() {
26
+ dialog.cancelRequestInterceptor = this
27
+ dialog.onBackPressedDispatcher.addCallback(preventNativeDismissBackPressCallback)
28
+ }
29
+
30
+ internal fun destroy() {
31
+ dialog.cancelRequestInterceptor = null
32
+ preventNativeDismissBackPressCallback.remove()
33
+ }
34
+
35
+ override fun handleCancelRequest() {
36
+ if (shouldPreventDismiss) {
37
+ onDismissPrevented()
38
+ behaviorController?.restoreLastStableState()
39
+ return
40
+ }
41
+
42
+ onDismissAllowed()
43
+ }
44
+ }
@@ -0,0 +1,44 @@
1
+ package com.swmansion.rnscreens.modals.formsheet.native.core
2
+
3
+ import android.content.Context
4
+ import android.view.View
5
+
6
+ /**
7
+ * View installed as the first child of the window's `android.R.id.content`, as a sibling
8
+ * of Material's dialog `container` - nothing in Material's hierarchy is moved.
9
+ *
10
+ * Every metric we hand to `BottomSheetBehavior` and the height of [FormSheetContainer] is derived from
11
+ * the height the sheet is measured against. The measure pass is the only point where that height is known
12
+ * *before* the sheet gets measured. `FrameLayout` measures its children in index order, so the provider reports
13
+ * the height right before Material's `container`, the coordinator and the sheet are measured in the same
14
+ * traversal, keeping those values in sync with window resizes, e.g. orientation change.
15
+ */
16
+ internal class FormSheetAvailableHeightProvider(
17
+ context: Context,
18
+ ) : View(context) {
19
+ internal fun interface OnAvailableHeightMeasuredListener {
20
+ /**
21
+ * Invoked at the beginning of every measure pass with the height the sheet is about
22
+ * to be measured against.
23
+ */
24
+ fun onAvailableHeightMeasured(height: Int)
25
+ }
26
+
27
+ internal var availableHeightListener: OnAvailableHeightMeasuredListener? = null
28
+
29
+ init {
30
+ visibility = INVISIBLE
31
+ importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO
32
+ }
33
+
34
+ override fun onMeasure(
35
+ widthMeasureSpec: Int,
36
+ heightMeasureSpec: Int,
37
+ ) {
38
+ val height = MeasureSpec.getSize(heightMeasureSpec)
39
+ if (MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.UNSPECIFIED && height > 0) {
40
+ availableHeightListener?.onAvailableHeightMeasured(height)
41
+ }
42
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec)
43
+ }
44
+ }
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.native.core
2
2
 
3
3
  import android.annotation.SuppressLint
4
4
  import android.content.Context