react-native-screens 5.0.0-alpha.2 → 5.0.0-alpha.4

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 (456) hide show
  1. package/Package.swift +87 -0
  2. package/README.md +0 -11
  3. package/android/build.gradle +1 -0
  4. package/android/consumer-rules.pro +3 -0
  5. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledHeaderConfigViewGroup.kt +2 -0
  6. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledHeaderSubviewViewGroup.kt +2 -0
  7. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledViewGroup.kt +18 -3
  8. package/android/src/main/cpp/NativeProxy.cpp +30 -6
  9. package/android/src/main/cpp/NativeProxy.h +7 -1
  10. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -2
  11. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +7 -3
  12. package/android/src/main/java/com/swmansion/rnscreens/common/colorscheme/ColorSchemeCoordinator.kt +11 -1
  13. package/android/src/main/java/com/swmansion/rnscreens/common/container/Container.kt +17 -0
  14. package/android/src/main/java/com/swmansion/rnscreens/common/container/ContainerItem.kt +13 -1
  15. package/android/src/main/java/com/swmansion/rnscreens/common/text/ReactTextAppearance.kt +62 -0
  16. package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearance.kt +20 -0
  17. package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearanceDefaults.kt +65 -0
  18. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetAppearanceCoordinator.kt +2 -2
  19. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetBehaviorController.kt +51 -20
  20. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/coordinator/FormSheetDimensionsCoordinator.kt +159 -0
  21. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/coordinator/FormSheetKeyboardCoordinator.kt +101 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetNativeDismissCoordinator.kt +2 -8
  23. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/dialog/FormSheetAvailableHeightProvider.kt +44 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetContainer.kt +1 -1
  25. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetDialog.kt +36 -4
  26. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/dialog/FormSheetDialogManager.kt +107 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetContentSizeChangeDelegate.kt +1 -1
  28. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetContentSizeChangeProvider.kt +1 -1
  29. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetDialogEventEmitter.kt +3 -1
  30. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/model/FormSheetConfig.kt +1 -1
  31. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/model/FormSheetDetents.kt +152 -0
  32. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetAnimatorFactory.kt +9 -10
  33. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetDimmingManager.kt +103 -0
  34. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetDismissalOrigin.kt +22 -0
  35. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetPresentation.kt +173 -0
  36. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetPresentationManager.kt +290 -0
  37. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetPresentationState.kt +2 -2
  38. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetStackRegistry.kt +28 -0
  39. package/android/src/main/java/com/swmansion/rnscreens/ext/FragmentManagerExt.kt +6 -0
  40. package/android/src/main/java/com/swmansion/rnscreens/helpers/FragmentManagerHelper.kt +0 -3
  41. package/android/src/main/java/com/swmansion/rnscreens/helpers/NoTintDrawable.kt +31 -0
  42. package/android/src/main/java/com/swmansion/rnscreens/helpers/PropIconResolver.kt +17 -23
  43. package/android/src/main/java/com/swmansion/rnscreens/helpers/ViewFinder.kt +0 -17
  44. package/android/src/main/java/com/swmansion/rnscreens/legacy/Screen.kt +32 -3
  45. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenContainer.kt +35 -3
  46. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStack.kt +15 -0
  47. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackHeaderConfig.kt +7 -1
  48. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackHeaderSubviewManager.kt +7 -0
  49. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackViewManager.kt +6 -0
  50. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/DimmingView.kt +2 -0
  51. package/android/src/main/java/com/swmansion/rnscreens/legacy/stack/views/ScreensCoordinatorLayout.kt +2 -0
  52. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/contentwrapper/FormSheetContentWrapper.kt +3 -3
  53. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/contentwrapper/FormSheetContentWrapperViewManager.kt +1 -1
  54. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDetentChangedEvent.kt +1 -1
  55. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDidAppearEvent.kt +1 -1
  56. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDidDisappearEvent.kt +1 -1
  57. package/android/src/main/java/com/swmansion/rnscreens/react/modals/formsheet/event/FormSheetDismissEvent.kt +29 -0
  58. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetNativeDismissEvent.kt +1 -1
  59. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetNativeDismissPreventedEvent.kt +1 -1
  60. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetSyncFlushEvent.kt +1 -1
  61. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetWillAppearEvent.kt +1 -1
  62. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetWillDisappearEvent.kt +1 -1
  63. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetContentView.kt +3 -3
  64. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHost.kt +5 -3
  65. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHostEventEmitter.kt +17 -10
  66. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHostViewManager.kt +11 -9
  67. package/android/src/main/java/com/swmansion/rnscreens/safearea/OnInterfaceInsetsChangeListener.kt +15 -0
  68. package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaProvider.kt +8 -8
  69. package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaView.kt +3 -2
  70. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderApplicator.kt +360 -101
  71. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderBackPressHandler.kt +11 -0
  72. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderCoordinatorLayout.kt +211 -113
  73. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderAppBarLayout.kt +156 -24
  74. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderContentScrimDrawable.kt +36 -0
  75. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderToolbar.kt +74 -0
  76. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderCollapsedTitleGravityMode.kt +6 -0
  77. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfig.kt +162 -228
  78. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigViewManager.kt +385 -12
  79. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationObserver.kt +5 -6
  80. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationProviding.kt +29 -6
  81. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderDelegate.kt +0 -7
  82. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderInvalidationFlags.kt +8 -7
  83. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuApplicator.kt +27 -280
  84. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuController.kt +448 -0
  85. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuDelegate.kt +10 -0
  86. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuMapper.kt +28 -20
  87. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuConfig.kt +3 -55
  88. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuGroupMetadata.kt +1 -10
  89. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuItemConfig.kt +1 -3
  90. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuModel.kt +180 -0
  91. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementOptions.kt +57 -6
  92. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementRawUpdate.kt +3 -1
  93. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementUpdate.kt +1 -0
  94. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuIconResolver.kt +4 -3
  95. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuUpdateQueue.kt +23 -9
  96. package/android/src/main/java/com/swmansion/rnscreens/stack/host/FragmentOperation.kt +1 -0
  97. package/android/src/main/java/com/swmansion/rnscreens/stack/host/FragmentOperationExecutor.kt +2 -1
  98. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainer.kt +159 -21
  99. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainerDelegate.kt +7 -0
  100. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainerUpdateCoordinator.kt +5 -3
  101. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHost.kt +27 -5
  102. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHostViewManager.kt +14 -0
  103. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackUpdateBatchStateProviding.kt +10 -0
  104. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/PreventNativeDismissCallback.kt +2 -2
  105. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreen.kt +4 -0
  106. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragment.kt +50 -10
  107. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragmentDelegate.kt +12 -0
  108. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceApplicator.kt +106 -10
  109. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceCoordinator.kt +46 -7
  110. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceModel.kt +3 -0
  111. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/CustomBottomNavigationView.kt +21 -1
  112. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/MenuHelpers.kt +5 -23
  113. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainer.kt +72 -36
  114. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainerDelegate.kt +11 -0
  115. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHost.kt +22 -2
  116. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHostA11yCoordinator.kt +23 -2
  117. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreen.kt +58 -17
  118. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenDelegate.kt +6 -0
  119. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenFragment.kt +3 -0
  120. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenIcon.kt +82 -0
  121. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenIconTinting.kt +17 -0
  122. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenViewManager.kt +26 -19
  123. package/android/src/main/java/com/swmansion/rnscreens/utils/DimensionUtils.kt +20 -6
  124. package/android/src/main/java/com/swmansion/rnscreens/utils/RNSLog.kt +22 -6
  125. package/android/src/main/java/com/swmansion/rnscreens/utils/StyleUtils.kt +22 -0
  126. package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_available_space.xml +8 -0
  127. package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_entire_space.xml +8 -0
  128. package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_available_space.xml +8 -0
  129. package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_entire_space.xml +8 -0
  130. package/cpp/legacy/RNSScreenRemovalListener.cpp +31 -1
  131. package/cpp/legacy/RNSScreenRemovalListener.h +18 -3
  132. package/ios/RNSEnums.h +16 -1
  133. package/ios/conversion/RNSConversions.h +7 -108
  134. package/ios/helpers/image/RNSImageLoadingHelper.h +7 -0
  135. package/ios/helpers/image/RNSImageLoadingHelper.mm +9 -0
  136. package/ios/legacy/RNSBarButtonItem.mm +15 -0
  137. package/ios/legacy/RNSConvert.h +6 -0
  138. package/ios/legacy/RNSConvert.mm +17 -0
  139. package/ios/legacy/RNSFullWindowOverlay.mm +1 -1
  140. package/ios/legacy/RNSModalScreen.mm +1 -1
  141. package/ios/legacy/RNSNavigationBar.h +31 -0
  142. package/ios/legacy/RNSNavigationBar.mm +15 -0
  143. package/ios/legacy/RNSScreen.mm +130 -31
  144. package/ios/legacy/RNSScreenContentWrapper.mm +4 -1
  145. package/ios/legacy/RNSScreenStack.mm +202 -15
  146. package/ios/legacy/RNSScreenStackHeaderConfig.h +30 -0
  147. package/ios/legacy/RNSScreenStackHeaderConfig.mm +72 -17
  148. package/ios/legacy/RNSScreenStackHeaderSubview.mm +34 -1
  149. package/ios/legacy/RNSScreenWindowTraits.mm +5 -13
  150. package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.h +1 -3
  151. package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.mm +11 -22
  152. package/ios/modals/form-sheet/RNSFormSheetContentController.h +1 -1
  153. package/ios/modals/form-sheet/RNSFormSheetContentController.mm +7 -18
  154. package/ios/modals/form-sheet/RNSFormSheetHostComponentView.mm +4 -4
  155. package/ios/modals/form-sheet/RNSFormSheetHostShadowStateProxy.mm +2 -2
  156. package/ios/modals/form-sheet/RNSFormSheetUpdateFlags.h +3 -0
  157. package/ios/safe-area/RNSSafeAreaViewComponentView.mm +3 -14
  158. package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.mm +2 -3
  159. package/ios/split/RNSSplitAppearanceApplicator.h +4 -4
  160. package/ios/split/RNSSplitAppearanceApplicator.mm +53 -56
  161. package/ios/split/RNSSplitHostComponentEventEmitter.h +1 -0
  162. package/ios/split/RNSSplitHostComponentEventEmitter.mm +1 -1
  163. package/ios/split/RNSSplitHostComponentView.h +5 -15
  164. package/ios/split/RNSSplitHostComponentView.mm +55 -6
  165. package/ios/split/RNSSplitHostController.h +25 -6
  166. package/ios/split/RNSSplitHostController.mm +24 -92
  167. package/ios/split/RNSSplitHostProviders.h +67 -0
  168. package/ios/split/RNSSplitScreenComponentView.h +0 -39
  169. package/ios/split/RNSSplitScreenComponentView.mm +27 -10
  170. package/ios/split/RNSSplitScreenController.h +26 -3
  171. package/ios/split/RNSSplitScreenController.mm +13 -30
  172. package/ios/split/RNSSplitScreenShadowStateProxy.h +1 -40
  173. package/ios/split/RNSSplitScreenShadowStateProxy.mm +1 -26
  174. package/ios/split/conversion/RNSConversions-SplitView.h +56 -0
  175. package/ios/{conversion → split/conversion}/RNSConversions-SplitView.mm +4 -1
  176. package/ios/stack/conversion/RNSConversions-Stack.h +62 -0
  177. package/ios/stack/conversion/RNSConversions-Stack.mm +134 -0
  178. package/ios/stack/header/RNSHeaderItemVisibilityPriority.h +9 -0
  179. package/ios/stack/header/RNSStackHeaderAppearanceMapper.h +26 -0
  180. package/ios/stack/header/RNSStackHeaderAppearanceMapper.mm +88 -0
  181. package/ios/stack/header/RNSStackHeaderConfigComponentView.h +14 -1
  182. package/ios/stack/header/RNSStackHeaderConfigComponentView.mm +103 -37
  183. package/ios/stack/header/RNSStackHeaderConfigDataProviding.h +11 -0
  184. package/ios/stack/header/RNSStackHeaderConfigShadowStateProxy.mm +1 -1
  185. package/ios/stack/header/RNSStackHeaderContentFactory.mm +3 -0
  186. package/ios/stack/header/RNSStackHeaderIconResolver.mm +7 -0
  187. package/ios/stack/header/RNSStackHeaderItemComponentView.h +12 -3
  188. package/ios/stack/header/RNSStackHeaderItemComponentView.mm +72 -5
  189. package/ios/stack/header/RNSStackHeaderItemDataProviding.h +7 -0
  190. package/ios/stack/header/RNSStackHeaderItemShadowStateProxy.mm +1 -1
  191. package/ios/stack/header/RNSStackHeaderItemSpacerComponentView.mm +2 -1
  192. package/ios/stack/header/RNSStackHeaderMenuCoordinator.h +13 -0
  193. package/ios/stack/header/RNSStackHeaderMenuCoordinator.mm +24 -0
  194. package/ios/stack/header/RNSStackHeaderMenuFinder.h +8 -1
  195. package/ios/stack/header/RNSStackHeaderMenuFinder.mm +26 -9
  196. package/ios/stack/header/RNSStackHeaderMenuMapper.mm +4 -0
  197. package/ios/stack/host/RNSStackNavigationBar.h +25 -0
  198. package/ios/stack/host/RNSStackNavigationBar.mm +80 -0
  199. package/ios/stack/host/RNSStackNavigationBarCoordinator.h +8 -0
  200. package/ios/stack/host/RNSStackNavigationBarCoordinator.mm +11 -0
  201. package/ios/stack/host/RNSStackNavigationController.mm +13 -5
  202. package/ios/stack/host/RNSStackOperation.h +0 -2
  203. package/ios/stack/screen/RNSStackScreenComponentView.h +2 -1
  204. package/ios/stack/screen/RNSStackScreenComponentView.mm +32 -2
  205. package/ios/stack/screen/RNSStackScreenController.mm +12 -0
  206. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.h +8 -0
  207. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.mm +179 -24
  208. package/ios/tabs/RNSTabBarAppearanceCoordinator.mm +110 -16
  209. package/ios/tabs/RNSTabBarItemCoordinator.h +16 -0
  210. package/ios/tabs/RNSTabBarItemCoordinator.mm +143 -0
  211. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.h +1 -1
  212. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.mm +1 -1
  213. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.mm +1 -1
  214. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryEventEmitter.mm +1 -1
  215. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryShadowStateProxy.mm +1 -1
  216. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.h +24 -0
  217. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.mm +22 -0
  218. package/ios/tabs/conversion/RNSConversions-Tabs.h +100 -0
  219. package/ios/{conversion → tabs/conversion}/RNSConversions-Tabs.mm +105 -74
  220. package/ios/tabs/extensions/RNSTabsHostComponentView+RNSImageLoader.h +1 -1
  221. package/ios/tabs/host/RNSTabBarController.h +16 -0
  222. package/ios/tabs/host/RNSTabBarController.mm +516 -107
  223. package/ios/tabs/host/RNSTabsHostComponentView.h +4 -0
  224. package/ios/tabs/host/RNSTabsHostComponentView.mm +41 -4
  225. package/ios/tabs/host/RNSTabsHostEventEmitter.mm +1 -1
  226. package/ios/tabs/screen/RNSTabsScreenComponentView.h +21 -0
  227. package/ios/tabs/screen/RNSTabsScreenComponentView.mm +56 -56
  228. package/ios/tabs/screen/RNSTabsScreenViewController.mm +1 -0
  229. package/ios/utils/RNSDefines.h +15 -7
  230. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js +37 -21
  231. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  232. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js +41 -4
  233. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  234. package/lib/commonjs/components/stack/header/StackHeaderConfig.js +17 -0
  235. package/lib/commonjs/components/stack/header/StackHeaderConfig.js.map +1 -0
  236. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js +4 -1
  237. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  238. package/lib/commonjs/components/stack/host/StackHost.js +17 -7
  239. package/lib/commonjs/components/stack/host/StackHost.js.map +1 -1
  240. package/lib/commonjs/components/stack/host/StackHost.web.js +0 -2
  241. package/lib/commonjs/components/stack/host/StackHost.web.js.map +1 -1
  242. package/lib/commonjs/components/stack/index.js.map +1 -1
  243. package/lib/commonjs/components/tabs/host/TabsHost.ios.js +3 -0
  244. package/lib/commonjs/components/tabs/host/TabsHost.ios.js.map +1 -1
  245. package/lib/commonjs/components/tabs/host/{TabsHost.web.js → TabsHost.js} +1 -1
  246. package/lib/commonjs/components/tabs/host/TabsHost.js.map +1 -0
  247. package/lib/commonjs/components/tabs/index.js.map +1 -1
  248. package/lib/commonjs/components/tabs/screen/TabsScreen.android.js +3 -1
  249. package/lib/commonjs/components/tabs/screen/TabsScreen.android.js.map +1 -1
  250. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js +10 -1
  251. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js.map +1 -1
  252. package/lib/commonjs/components/tabs/screen/{TabsScreen.web.js → TabsScreen.js} +1 -1
  253. package/lib/commonjs/components/tabs/screen/TabsScreen.js.map +1 -0
  254. package/lib/commonjs/components/{stack/header/StackHeaderConfig.d.js → tabs/screen/TabsScreenIcon.types.js} +1 -1
  255. package/lib/commonjs/components/{stack/header/StackHeaderConfig.d.js.map → tabs/screen/TabsScreenIcon.types.js.map} +1 -1
  256. package/lib/commonjs/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  257. package/lib/commonjs/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  258. package/lib/commonjs/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  259. package/lib/commonjs/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  260. package/lib/commonjs/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  261. package/lib/commonjs/fabric/stack/StackHostNativeComponent.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 +1 -1
  265. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  266. package/lib/commonjs/legacy/components/ScreenStackItem.js +31 -11
  267. package/lib/commonjs/legacy/components/ScreenStackItem.js.map +1 -1
  268. package/lib/module/components/stack/header/StackHeaderConfig.android.js +39 -23
  269. package/lib/module/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  270. package/lib/module/components/stack/header/StackHeaderConfig.ios.js +43 -6
  271. package/lib/module/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  272. package/lib/module/components/stack/header/StackHeaderConfig.js +10 -0
  273. package/lib/module/components/stack/header/StackHeaderConfig.js.map +1 -0
  274. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js +4 -1
  275. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  276. package/lib/module/components/stack/host/StackHost.js +18 -8
  277. package/lib/module/components/stack/host/StackHost.js.map +1 -1
  278. package/lib/module/components/stack/host/StackHost.web.js +0 -3
  279. package/lib/module/components/stack/host/StackHost.web.js.map +1 -1
  280. package/lib/module/components/stack/index.js.map +1 -1
  281. package/lib/module/components/tabs/host/TabsHost.ios.js +3 -0
  282. package/lib/module/components/tabs/host/TabsHost.ios.js.map +1 -1
  283. package/{src/components/tabs/host/TabsHost.web.tsx → lib/module/components/tabs/host/TabsHost.js} +1 -2
  284. package/lib/module/components/tabs/host/TabsHost.js.map +1 -0
  285. package/lib/module/components/tabs/index.js.map +1 -1
  286. package/lib/module/components/tabs/screen/TabsScreen.android.js +3 -1
  287. package/lib/module/components/tabs/screen/TabsScreen.android.js.map +1 -1
  288. package/lib/module/components/tabs/screen/TabsScreen.ios.js +10 -1
  289. package/lib/module/components/tabs/screen/TabsScreen.ios.js.map +1 -1
  290. package/{src/components/tabs/screen/TabsScreen.web.tsx → lib/module/components/tabs/screen/TabsScreen.js} +1 -2
  291. package/lib/module/components/tabs/screen/TabsScreen.js.map +1 -0
  292. package/lib/module/components/tabs/screen/TabsScreenIcon.types.js +2 -0
  293. package/lib/module/components/{stack/header/StackHeaderConfig.d.js.map → tabs/screen/TabsScreenIcon.types.js.map} +1 -1
  294. package/lib/module/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  295. package/lib/module/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  296. package/lib/module/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  297. package/lib/module/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  298. package/lib/module/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  299. package/lib/module/fabric/stack/StackHostNativeComponent.js.map +1 -1
  300. package/lib/module/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  301. package/lib/module/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  302. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js +1 -1
  303. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  304. package/lib/module/legacy/components/ScreenStackItem.js +31 -11
  305. package/lib/module/legacy/components/ScreenStackItem.js.map +1 -1
  306. package/lib/typescript/components/modals/form-sheet/FormSheet.types.d.ts +1 -1
  307. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts +6 -3
  308. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts.map +1 -1
  309. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts +620 -24
  310. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts.map +1 -1
  311. package/lib/typescript/components/stack/header/StackHeaderConfig.d.ts +8 -0
  312. package/lib/typescript/components/stack/header/StackHeaderConfig.d.ts.map +1 -0
  313. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts +6 -3
  314. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts.map +1 -1
  315. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts +361 -2
  316. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts.map +1 -1
  317. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts +4 -2
  318. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts.map +1 -1
  319. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.d.ts.map +1 -1
  320. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts +7 -0
  321. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts.map +1 -1
  322. package/lib/typescript/components/stack/host/StackHost.d.ts +1 -1
  323. package/lib/typescript/components/stack/host/StackHost.d.ts.map +1 -1
  324. package/lib/typescript/components/stack/host/StackHost.types.d.ts +47 -0
  325. package/lib/typescript/components/stack/host/StackHost.types.d.ts.map +1 -1
  326. package/lib/typescript/components/stack/host/StackHost.web.d.ts +1 -3
  327. package/lib/typescript/components/stack/host/StackHost.web.d.ts.map +1 -1
  328. package/lib/typescript/components/stack/index.d.ts +4 -3
  329. package/lib/typescript/components/stack/index.d.ts.map +1 -1
  330. package/lib/typescript/components/tabs/host/TabsHost.d.ts +5 -0
  331. package/lib/typescript/components/tabs/host/TabsHost.d.ts.map +1 -0
  332. package/lib/typescript/components/tabs/host/TabsHost.ios.d.ts.map +1 -1
  333. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts +72 -0
  334. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts.map +1 -1
  335. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts +3 -0
  336. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts.map +1 -1
  337. package/lib/typescript/components/tabs/index.d.ts +4 -6
  338. package/lib/typescript/components/tabs/index.d.ts.map +1 -1
  339. package/lib/typescript/components/tabs/screen/TabsScreen.android.d.ts.map +1 -1
  340. package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts +42 -7
  341. package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts.map +1 -1
  342. package/lib/typescript/components/tabs/screen/TabsScreen.d.ts +5 -0
  343. package/lib/typescript/components/tabs/screen/TabsScreen.d.ts.map +1 -0
  344. package/lib/typescript/components/tabs/screen/TabsScreen.ios.d.ts.map +1 -1
  345. package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts +78 -13
  346. package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts.map +1 -1
  347. package/lib/typescript/components/tabs/screen/TabsScreenIcon.types.d.ts +91 -0
  348. package/lib/typescript/components/tabs/screen/TabsScreenIcon.types.d.ts.map +1 -0
  349. package/lib/typescript/components/tabs/screen/index.d.ts +1 -0
  350. package/lib/typescript/components/tabs/screen/index.d.ts.map +1 -1
  351. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -0
  352. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  353. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts +1 -0
  354. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts.map +1 -1
  355. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts +52 -0
  356. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts.map +1 -1
  357. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts +29 -1
  358. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts.map +1 -1
  359. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts +8 -0
  360. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts.map +1 -1
  361. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts +3 -1
  362. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts.map +1 -1
  363. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts +4 -0
  364. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts.map +1 -1
  365. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts +6 -0
  366. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts.map +1 -1
  367. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts +10 -1
  368. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts.map +1 -1
  369. package/lib/typescript/legacy/components/ScreenStackItem.d.ts +25 -0
  370. package/lib/typescript/legacy/components/ScreenStackItem.d.ts.map +1 -1
  371. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts +4 -0
  372. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts.map +1 -1
  373. package/lib/typescript/legacy/types.d.ts +30 -0
  374. package/lib/typescript/legacy/types.d.ts.map +1 -1
  375. package/package.json +11 -8
  376. package/react-native.config.js +3 -0
  377. package/src/components/modals/form-sheet/FormSheet.types.ts +1 -1
  378. package/src/components/stack/header/StackHeaderConfig.android.tsx +54 -43
  379. package/src/components/stack/header/StackHeaderConfig.android.types.ts +641 -24
  380. package/src/components/stack/header/StackHeaderConfig.ios.tsx +55 -17
  381. package/src/components/stack/header/StackHeaderConfig.ios.types.ts +384 -2
  382. package/src/components/stack/header/StackHeaderConfig.tsx +12 -0
  383. package/src/components/stack/header/StackHeaderConfig.types.ts +4 -2
  384. package/src/components/stack/header/ios/StackHeaderItem.ios.tsx +9 -1
  385. package/src/components/stack/header/ios/StackHeaderItem.ios.types.ts +7 -0
  386. package/src/components/stack/host/StackHost.tsx +12 -3
  387. package/src/components/stack/host/StackHost.types.ts +50 -0
  388. package/src/components/stack/host/StackHost.web.tsx +1 -4
  389. package/src/components/stack/index.ts +14 -1
  390. package/src/components/tabs/host/TabsHost.ios.tsx +3 -0
  391. package/src/components/tabs/host/TabsHost.ios.types.ts +76 -0
  392. package/src/components/tabs/host/TabsHost.tsx +7 -0
  393. package/src/components/tabs/host/TabsHost.types.ts +3 -0
  394. package/src/components/tabs/index.ts +9 -0
  395. package/src/components/tabs/screen/TabsScreen.android.tsx +8 -3
  396. package/src/components/tabs/screen/TabsScreen.android.types.ts +42 -7
  397. package/src/components/tabs/screen/TabsScreen.ios.tsx +22 -5
  398. package/src/components/tabs/screen/TabsScreen.ios.types.ts +79 -17
  399. package/src/components/tabs/screen/TabsScreen.tsx +7 -0
  400. package/src/components/tabs/screen/TabsScreenIcon.types.ts +117 -0
  401. package/src/components/tabs/screen/index.ts +1 -0
  402. package/src/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.ts +6 -0
  403. package/src/fabric/legacy/ScreenStackNativeComponent.ts +2 -0
  404. package/src/fabric/stack/StackHeaderConfigAndroidNativeComponent.ts +78 -0
  405. package/src/fabric/stack/StackHeaderConfigIOSNativeComponent.ts +43 -0
  406. package/src/fabric/stack/StackHeaderItemIOSNativeComponent.ts +13 -0
  407. package/src/fabric/stack/StackHostNativeComponent.ts +11 -2
  408. package/src/fabric/tabs/TabsHostIOSNativeComponent.ts +8 -0
  409. package/src/fabric/tabs/TabsScreenAndroidNativeComponent.ts +9 -0
  410. package/src/fabric/tabs/TabsScreenIOSNativeComponent.ts +20 -2
  411. package/src/legacy/components/ScreenStackItem.tsx +59 -12
  412. package/src/legacy/types.ts +31 -0
  413. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenModalFragment.kt +0 -281
  414. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/BottomSheetDialogRootView.kt +0 -104
  415. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/BottomSheetDialogScreen.kt +0 -26
  416. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingView.kt +0 -83
  417. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewManager.kt +0 -89
  418. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewPointerEvents.kt +0 -18
  419. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetDimensionsCoordinator.kt +0 -134
  420. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetDialogManager.kt +0 -162
  421. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/model/FormSheetDetents.kt +0 -106
  422. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetPresentationManager.kt +0 -198
  423. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuSelectionController.kt +0 -83
  424. package/ios/conversion/RNSConversions-Stack.h +0 -32
  425. package/ios/conversion/RNSConversions-Stack.mm +0 -41
  426. package/ios/conversion/always_false.h +0 -31
  427. package/lib/commonjs/components/stack/header/StackHeaderConfig.web.js +0 -10
  428. package/lib/commonjs/components/stack/header/StackHeaderConfig.web.js.map +0 -1
  429. package/lib/commonjs/components/tabs/host/TabsHost.d.js +0 -2
  430. package/lib/commonjs/components/tabs/host/TabsHost.d.js.map +0 -1
  431. package/lib/commonjs/components/tabs/host/TabsHost.web.js.map +0 -1
  432. package/lib/commonjs/components/tabs/screen/TabsScreen.d.js +0 -2
  433. package/lib/commonjs/components/tabs/screen/TabsScreen.d.js.map +0 -1
  434. package/lib/commonjs/components/tabs/screen/TabsScreen.web.js.map +0 -1
  435. package/lib/module/components/stack/header/StackHeaderConfig.d.js +0 -2
  436. package/lib/module/components/stack/header/StackHeaderConfig.web.js +0 -4
  437. package/lib/module/components/stack/header/StackHeaderConfig.web.js.map +0 -1
  438. package/lib/module/components/tabs/host/TabsHost.d.js +0 -2
  439. package/lib/module/components/tabs/host/TabsHost.d.js.map +0 -1
  440. package/lib/module/components/tabs/host/TabsHost.web.js +0 -4
  441. package/lib/module/components/tabs/host/TabsHost.web.js.map +0 -1
  442. package/lib/module/components/tabs/screen/TabsScreen.d.js +0 -2
  443. package/lib/module/components/tabs/screen/TabsScreen.d.js.map +0 -1
  444. package/lib/module/components/tabs/screen/TabsScreen.web.js +0 -4
  445. package/lib/module/components/tabs/screen/TabsScreen.web.js.map +0 -1
  446. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts +0 -7
  447. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts.map +0 -1
  448. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts +0 -7
  449. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts.map +0 -1
  450. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts +0 -7
  451. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts.map +0 -1
  452. package/src/components/stack/header/StackHeaderConfig.d.ts +0 -22
  453. package/src/components/stack/header/StackHeaderConfig.web.tsx +0 -5
  454. package/src/components/tabs/host/TabsHost.d.ts +0 -12
  455. package/src/components/tabs/screen/TabsScreen.d.ts +0 -12
  456. /package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.h +0 -0
