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,173 @@
1
+ package com.swmansion.rnscreens.modals.formsheet.native.presentation
2
+
3
+ import android.content.Context
4
+ import android.util.Log
5
+ import android.view.ViewGroup
6
+ import android.widget.FrameLayout
7
+ import com.google.android.material.bottomsheet.BottomSheetBehavior
8
+ import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetAppearanceCoordinator
9
+ import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetBehaviorController
10
+ import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetDimensionsCoordinator
11
+ import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetKeyboardCoordinator
12
+ import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetNativeDismissCoordinator
13
+ import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetContainer
14
+ import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetDialog
15
+ import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetConfig
16
+ import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetDetents
17
+
18
+ internal class FormSheetPresentation(
19
+ themedContext: Context,
20
+ private val container: FormSheetContainer,
21
+ private val callbacks: Callbacks,
22
+ ) {
23
+ internal interface Callbacks {
24
+ fun onDetentChanged(index: Int)
25
+
26
+ fun onNativeDismissAllowed()
27
+
28
+ fun onNativeDismissPrevented()
29
+ }
30
+
31
+ internal val dialog =
32
+ FormSheetDialog(themedContext).apply {
33
+ setContentView(container)
34
+ // Backdrop taps are handled by Material's `touch_outside` view, which calls `cancel()`,
35
+ // intercepted by FormSheetDialog.cancelRequestInterceptor, that's responsible for
36
+ // preventNativeDismiss handling.
37
+ setCanceledOnTouchOutside(true)
38
+ }
39
+
40
+ internal val bottomSheetView: FrameLayout? = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet)
41
+
42
+ internal val sheetBehavior: BottomSheetBehavior<FrameLayout>?
43
+ get() = bottomSheetView?.let { BottomSheetBehavior.from(it) }
44
+
45
+ private val behaviorController =
46
+ bottomSheetView?.let {
47
+ FormSheetBehaviorController(it) { index -> callbacks.onDetentChanged(index) }
48
+ }
49
+
50
+ private val appearanceCoordinator =
51
+ FormSheetAppearanceCoordinator(
52
+ bottomSheetView = bottomSheetView,
53
+ )
54
+
55
+ private val dimensionsCoordinator =
56
+ FormSheetDimensionsCoordinator(
57
+ dialog = dialog,
58
+ container = container,
59
+ behaviorController = behaviorController,
60
+ )
61
+
62
+ private val keyboardCoordinator =
63
+ bottomSheetView?.let {
64
+ FormSheetKeyboardCoordinator(bottomSheetView = it)
65
+ }
66
+
67
+ private val nativeDismissCoordinator =
68
+ FormSheetNativeDismissCoordinator(
69
+ dialog = dialog,
70
+ behaviorController = behaviorController,
71
+ onDismissAllowed = callbacks::onNativeDismissAllowed,
72
+ onDismissPrevented = callbacks::onNativeDismissPrevented,
73
+ )
74
+
75
+ init {
76
+ nativeDismissCoordinator.setup()
77
+ appearanceCoordinator.setup()
78
+ dimensionsCoordinator.setup()
79
+ keyboardCoordinator?.setup()
80
+ behaviorController?.setup()
81
+ }
82
+
83
+ /**
84
+ * Enables tracking the keyboard animation. Expected to be on only while the sheet rests in the
85
+ * PRESENTED state - the enter / exit animators own `translationY` otherwise.
86
+ */
87
+ internal fun setKeyboardTrackingEnabled(enabled: Boolean) {
88
+ keyboardCoordinator?.isTrackingEnabled = enabled
89
+ }
90
+
91
+ internal fun onContentHeightChanged(height: Int) {
92
+ dimensionsCoordinator.onContentHeightChanged(height)
93
+ }
94
+
95
+ internal fun applyInitialConfig(
96
+ config: FormSheetConfig,
97
+ contentHeight: Int,
98
+ ) {
99
+ onContentHeightChanged(contentHeight)
100
+ dimensionsCoordinator.updateFormSheetDimensions(
101
+ resolveDetents(config.detents),
102
+ config.initialDetentIndex,
103
+ applyInitialDetent = true,
104
+ )
105
+ container.setGrabberVisible(config.prefersGrabberVisible)
106
+ appearanceCoordinator.updateCornerRadius(config.preferredCornerRadius)
107
+ appearanceCoordinator.updateBackgroundColor(config.nativeContainerBackgroundColor)
108
+ nativeDismissCoordinator.shouldPreventDismiss = config.shouldPreventNativeDismiss
109
+ }
110
+
111
+ internal fun applyConfigUpdate(
112
+ oldConfig: FormSheetConfig,
113
+ newConfig: FormSheetConfig,
114
+ ) {
115
+ if (oldConfig.detents != newConfig.detents) {
116
+ dimensionsCoordinator.updateFormSheetDimensions(
117
+ resolveDetents(newConfig.detents),
118
+ newConfig.initialDetentIndex,
119
+ )
120
+ }
121
+
122
+ if (oldConfig.prefersGrabberVisible != newConfig.prefersGrabberVisible) {
123
+ container.setGrabberVisible(newConfig.prefersGrabberVisible)
124
+ }
125
+
126
+ if (oldConfig.preferredCornerRadius != newConfig.preferredCornerRadius) {
127
+ appearanceCoordinator.updateCornerRadius(newConfig.preferredCornerRadius)
128
+ }
129
+
130
+ if (oldConfig.nativeContainerBackgroundColor != newConfig.nativeContainerBackgroundColor) {
131
+ appearanceCoordinator.updateBackgroundColor(newConfig.nativeContainerBackgroundColor)
132
+ }
133
+
134
+ if (oldConfig.shouldPreventNativeDismiss != newConfig.shouldPreventNativeDismiss) {
135
+ nativeDismissCoordinator.shouldPreventDismiss = newConfig.shouldPreventNativeDismiss
136
+ }
137
+ }
138
+
139
+ internal fun destroy() {
140
+ behaviorController?.destroy()
141
+ nativeDismissCoordinator.destroy()
142
+ dimensionsCoordinator.destroy()
143
+ keyboardCoordinator?.destroy()
144
+
145
+ dialog.setOnShowListener(null)
146
+ dialog.dismiss()
147
+
148
+ // The FormSheetContainer outlives the presentation - its lifecycle is managed by FormSheetDialogManager
149
+ // which is tied with the React's Host lifecycle.
150
+ (container.parent as? ViewGroup)?.removeView(container)
151
+ }
152
+
153
+ private fun resolveDetents(rawDetents: List<Double>): FormSheetDetents {
154
+ if (rawDetents.isEmpty()) {
155
+ return FormSheetDetents(listOf(LARGE_DETENT_FRACTION))
156
+ }
157
+
158
+ return try {
159
+ FormSheetDetents(rawDetents)
160
+ } catch (e: IllegalArgumentException) {
161
+ Log.e(
162
+ "[RNScreens]",
163
+ "Invalid FormSheet detents: $rawDetents. Falling back to large detent.",
164
+ e,
165
+ )
166
+ FormSheetDetents(listOf(LARGE_DETENT_FRACTION))
167
+ }
168
+ }
169
+
170
+ companion object {
171
+ private const val LARGE_DETENT_FRACTION = 1.0
172
+ }
173
+ }
@@ -0,0 +1,290 @@
1
+ package com.swmansion.rnscreens.modals.formsheet.native.presentation
2
+
3
+ import android.animation.Animator
4
+ import android.animation.AnimatorListenerAdapter
5
+ import android.util.Log
6
+ import android.view.View
7
+ import androidx.core.view.doOnPreDraw
8
+ import com.google.android.material.bottomsheet.BottomSheetBehavior
9
+ import com.swmansion.rnscreens.common.event.ViewAppearanceEventEmitter
10
+
11
+ internal class FormSheetPresentationManager(
12
+ private val presentationFactory: () -> FormSheetPresentation,
13
+ private val dimmingManager: FormSheetDimmingManager,
14
+ private val onNativeDismiss: () -> Unit,
15
+ private val onDismiss: () -> Unit,
16
+ ) {
17
+ internal var appearanceEventEmitter: ViewAppearanceEventEmitter? = null
18
+
19
+ internal var currentPresentation: FormSheetPresentation? = null
20
+ private set
21
+
22
+ private val bottomSheetView: View?
23
+ get() = currentPresentation?.bottomSheetView
24
+
25
+ private var state = FormSheetPresentationState.DISMISSED
26
+ private var shouldBeOpen = false
27
+ private var shouldSkipExitAnimation = false
28
+
29
+ private var dismissalOrigin = FormSheetDismissalOrigin.UNSPECIFIED
30
+
31
+ private val animatorFactory = FormSheetAnimatorFactory(dimmingManager)
32
+ private var currentSheetAnimator: Animator? = null
33
+
34
+ internal fun requestProgrammaticStateUpdate(shouldBeOpen: Boolean) {
35
+ if (shouldBeOpen) {
36
+ handlePresent()
37
+ } else {
38
+ handleProgrammaticDismiss()
39
+ }
40
+ }
41
+
42
+ private fun handlePresent() {
43
+ updatePresentationState(shouldBeOpen = true, origin = FormSheetDismissalOrigin.UNSPECIFIED)
44
+ }
45
+
46
+ private fun handleProgrammaticDismiss() {
47
+ updatePresentationState(shouldBeOpen = false, origin = FormSheetDismissalOrigin.PROGRAMMATIC_JS)
48
+ }
49
+
50
+ internal fun handleNativeDismiss() {
51
+ if (state == FormSheetPresentationState.DISMISSING || state == FormSheetPresentationState.DISMISSED) {
52
+ return
53
+ }
54
+
55
+ updatePresentationState(shouldBeOpen = false, origin = FormSheetDismissalOrigin.USER)
56
+ }
57
+
58
+ private fun updatePresentationState(
59
+ shouldBeOpen: Boolean,
60
+ origin: FormSheetDismissalOrigin,
61
+ ) {
62
+ // The origin belongs to the request that transitioned the target to closed -
63
+ // a repeated close request must not override it. Once a dismissal is in flight,
64
+ // it keeps the origin that started it until the completion events are emitted.
65
+ val isRepeatCloseRequest = !shouldBeOpen && !this.shouldBeOpen
66
+ if (state != FormSheetPresentationState.DISMISSING && !isRepeatCloseRequest) {
67
+ dismissalOrigin = origin
68
+ }
69
+ this.shouldBeOpen = shouldBeOpen
70
+ resolvePresentationState()
71
+ }
72
+
73
+ private fun resolvePresentationState() {
74
+ if (shouldBeOpen) {
75
+ presentIfNeeded()
76
+ } else {
77
+ dismissIfNeeded()
78
+ }
79
+ }
80
+
81
+ private fun presentIfNeeded() {
82
+ if (state != FormSheetPresentationState.DISMISSED) {
83
+ return
84
+ }
85
+
86
+ state = FormSheetPresentationState.PRESENTING
87
+ val presentation = presentationFactory().also { currentPresentation = it }
88
+ presentation.sheetBehavior?.let(dimmingManager::attachToBehavior)
89
+
90
+ FormSheetStackRegistry.register(this)
91
+ appearanceEventEmitter?.emitOnWillAppear()
92
+ presentation.bottomSheetView?.let(::keepOffscreenUntilEnterAnimation)
93
+ presentation.dialog.setOnShowListener {
94
+ presentation.dialog.setOnShowListener(null)
95
+
96
+ // Every sheet dims the surface inside the window below, attaching an overlay to the sheet
97
+ // directly below in the stack, or to the DecorView when this sheet is the
98
+ // bottom-most one.
99
+ dimmingManager.attachDimming(FormSheetStackRegistry.sheetBelow(this)?.bottomSheetView)
100
+
101
+ startEnterAnimation()
102
+ }
103
+ presentation.dialog.show()
104
+ }
105
+
106
+ private fun dismissIfNeeded() {
107
+ if (state != FormSheetPresentationState.PRESENTED) {
108
+ return
109
+ }
110
+
111
+ state = FormSheetPresentationState.DISMISSING
112
+ currentPresentation?.setKeyboardTrackingEnabled(false)
113
+ dismissSheetsAbove()
114
+ // Leaving the stack immediately is deliberate, if another sheet is presented during this exit animation,
115
+ // it must stack on a "stable" sheet - the one we don't intend to dismiss. This window is about to be
116
+ // torn down.
117
+ FormSheetStackRegistry.unregister(this)
118
+ appearanceEventEmitter?.emitOnWillDisappear()
119
+
120
+ val isSheetHidden =
121
+ bottomSheetView?.let {
122
+ BottomSheetBehavior.from(it).state == BottomSheetBehavior.STATE_HIDDEN
123
+ } ?: true
124
+
125
+ if (isSheetHidden) {
126
+ performDismiss()
127
+ return
128
+ }
129
+
130
+ if (shouldSkipExitAnimation) {
131
+ performInstantDismiss()
132
+ return
133
+ }
134
+
135
+ startExitAnimation()
136
+ }
137
+
138
+ // Dismissing a sheet from the middle of the stack should dismiss all sheets above it,
139
+ // mirroring the iOS presentation chain teardown. Sheets are dismissed top-down.
140
+ private fun dismissSheetsAbove() {
141
+ FormSheetStackRegistry.sheetsAbove(this).asReversed().forEach {
142
+ it.handleDismissFromCascade()
143
+ }
144
+ }
145
+
146
+ private fun handleDismissFromCascade() {
147
+ if (state == FormSheetPresentationState.DISMISSING || state == FormSheetPresentationState.DISMISSED) {
148
+ return
149
+ }
150
+
151
+ shouldSkipExitAnimation = true
152
+ updatePresentationState(false, FormSheetDismissalOrigin.USER)
153
+ }
154
+
155
+ private fun performInstantDismiss() {
156
+ currentSheetAnimator?.removeAllListeners()
157
+ currentSheetAnimator?.cancel()
158
+ currentSheetAnimator = null
159
+
160
+ performDismiss()
161
+ }
162
+
163
+ /**
164
+ * `Dialog.show()` **posts** the show message behind the sync barrier of the traversal scheduled while
165
+ * adding the decor to the window, so the Dialog always draws its first frame before `OnShowListener`
166
+ * (with our custom enter animation) runs. A freshly created sheet rests at `translationY = 0`, so that
167
+ * frame would show it at its final position and the enter animator would then snap it back
168
+ * off-screen.
169
+ *
170
+ * Applying the translation on the first pre-draw - after the layout, when the sheet height is
171
+ * already known, but before anything is drawn - keeps the sheet off-screen from the very first frame.
172
+ */
173
+ private fun keepOffscreenUntilEnterAnimation(view: View) {
174
+ view.doOnPreDraw {
175
+ if (currentSheetAnimator == null) {
176
+ view.translationY = view.height.toFloat()
177
+ }
178
+ }
179
+ }
180
+
181
+ private fun startEnterAnimation() {
182
+ val bottomSheetView = bottomSheetView
183
+ if (bottomSheetView == null) {
184
+ onPresentationComplete()
185
+ return
186
+ }
187
+
188
+ val isInterrupting = currentSheetAnimator?.isRunning == true
189
+ currentSheetAnimator?.removeAllListeners()
190
+ currentSheetAnimator?.cancel()
191
+
192
+ dimmingManager.isTransitionAnimationRunning = true
193
+
194
+ currentSheetAnimator =
195
+ animatorFactory.createEnterAnimator(bottomSheetView, isInterrupting).apply {
196
+ addListener(
197
+ object : AnimatorListenerAdapter() {
198
+ override fun onAnimationEnd(animation: Animator) {
199
+ dimmingManager.isTransitionAnimationRunning = false
200
+
201
+ if (currentSheetAnimator == this@apply) currentSheetAnimator = null
202
+ onPresentationComplete()
203
+ }
204
+ },
205
+ )
206
+ start()
207
+ }
208
+ }
209
+
210
+ private fun startExitAnimation() {
211
+ val bottomSheetView = bottomSheetView
212
+ if (bottomSheetView == null) {
213
+ performDismiss()
214
+ return
215
+ }
216
+
217
+ val isInterrupting = currentSheetAnimator?.isRunning == true
218
+ currentSheetAnimator?.removeAllListeners()
219
+ currentSheetAnimator?.cancel()
220
+
221
+ dimmingManager.isTransitionAnimationRunning = true
222
+
223
+ currentSheetAnimator =
224
+ animatorFactory.createExitAnimator(bottomSheetView, isInterrupting).apply {
225
+ addListener(
226
+ object : AnimatorListenerAdapter() {
227
+ override fun onAnimationEnd(animation: Animator) {
228
+ dimmingManager.isTransitionAnimationRunning = false
229
+
230
+ if (currentSheetAnimator == this@apply) currentSheetAnimator = null
231
+ performDismiss()
232
+ }
233
+ },
234
+ )
235
+ start()
236
+ }
237
+ }
238
+
239
+ private fun performDismiss() {
240
+ shouldSkipExitAnimation = false
241
+ dimmingManager.detachDimming()
242
+ currentPresentation?.destroy()
243
+ currentPresentation = null
244
+ onDismissComplete()
245
+ }
246
+
247
+ private fun onPresentationComplete() {
248
+ if (state == FormSheetPresentationState.PRESENTING) {
249
+ state = FormSheetPresentationState.PRESENTED
250
+ currentPresentation?.setKeyboardTrackingEnabled(true)
251
+ appearanceEventEmitter?.emitOnDidAppear()
252
+ // ensure state hasn't updated during presentation
253
+ resolvePresentationState()
254
+ }
255
+ }
256
+
257
+ private fun onDismissComplete() {
258
+ if (state == FormSheetPresentationState.DISMISSING) {
259
+ state = FormSheetPresentationState.DISMISSED
260
+ appearanceEventEmitter?.emitOnDidDisappear()
261
+
262
+ when (dismissalOrigin) {
263
+ FormSheetDismissalOrigin.USER -> onNativeDismiss()
264
+ FormSheetDismissalOrigin.PROGRAMMATIC_JS -> onDismiss()
265
+ FormSheetDismissalOrigin.UNSPECIFIED ->
266
+ Log.e(
267
+ "[RNScreens]",
268
+ "FormSheet dismissal completed without a recorded origin; no dismissal event emitted",
269
+ )
270
+ }
271
+ dismissalOrigin = FormSheetDismissalOrigin.UNSPECIFIED
272
+
273
+ // ensure state hasn't updated during dismissal
274
+ resolvePresentationState()
275
+ }
276
+ }
277
+
278
+ internal fun destroy() {
279
+ FormSheetStackRegistry.unregister(this)
280
+ dimmingManager.detachDimming()
281
+
282
+ currentSheetAnimator?.cancel()
283
+ currentSheetAnimator = null
284
+
285
+ currentPresentation?.destroy()
286
+ currentPresentation = null
287
+
288
+ state = FormSheetPresentationState.DISMISSED
289
+ }
290
+ }
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.native.presentation
2
2
 