@@ -1,9 +1,9 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.coordinator
1
+ package com.swmansion.rnscreens.core.modals.formsheet.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
+ import com.swmansion.rnscreens.core.modals.formsheet.model.FormSheetDetents
7
7
 
8
8
  internal class FormSheetBehaviorController(
9
9
  private val sheetView: FrameLayout,
@@ -69,6 +69,9 @@ internal class FormSheetBehaviorController(
69
69
  }
70
70
 
71
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
+ *
72
75
  * @param detents - parsed detents configuration.
73
76
  * @param sheetAvailableSpace - the full window height that detent fractions are measured against.
74
77
  * Using the full height lets a BottomSheet with large detent configured to slide
@@ -77,7 +80,11 @@ internal class FormSheetBehaviorController(
77
80
  * Used exclusively when the sheet is in `fitToContents` mode.
78
81
  * @param nativeContainerPaddingBottom - the bottom system inset. In `fitToContents` mode, this is added to the
79
82
  * BottomSheet's height to extend its background behind the system bars, while the inner content remains within
80
- * 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].
81
88
  * @param initialDetentIndex - the index of the detent the sheet should snap to while opening.
82
89
  * @param applyInitialDetent - whether the sheet should forcefully snap to the initial detent state.
83
90
  * This should typically be `true` only when the sheet transitions from closed to open.
@@ -87,6 +94,7 @@ internal class FormSheetBehaviorController(
87
94
  sheetAvailableSpace: Int,
88
95
  contentHeightForFitToContents: Int = 0,
89
96
  nativeContainerPaddingBottom: Int = 0,
97
+ keyboardLift: Int = 0,
90
98
  initialDetentIndex: Int = 0,
91
99
  applyInitialDetent: Boolean = false,
92
100
  ) {
@@ -97,22 +105,39 @@ internal class FormSheetBehaviorController(
97
105
  }
98
106
 
99
107
  if (detents.isFitToContents) {
100
- configureFitToContents(detents, sheetAvailableSpace, contentHeightForFitToContents, nativeContainerPaddingBottom)
108
+ configureFitToContents(
109
+ detents,
110
+ sheetAvailableSpace,
111
+ contentHeightForFitToContents,
112
+ nativeContainerPaddingBottom,
113
+ keyboardLift,
114
+ )
101
115
  } else {
102
116
  when (detents.count) {
103
- 1 -> configureSingleDetent(detents, sheetAvailableSpace)
104
- 2 -> configureTwoDetents(detents, sheetAvailableSpace, initialDetentIndex, applyInitialDetent)
105
- 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
+ )
106
136
  else -> throw IllegalStateException(
107
137
  "[RNScreens] Unsupported detent count ${detents.count}.",
108
138
  )
109
139
  }
110
140
  }
111
-
112
- // Metrics were mutated on an already-measured sheet; force a fresh layout
113
- // pass so the behavior re-settles to the new detent instead of keeping its
114
- // stale height.
115
- sheetView.requestLayout()
116
141
  }
117
142
 
118
143
  private fun configureFitToContents(
@@ -120,33 +145,37 @@ internal class FormSheetBehaviorController(
120
145
  sheetAvailableSpace: Int,
121
146
  contentHeight: Int,
122
147
  bottomInset: Int,
148
+ keyboardLift: Int,
123
149
  ) = behavior.apply {
124
150
  skipCollapsed = true
125
151
  isFitToContents = true
126
- maxHeight = detents.maxAllowedHeightForFitToContents(sheetAvailableSpace, contentHeight, bottomInset)
152
+ maxHeight = detents.maxAllowedHeightForFitToContents(sheetAvailableSpace, contentHeight, bottomInset, keyboardLift)
127
153
  state = BottomSheetBehavior.STATE_EXPANDED
128
154
  }
129
155
 
130
156
  private fun configureSingleDetent(
131
157
  detents: FormSheetDetents,
132
158
  sheetAvailableSpace: Int,
159
+ keyboardLift: Int,
133
160
  ) = behavior.apply {
134
161
  skipCollapsed = true
135
162
  isFitToContents = true
136
- maxHeight = detents.maxAllowedHeight(sheetAvailableSpace)
163
+ maxHeight = detents.maxAllowedHeight(sheetAvailableSpace, keyboardLift)
137
164
  state = BottomSheetBehavior.STATE_EXPANDED
138
165
  }
139
166
 
140
167
  private fun configureTwoDetents(
141
168
  detents: FormSheetDetents,
142
169
  sheetAvailableSpace: Int,
170
+ bottomInset: Int,
171
+ keyboardLift: Int,
143
172
  initialDetentIndex: Int,
144
173
  applyInitialDetent: Boolean,
145
174
  ) = behavior.apply {
146
175
  skipCollapsed = false
147
176
  isFitToContents = true
148
- peekHeight = detents.firstHeight(sheetAvailableSpace)
149
- maxHeight = detents.maxAllowedHeight(sheetAvailableSpace)
177
+ peekHeight = detents.peekHeight(sheetAvailableSpace, bottomInset, keyboardLift)
178
+ maxHeight = detents.maxAllowedHeight(sheetAvailableSpace, keyboardLift)
150
179
  if (applyInitialDetent) {
151
180
  state = resolveStateFromIndex(initialDetentIndex, detents.count)
152
181
  }
@@ -155,15 +184,17 @@ internal class FormSheetBehaviorController(
155
184
  private fun configureThreeDetents(
156
185
  detents: FormSheetDetents,
157
186
  sheetAvailableSpace: Int,
187
+ bottomInset: Int,
188
+ keyboardLift: Int,
158
189
  initialDetentIndex: Int,
159
190
  applyInitialDetent: Boolean,
160
191
  ) = behavior.apply {
161
192
  skipCollapsed = false
162
193
  isFitToContents = false
163
- peekHeight = detents.firstHeight(sheetAvailableSpace)
164
- halfExpandedRatio = detents.halfExpandedRatio()
165
- expandedOffset = detents.expandedOffsetFromTop(sheetAvailableSpace)
166
- 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)
167
198
  if (applyInitialDetent) {
168
199
  state = resolveStateFromIndex(initialDetentIndex, detents.count)
169
200
  }
@@ -0,0 +1,159 @@
1
+ package com.swmansion.rnscreens.core.modals.formsheet.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.core.modals.formsheet.dialog.FormSheetAvailableHeightProvider
8
+ import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetContainer
9
+ import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetDialog
10
+ import com.swmansion.rnscreens.core.modals.formsheet.interfaces.FormSheetContentSizeChangeDelegate
11
+ import com.swmansion.rnscreens.core.modals.formsheet.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.core.modals.formsheet.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
+ }
@@ -1,13 +1,11 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.coordinator
1
+ package com.swmansion.rnscreens.core.modals.formsheet.coordinator
2
2
 
3
3
  import androidx.activity.OnBackPressedCallback
4
- import com.swmansion.rnscreens.modals.dimmingview.DimmingViewManager
5
- import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetDialog
4
+ import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetDialog
6
5
 
7
6
  internal class FormSheetNativeDismissCoordinator(
8
7
  private val dialog: FormSheetDialog,
9
8
  private val behaviorController: FormSheetBehaviorController?,
10
- private val dimmingManager: DimmingViewManager,
11
9
  private val onDismissAllowed: () -> Unit,
12
10
  private val onDismissPrevented: () -> Unit,
13
11
  ) : FormSheetDialog.CancelRequestInterceptor {
@@ -27,15 +25,11 @@ internal class FormSheetNativeDismissCoordinator(
27
25
  internal fun setup() {
28
26
  dialog.cancelRequestInterceptor = this
29
27
  dialog.onBackPressedDispatcher.addCallback(preventNativeDismissBackPressCallback)
30
- // Backdrop taps go through `cancel()` rather than dismissing directly, so that they are
31
- // subject to the very same interception as the back press and the swipe down.
32
- dimmingManager.setOnBackdropClickListener { dialog.cancel() }
33
28
  }
34
29
 
35
30
  internal fun destroy() {
36
31
  dialog.cancelRequestInterceptor = null
37
32
  preventNativeDismissBackPressCallback.remove()
38
- dimmingManager.setOnBackdropClickListener(null)
39
33
  }
40
34
 
41
35
  override fun handleCancelRequest() {
@@ -0,0 +1,44 @@
1
+ package com.swmansion.rnscreens.core.modals.formsheet.dialog
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.native.core
1
+ package com.swmansion.rnscreens.core.modals.formsheet.dialog
2
2
 
3
3
  import android.annotation.SuppressLint
4
4
  import android.content.Context
@@ -1,7 +1,8 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.core
1
+ package com.swmansion.rnscreens.core.modals.formsheet.dialog
2
2
 
3
3
  import android.content.Context
4
4
  import android.os.Bundle
5
+ import android.util.Log
5
6
  import android.view.View
6
7
  import android.view.ViewGroup
7
8
  import android.view.Window
@@ -14,8 +15,8 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
14
15
  * A custom BottomSheetDialog override used to render the FormSheet native component.
15
16
  *
16
17
  * We enforce edge-to-edge rendering, bypassing standard Material checks.
17
- * This enforcement is required because our custom dimming view must span the entire screen.
18
- * The FormSheetContainer is sized manually against the system insets.
18
+ * This is required because our custom dimming logic needs the Dialog to span
19
+ * the entire screen. The FormSheetContainer is sized manually against the system insets.
19
20
  */
20
21
  internal class FormSheetDialog(
21
22
  context: Context,
@@ -33,6 +34,12 @@ internal class FormSheetDialog(
33
34
 
34
35
  internal var cancelRequestInterceptor: CancelRequestInterceptor? = null
35
36
 
37
+ /**
38
+ * Installed next to Material's content once the dialog is created. Reports the height the sheet
39
+ * is measured against so the sheet metrics can be resolved before the sheet itself is measured.
40
+ */
41
+ internal val availableHeightProvider = FormSheetAvailableHeightProvider(context)
42
+
36
43
  override fun onCreate(savedInstanceState: Bundle?) {
37
44
  super.onCreate(savedInstanceState)
38
45
 
@@ -40,6 +47,7 @@ internal class FormSheetDialog(
40
47
  disableNativeWindowAnimation(window)
41
48
 
42
49
  setupBottomSheetHeight()
50
+ installAvailableHeightProvider()
43
51
  }
44
52
 
45
53
  override fun onAttachedToWindow() {
@@ -63,7 +71,8 @@ internal class FormSheetDialog(
63
71
  * `enableEdgeToEdge` attribute AND the navigation bar is translucent (see
64
72
  * `BottomSheetDialog#onAttachedToWindow`).
65
73
  *
66
- * We force edge-to-edge on every API level so the custom dimming view covers the whole screen.
74
+ * We force edge-to-edge on every API level so the window content always spans the whole
75
+ * screen.
67
76
  */
68
77
  private fun forceEdgeToEdge() {
69
78
  val window = window ?: return
@@ -80,4 +89,27 @@ internal class FormSheetDialog(
80
89
  val bottomSheetView = findViewById<FrameLayout>(com.google.android.material.R.id.design_bottom_sheet)
81
90
  bottomSheetView?.layoutParams?.height = ViewGroup.LayoutParams.MATCH_PARENT
82
91
  }
92
+
93
+ private fun installAvailableHeightProvider() {
94
+ if (availableHeightProvider.parent != null) {
95
+ return
96
+ }
97
+
98
+ val contentParent = findViewById<ViewGroup>(android.R.id.content)
99
+ if (contentParent == null) {
100
+ Log.e(TAG, "[RNScreens] Window content view not found; the sheet dimensions won't be resolved.")
101
+ return
102
+ }
103
+
104
+ // FrameLayout measures its children in order, so the provider reports the height before Material's container
105
+ contentParent.addView(
106
+ availableHeightProvider,
107
+ 0,
108
+ FrameLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT),
109
+ )
110
+ }
111
+
112
+ companion object {
113
+ private const val TAG = "FormSheetDialog"
114
+ }
83
115
  }