3
3
  internal enum class FormSheetPresentationState {
4
4
  /**
@@ -27,7 +27,7 @@ internal enum class FormSheetPresentationState {
27
27
  /**
28
28
  * The manager is actively preparing to show the sheet. `presentIfNeeded()` has been called.
29
29
  * During this state, `dialog.show()` is executed. The manager waits for the `onShowListener`
30
- * to fire, requests DimmingView attachment from `dimmingManager` and runs starts entrance animation.
30
+ * to fire, attaches the dimming through `dimmingManager` and starts the entrance animation.
31
31
  * Once the enter animator finishes, the state moves to [PRESENTED].
32
32
  * **Transitional state** from [DISMISSED] to [PRESENTED].
33
33
  */
@@ -0,0 +1,28 @@
1
+ package com.swmansion.rnscreens.modals.formsheet.native.presentation
2
+
3
+ internal object FormSheetStackRegistry {
4
+ private val stack = mutableListOf<FormSheetPresentationManager>()
5
+
6
+ internal fun register(sheet: FormSheetPresentationManager) {
7
+ if (!stack.contains(sheet)) {
8
+ stack.add(sheet)
9
+ }
10
+ }
11
+
12
+ internal fun unregister(sheet: FormSheetPresentationManager) {
13
+ stack.remove(sheet)
14
+ }
15
+
16
+ internal fun sheetsAbove(sheet: FormSheetPresentationManager): List<FormSheetPresentationManager> {
17
+ val index = stack.indexOf(sheet)
18
+ if (index < 0) {
19
+ return emptyList()
20
+ }
21
+ return stack.drop(index + 1)
22
+ }
23
+
24
+ internal fun sheetBelow(sheet: FormSheetPresentationManager): FormSheetPresentationManager? {
25
+ val index = stack.indexOf(sheet)
26
+ return if (index > 0) stack[index - 1] else null
27
+ }
28
+ }
@@ -1,7 +1,9 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.react.contentwrapper
2
2
 
3
3
  import android.content.Context
4
4
  import com.facebook.react.views.view.ReactViewGroup
5
+ import com.swmansion.rnscreens.modals.formsheet.native.interfaces.FormSheetContentSizeChangeDelegate
6
+ import com.swmansion.rnscreens.modals.formsheet.native.interfaces.FormSheetContentSizeChangeProvider
5
7
 
6
8
  class FormSheetContentWrapper(
7
9
  context: Context,
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.react.contentwrapper
2
2
 
3
3
  import com.facebook.react.module.annotations.ReactModule
4
4
  import com.facebook.react.uimanager.ThemedReactContext
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.react.event
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.react.event
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.react.event
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -0,0 +1,29 @@
1
+ package com.swmansion.rnscreens.modals.formsheet.react.event
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+ import com.swmansion.rnscreens.common.event.NamingAwareEventType
7
+
8
+ class FormSheetDismissEvent(
9
+ surfaceId: Int,
10
+ viewId: Int,
11
+ ) : Event<FormSheetDismissEvent>(surfaceId, viewId),
12
+ NamingAwareEventType {
13
+ override fun getEventName(): String = EVENT_NAME
14
+
15
+ override fun getEventRegistrationName() = EVENT_REGISTRATION_NAME
16
+
17
+ override fun getEventData(): WritableMap? = Arguments.createMap()
18
+
19
+ override fun canCoalesce(): Boolean = false
20
+
21
+ companion object : NamingAwareEventType {
22
+ const val EVENT_NAME = "topDismiss"
23
+ const val EVENT_REGISTRATION_NAME = "onDismiss"
24
+
25
+ override fun getEventName() = EVENT_NAME
26
+
27
+ override fun getEventRegistrationName() = EVENT_REGISTRATION_NAME
28
+ }
29
+ }
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.react.event
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -0,0 +1,29 @@
1
+ package com.swmansion.rnscreens.modals.formsheet.react.event
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+ import com.swmansion.rnscreens.common.event.NamingAwareEventType
7
+
8
+ class FormSheetNativeDismissPreventedEvent(
9
+ surfaceId: Int,
10
+ viewId: Int,
11
+ ) : Event<FormSheetNativeDismissPreventedEvent>(surfaceId, viewId),
12
+ NamingAwareEventType {
13
+ override fun getEventName(): String = EVENT_NAME
14
+
15
+ override fun getEventRegistrationName() = EVENT_REGISTRATION_NAME
16
+
17
+ override fun getEventData(): WritableMap? = Arguments.createMap()
18
+
19
+ override fun canCoalesce(): Boolean = false
20
+
21
+ companion object : NamingAwareEventType {
22
+ const val EVENT_NAME = "topNativeDismissPrevented"
23
+ const val EVENT_REGISTRATION_NAME = "onNativeDismissPrevented"
24
+
25
+ override fun getEventName() = EVENT_NAME
26
+
27
+ override fun getEventRegistrationName() = EVENT_REGISTRATION_NAME
28
+ }
29
+ }
@@ -1,6 +1,6 @@
1
1
  // Implementation adapted from `expo`: https://github.com/expo/expo/pull/45775
2
2
 
3
- package com.swmansion.rnscreens.modals.formsheet
3
+ package com.swmansion.rnscreens.modals.formsheet.react.event
4
4
 
5
5
  import com.facebook.react.bridge.Arguments
6
6
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.react.event
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.react.event
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet
1
+ package com.swmansion.rnscreens.modals.formsheet.react.host
2
2
 
3
3
  import android.annotation.SuppressLint
4
4
  import android.content.Context
@@ -18,6 +18,8 @@ import com.facebook.react.uimanager.common.UIManagerType
18
18
  import com.facebook.react.uimanager.events.EventDispatcher
19
19
  import com.facebook.react.views.view.ReactViewGroup
20
20
  import com.swmansion.rnscreens.helpers.getFabricUIManagerNotNull
21
+ import com.swmansion.rnscreens.modals.formsheet.native.interfaces.FormSheetContentSizeChangeDelegate
22
+ import com.swmansion.rnscreens.modals.formsheet.native.interfaces.FormSheetContentSizeChangeProvider
21
23
 
22
24
  @OptIn(UnstableReactNativeAPI::class)
23
25
  @SuppressLint("ViewConstructor")