@apexnative/navigation 1.0.0-alpha.1 → 1.0.0-alpha.11

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 (581) hide show
  1. package/ApexNavigation.podspec +2 -1
  2. package/CHANGELOG.md +132 -0
  3. package/README.md +147 -51
  4. package/android/CLAUDE.md +78 -25
  5. package/android/CORE.md +49 -25
  6. package/android/RECIPES.md +13 -6
  7. package/android/consumer-rules.pro +6 -0
  8. package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +85 -10
  9. package/android/src/main/java/dev/apexnative/navigation/NavigationApplication.kt +34 -13
  10. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutChecks.kt +5 -1
  11. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutNode.kt +6 -2
  12. package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenContext.kt +2 -2
  13. package/android/src/main/java/dev/apexnative/navigation/options/AnimationsOptions.kt +2 -2
  14. package/android/src/main/java/dev/apexnative/navigation/options/BottomTabOptions.kt +1 -1
  15. package/android/src/main/java/dev/apexnative/navigation/options/BottomTabsOptions.kt +13 -8
  16. package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +2 -2
  17. package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +3 -3
  18. package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +9 -1
  19. package/android/src/main/java/dev/apexnative/navigation/options/LargeTitleOptions.kt +1 -1
  20. package/android/src/main/java/dev/apexnative/navigation/options/LayoutAnimation.kt +1 -1
  21. package/android/src/main/java/dev/apexnative/navigation/options/OptionKey.kt +18 -0
  22. package/android/src/main/java/dev/apexnative/navigation/options/OptionPaths.kt +91 -0
  23. package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +8 -4
  24. package/android/src/main/java/dev/apexnative/navigation/options/SheetOptions.kt +7 -4
  25. package/android/src/main/java/dev/apexnative/navigation/options/SideMenuOptions.kt +6 -1
  26. package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +40 -2
  27. package/android/src/main/java/dev/apexnative/navigation/options/StatusBarOptions.kt +7 -3
  28. package/android/src/main/java/dev/apexnative/navigation/options/TitleOptions.kt +2 -2
  29. package/android/src/main/java/dev/apexnative/navigation/options/TopBarAppearanceOptions.kt +1 -1
  30. package/android/src/main/java/dev/apexnative/navigation/options/TopBarOptions.kt +16 -7
  31. package/android/src/main/java/dev/apexnative/navigation/options/UserChoices.kt +159 -0
  32. package/android/src/main/java/dev/apexnative/navigation/react/CommandAnswer.kt +29 -36
  33. package/android/src/main/java/dev/apexnative/navigation/react/CommandContract.kt +59 -0
  34. package/android/src/main/java/dev/apexnative/navigation/react/ContentHeights.kt +95 -0
  35. package/android/src/main/java/dev/apexnative/navigation/react/ContentMounts.kt +66 -0
  36. package/android/src/main/java/dev/apexnative/navigation/react/ErrorTexts.kt +75 -60
  37. package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +35 -23
  38. package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +12 -7
  39. package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +42 -4
  40. package/android/src/main/java/dev/apexnative/navigation/react/PendingCalls.kt +48 -0
  41. package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +54 -20
  42. package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +7 -6
  43. package/android/src/main/java/dev/apexnative/navigation/react/ScreenEnvironment.kt +177 -0
  44. package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +19 -50
  45. package/android/src/main/java/dev/apexnative/navigation/react/ScrollEvents.kt +49 -128
  46. package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +50 -81
  47. package/android/src/main/java/dev/apexnative/navigation/react/events/EventContract.kt +226 -0
  48. package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +135 -94
  49. package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationState.kt +154 -0
  50. package/android/src/main/java/dev/apexnative/navigation/react/events/ScreenAppearance.kt +0 -6
  51. package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +12 -10
  52. package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +10 -7
  53. package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +39 -19
  54. package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +16 -4
  55. package/android/src/main/java/dev/apexnative/navigation/slots/SlotViews.kt +40 -0
  56. package/android/src/main/java/dev/apexnative/navigation/utils/ImageKey.kt +66 -0
  57. package/android/src/main/java/dev/apexnative/navigation/utils/ImageLoader.kt +7 -89
  58. package/android/src/main/java/dev/apexnative/navigation/utils/ImageRequests.kt +76 -0
  59. package/android/src/main/java/dev/apexnative/navigation/utils/MaterialTheme.kt +5 -6
  60. package/android/src/main/java/dev/apexnative/navigation/utils/OptionImages.kt +262 -0
  61. package/android/src/main/java/dev/apexnative/navigation/utils/SystemAnimations.kt +36 -0
  62. package/android/src/main/java/dev/apexnative/navigation/utils/UiUtils.kt +3 -3
  63. package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +3 -1
  64. package/android/src/main/java/dev/apexnative/navigation/utils/ViewExtensions.kt +0 -13
  65. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +10 -7
  66. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementDefinition.kt +9 -3
  67. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementPlanner.kt +20 -15
  68. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/SecondaryScreenPresenter.kt +13 -5
  69. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/AppliedTabCalls.kt +49 -0
  70. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +5 -3
  71. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +108 -34
  72. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +25 -24
  73. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +22 -0
  74. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +3 -3
  75. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +0 -5
  76. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +28 -7
  77. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +12 -9
  78. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +2 -2
  79. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +27 -7
  80. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +1 -1
  81. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +103 -56
  82. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +29 -11
  83. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +2 -6
  84. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +22 -24
  85. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +109 -21
  86. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +21 -6
  87. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +476 -73
  88. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +57 -25
  89. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetBack.kt +42 -0
  90. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetStops.kt +83 -0
  91. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackCheck.kt +50 -0
  92. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +49 -14
  93. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +71 -12
  94. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +37 -11
  95. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +10 -8
  96. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +11 -4
  97. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +3 -3
  98. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +6 -6
  99. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +42 -9
  100. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +19 -8
  101. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +16 -7
  102. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +43 -4
  103. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +23 -0
  104. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +77 -17
  105. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/BackPreview.kt +315 -0
  106. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +3 -3
  107. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +30 -20
  108. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +216 -18
  109. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +26 -1
  110. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +149 -41
  111. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +26 -8
  112. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +115 -6
  113. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabMotion.kt +142 -0
  114. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +222 -48
  115. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +3 -5
  116. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +30 -34
  117. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +5 -51
  118. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarRowTransition.kt +3 -2
  119. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +11 -5
  120. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +13 -56
  121. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +219 -54
  122. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +9 -2
  123. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +6 -9
  124. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +75 -21
  125. package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationLayer.kt +73 -0
  126. package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +29 -11
  127. package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +14 -0
  128. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +9 -7
  129. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +61 -2
  130. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +0 -5
  131. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +72 -10
  132. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStep.kt +31 -0
  133. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +143 -135
  134. package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +13 -5
  135. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +37 -112
  136. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +9 -6
  137. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionViews.kt +100 -0
  138. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +112 -4
  139. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +346 -36
  140. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMorph.kt +199 -0
  141. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +56 -41
  142. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextMorph.kt +176 -0
  143. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewMorph.kt +108 -0
  144. package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +12 -3
  145. package/android/src/main/java/dev/apexnative/navigation/views/stack/ScreenEdge.kt +45 -0
  146. package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +140 -1
  147. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +14 -10
  148. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCopy.kt +85 -0
  149. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +13 -0
  150. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +5 -17
  151. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +73 -34
  152. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +6 -6
  153. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonView.kt +113 -0
  154. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarMenu.kt +219 -0
  155. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +125 -178
  156. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +34 -64
  157. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonRow.kt +216 -0
  158. package/android/src/main/jni/ANNContentHeights.cpp +82 -0
  159. package/android/src/main/res/drawable/apex_navigation_ic_arrow_right.xml +14 -0
  160. package/android/src/main/res/layout/apex_navigation_menu_header.xml +19 -0
  161. package/android/src/main/res/layout/apex_navigation_menu_item.xml +68 -0
  162. package/android/src/main/res/values/styles.xml +1 -1
  163. package/android/src/main/res/values-night/styles.xml +1 -1
  164. package/cli/app.js +1 -1
  165. package/cli/doctor/checks/app.js +77 -14
  166. package/cli/doctor/checks/splash.js +4 -22
  167. package/cli/migrate/native.js +18 -0
  168. package/cli/project.js +10 -2
  169. package/cli/setup/index.js +18 -0
  170. package/cli/setup/source.js +2 -1
  171. package/cli/setup/steps/appDelegate.js +66 -11
  172. package/cli/setup/steps/mainApplication.js +134 -19
  173. package/cli/setup/steps/metro.js +46 -0
  174. package/cli/setup/steps/sceneDelegate.js +108 -0
  175. package/cli/splash/index.js +3 -1
  176. package/docs-md/architecture/native-screens.md +4 -0
  177. package/docs-md/architecture/theme-and-context.md +131 -12
  178. package/docs-md/architecture/transitions.md +58 -12
  179. package/docs-md/containers/arrangement.md +17 -1
  180. package/docs-md/containers/modals.md +8 -4
  181. package/docs-md/containers/overlays.md +3 -1
  182. package/docs-md/containers/side-menu.md +19 -2
  183. package/docs-md/containers/tabs.md +5 -1
  184. package/docs-md/flows/bottom-sheets.md +4 -2
  185. package/docs-md/flows/forms-in-a-modal.md +1 -1
  186. package/docs-md/fundamentals/screens-and-props.md +9 -1
  187. package/docs-md/fundamentals/starting-the-app.md +1 -1
  188. package/docs-md/guides/cli.md +4 -3
  189. package/docs-md/guides/deep-links.md +15 -33
  190. package/docs-md/help/glossary.md +4 -4
  191. package/docs-md/help/troubleshooting.md +44 -6
  192. package/docs-md/index.json +61 -1
  193. package/docs-md/migration/from-expo-router.md +1 -1
  194. package/docs-md/migration/from-react-native-navigation.md +9 -3
  195. package/docs-md/migration/from-react-navigation.md +2 -2
  196. package/docs-md/screen-ui/back-and-gestures.md +46 -2
  197. package/docs-md/screen-ui/bar-buttons.md +5 -5
  198. package/docs-md/screen-ui/search.md +1 -1
  199. package/docs-md/screen-ui/system-ui.md +17 -12
  200. package/docs-md/screen-ui/toolbar-and-fab.md +4 -2
  201. package/docs-md/screen-ui/top-bar.md +8 -4
  202. package/docs-md/start/installation.md +21 -3
  203. package/ios/Animations/ANNFrameDriver.h +55 -15
  204. package/ios/Animations/ANNFrameDriver.mm +216 -60
  205. package/ios/Animations/ANNTransitionAnimator.h +26 -5
  206. package/ios/Animations/ANNTransitionAnimator.mm +61 -13
  207. package/ios/Animations/ANNTransitionPlan.h +2 -2
  208. package/ios/Animations/ANNTransitionPlan.mm +10 -0
  209. package/ios/Animations/ANNTransitionWait.mm +6 -7
  210. package/ios/Animations/Elements/ANNElementFinder.h +57 -0
  211. package/ios/Animations/Elements/ANNElementFinder.mm +174 -2
  212. package/ios/Animations/Elements/ANNElementTransition.h +10 -8
  213. package/ios/Animations/Elements/ANNElementTransition.mm +19 -21
  214. package/ios/Animations/Elements/ANNSharedElementFlight.h +16 -11
  215. package/ios/Animations/Elements/ANNSharedElementFlight.mm +308 -69
  216. package/ios/Animations/Interpolators/ANNInterpolate.h +2 -30
  217. package/ios/Animations/Interpolators/ANNTransformParts.h +48 -0
  218. package/ios/Animations/Interpolators/ANNTransformParts.mm +507 -0
  219. package/ios/Animations/Interpolators/ANNViewTracks.h +9 -6
  220. package/ios/Animations/Interpolators/ANNViewTracks.mm +100 -30
  221. package/ios/CLAUDE.md +60 -24
  222. package/ios/CORE.md +44 -34
  223. package/ios/Contract/ANNCommandAnswer.h +13 -5
  224. package/ios/Contract/ANNCommandAnswer.mm +40 -32
  225. package/ios/Contract/ANNCommandContract.h +15 -0
  226. package/ios/Contract/ANNCommandContract.mm +78 -0
  227. package/ios/Contract/ANNCommandRunner.h +10 -9
  228. package/ios/Contract/ANNCommandRunner.mm +22 -28
  229. package/ios/Contract/ANNErrorTexts.h +6 -2
  230. package/ios/Contract/ANNErrorTexts.mm +18 -10
  231. package/ios/Contract/ANNLayoutNode.h +3 -3
  232. package/ios/Contract/ANNLayoutReader.h +3 -3
  233. package/ios/Core/ANNAppDelegate.mm +0 -2
  234. package/ios/Core/ANNAppearanceDispatcher.h +5 -4
  235. package/ios/Core/ANNAppearanceDispatcher.mm +12 -1
  236. package/ios/Core/ANNDeepLinkQueue.h +22 -2
  237. package/ios/Core/ANNDeepLinkQueue.mm +121 -14
  238. package/ios/Core/ANNErrorHandler.h +9 -4
  239. package/ios/Core/ANNErrorHandler.mm +20 -2
  240. package/ios/Core/ANNEventContract.h +246 -0
  241. package/ios/Core/ANNEventContract.mm +225 -0
  242. package/ios/Core/ANNEventEmitter.h +6 -2
  243. package/ios/Core/ANNEventEmitter.mm +117 -80
  244. package/ios/Core/ANNHinge.h +6 -0
  245. package/ios/Core/ANNHinge.mm +15 -4
  246. package/ios/Core/ANNJavaScriptCalls.h +33 -0
  247. package/ios/Core/ANNJavaScriptCalls.mm +52 -0
  248. package/ios/Core/ANNLayoutProtocol.h +5 -5
  249. package/ios/Core/ANNNavigationState.h +7 -5
  250. package/ios/Core/ANNNavigationState.mm +8 -7
  251. package/ios/Core/ANNNodeHelper.h +32 -12
  252. package/ios/Core/ANNNodeHelper.mm +100 -3
  253. package/ios/Core/ANNParking.h +5 -4
  254. package/ios/Core/ANNReloadCoordinator.mm +5 -12
  255. package/ios/Core/ANNRenderWait.h +20 -6
  256. package/ios/Core/ANNRenderWait.mm +143 -56
  257. package/ios/Core/ANNSceneDelegate.mm +25 -15
  258. package/ios/Core/ANNSystemUI.h +3 -2
  259. package/ios/Core/ANNSystemUI.mm +7 -0
  260. package/ios/Core/ANNUtils.h +7 -0
  261. package/ios/Core/ANNUtils.mm +10 -0
  262. package/ios/Core/ApexNavigation+Internal.h +1 -1
  263. package/ios/Core/ApexNavigation.mm +7 -6
  264. package/ios/Core/UIViewController+LayoutProtocol.h +9 -2
  265. package/ios/Core/UIViewController+LayoutProtocol.mm +8 -0
  266. package/ios/Layouts/Arrangement/ANNArrangementState.h +2 -17
  267. package/ios/Layouts/Arrangement/ANNArrangementState.mm +0 -38
  268. package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +195 -21
  269. package/ios/Layouts/Modal/ANNModalCoordinator.h +1 -1
  270. package/ios/Layouts/Modal/ANNModalCoordinator.mm +57 -16
  271. package/ios/Layouts/Modal/ANNModalPresentation.h +8 -5
  272. package/ios/Layouts/Modal/ANNModalPresentation.mm +12 -12
  273. package/ios/Layouts/Modal/ANNSheetPresenter.mm +83 -1
  274. package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +2 -8
  275. package/ios/Layouts/Root/ANNRootCoordinator.mm +58 -19
  276. package/ios/Layouts/Root/ANNSplashViewController.h +5 -3
  277. package/ios/Layouts/Root/ANNSplashViewController.mm +147 -0
  278. package/ios/Layouts/Screen/ANNComponentPresenter.h +11 -3
  279. package/ios/Layouts/Screen/ANNComponentPresenter.mm +34 -6
  280. package/ios/Layouts/Screen/ANNComponentViewController.h +15 -13
  281. package/ios/Layouts/Screen/ANNComponentViewController.mm +130 -75
  282. package/ios/Layouts/Screen/ANNNativeScreenContext.mm +7 -5
  283. package/ios/Layouts/Screen/ANNPreviewInteraction.h +7 -4
  284. package/ios/Layouts/Screen/ANNPreviewInteraction.mm +72 -10
  285. package/ios/Layouts/Screen/ANNScreenEnvironment.h +63 -0
  286. package/ios/Layouts/Screen/ANNScreenEnvironment.mm +181 -0
  287. package/ios/Layouts/Screen/ANNScreenPlace.h +53 -0
  288. package/ios/Layouts/Screen/ANNScreenPlace.mm +205 -0
  289. package/ios/Layouts/Screen/ANNScreenRegions.h +3 -18
  290. package/ios/Layouts/Screen/ANNScreenRegions.mm +9 -44
  291. package/ios/Layouts/Screen/ANNScreenSafeArea.h +4 -9
  292. package/ios/Layouts/Screen/ANNScreenSafeArea.mm +14 -16
  293. package/ios/Layouts/Screen/ANNScreenSettling.h +34 -0
  294. package/ios/Layouts/Screen/ANNScreenSettling.mm +171 -0
  295. package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +8 -0
  296. package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +83 -14
  297. package/ios/Layouts/SplitView/ANNSplitViewCommands.h +3 -2
  298. package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +105 -39
  299. package/ios/Layouts/SplitView/ANNSplitViewController.mm +7 -8
  300. package/ios/Layouts/Stack/ANNPreviewPush.h +7 -6
  301. package/ios/Layouts/Stack/ANNPreviewPush.mm +142 -27
  302. package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +11 -2
  303. package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +14 -7
  304. package/ios/Layouts/Stack/ANNStackCommands.mm +1 -0
  305. package/ios/Layouts/Stack/ANNStackController.h +8 -0
  306. package/ios/Layouts/Stack/ANNStackController.mm +184 -16
  307. package/ios/Layouts/Stack/ANNStackQueue.h +5 -2
  308. package/ios/Layouts/Stack/ANNStackQueue.mm +56 -43
  309. package/ios/Layouts/Stack/ANNSwipePopInteraction.h +26 -0
  310. package/ios/Layouts/Stack/ANNSwipePopInteraction.mm +185 -0
  311. package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +28 -4
  312. package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +4 -2
  313. package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +2 -3
  314. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +4 -0
  315. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +11 -0
  316. package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.h +12 -1
  317. package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +23 -0
  318. package/ios/Layouts/Tabs/ANNBottomTabsController.h +3 -0
  319. package/ios/Layouts/Tabs/ANNBottomTabsController.mm +237 -57
  320. package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +8 -3
  321. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +6 -2
  322. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +232 -43
  323. package/ios/Layouts/Tabs/ANNTabsDesign.h +6 -5
  324. package/ios/Layouts/Tabs/ANNTabsDesign.mm +9 -1
  325. package/ios/Layouts/Tabs/UITabBar+utils.h +5 -5
  326. package/ios/Layouts/Tabs/UITabBar+utils.mm +32 -13
  327. package/ios/Options/ANNAnimationOptions.h +2 -1
  328. package/ios/Options/ANNAnimationOptions.mm +1 -1
  329. package/ios/Options/ANNBottomTabsOptions.h +2 -0
  330. package/ios/Options/ANNBottomTabsOptions.mm +1 -0
  331. package/ios/Options/ANNOptions.h +25 -0
  332. package/ios/Options/ANNOptions.mm +157 -1
  333. package/ios/Options/ANNOptionsCache.h +7 -6
  334. package/ios/Options/ANNOptionsReader.mm +108 -0
  335. package/ios/Options/ANNSearchBarOptions.h +4 -3
  336. package/ios/Options/ANNSheetOptions.h +4 -1
  337. package/ios/Options/ANNSideMenuOptions.h +2 -0
  338. package/ios/Options/ANNSideMenuOptions.mm +2 -0
  339. package/ios/Options/ANNStackPopAnimationOptions.h +13 -0
  340. package/ios/Options/ANNStackPopAnimationOptions.mm +11 -0
  341. package/ios/Options/ANNUserChoice.h +57 -0
  342. package/ios/Options/ANNUserChoice.mm +44 -0
  343. package/ios/Options/Params/ANNImageSource.h +61 -0
  344. package/ios/Options/Params/ANNImageSource.mm +101 -0
  345. package/ios/Options/Params/ANNOptionImages.h +37 -0
  346. package/ios/Options/Params/ANNOptionImages.mm +284 -0
  347. package/ios/Options/Params/ANNParam.h +15 -0
  348. package/ios/Options/Params/ANNParam.mm +61 -0
  349. package/ios/Options/Params/Color.h +3 -0
  350. package/ios/Options/Params/Color.mm +21 -0
  351. package/ios/Options/Params/ColorParser.h +4 -3
  352. package/ios/Options/Params/ColorParser.mm +22 -4
  353. package/ios/Options/Params/Image.h +15 -2
  354. package/ios/Options/Params/Image.mm +35 -2
  355. package/ios/Options/Params/ImageParser.h +5 -5
  356. package/ios/Options/Params/ImageParser.mm +28 -46
  357. package/ios/Public/ApexNavigation/ANNSceneDelegate.h +3 -0
  358. package/ios/Public/ApexNavigation/ApexNavigation.h +1 -1
  359. package/ios/RECIPES.md +13 -6
  360. package/ios/React/ANNReactView.mm +6 -25
  361. package/ios/React/ANNSafeAreaViewComponentView.mm +28 -17
  362. package/ios/React/ANNSurfaceHostingView.h +14 -0
  363. package/ios/React/ANNSurfaceHostingView.mm +144 -1
  364. package/ios/React/Slots/ANNSlotComponentView.mm +24 -17
  365. package/ios/React/Slots/ANNSlotContainers.h +14 -6
  366. package/ios/React/Slots/ANNSlotContainers.mm +75 -2
  367. package/ios/React/Slots/ANNSlotHost.mm +1 -3
  368. package/ios/React/Slots/ANNSlotScreenView.mm +8 -2
  369. package/ios/TopBar/ANNBackButtonPresenter.mm +6 -5
  370. package/ios/TopBar/ANNBarAppearance.h +2 -1
  371. package/ios/TopBar/ANNBarAppearance.mm +111 -30
  372. package/ios/TopBar/ANNBarBackgroundComponent.mm +16 -0
  373. package/ios/TopBar/ANNBarButtonComponentView.h +4 -4
  374. package/ios/TopBar/ANNBarButtonComponentView.mm +1 -1
  375. package/ios/TopBar/ANNBarButtons.h +14 -8
  376. package/ios/TopBar/ANNBarButtons.mm +397 -80
  377. package/ios/TopBar/ANNIconButtonImage.h +1 -0
  378. package/ios/TopBar/ANNIconButtonImage.mm +34 -1
  379. package/ios/TopBar/ANNLargeTitlePresenter.h +13 -0
  380. package/ios/TopBar/ANNLargeTitlePresenter.mm +50 -7
  381. package/ios/TopBar/ANNMainList.h +3 -0
  382. package/ios/TopBar/ANNMainList.mm +4 -0
  383. package/ios/TopBar/ANNScrollEdgeEffects.h +22 -6
  384. package/ios/TopBar/ANNScrollEdgeEffects.mm +123 -16
  385. package/ios/TopBar/ANNSearchPresenter.mm +172 -21
  386. package/ios/TopBar/ANNSearchResultsViewController.mm +29 -6
  387. package/ios/TopBar/ANNTopBarPresenter.h +8 -2
  388. package/ios/TopBar/ANNTopBarPresenter.mm +155 -33
  389. package/ios/TurboModules/ANNTurboEventEmitter.mm +4 -35
  390. package/ios/TurboModules/ANNTurboModule.mm +104 -33
  391. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.cpp +20 -0
  392. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +5 -14
  393. package/lib/module/ARCHITECTURE.md +40 -27
  394. package/lib/module/adapters/NativeANNTurboModule.js.map +1 -1
  395. package/lib/module/api/app/AppRegistry.js +14 -2
  396. package/lib/module/api/app/AppRegistry.js.map +1 -1
  397. package/lib/module/api/app/createNavigation.js +190 -66
  398. package/lib/module/api/app/createNavigation.js.map +1 -1
  399. package/lib/module/api/commands/commands.js +54 -6
  400. package/lib/module/api/commands/commands.js.map +1 -1
  401. package/lib/module/api/events/navigationEvents.js +6 -2
  402. package/lib/module/api/events/navigationEvents.js.map +1 -1
  403. package/lib/module/api/hooks/useNavigation.js +8 -3
  404. package/lib/module/api/hooks/useNavigation.js.map +1 -1
  405. package/lib/module/api/hooks/useSafeAreaInsets.js +4 -3
  406. package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -1
  407. package/lib/module/api/linking/dispatchedLinks.js +23 -0
  408. package/lib/module/api/linking/dispatchedLinks.js.map +1 -0
  409. package/lib/module/api/linking/linking.js +11 -0
  410. package/lib/module/api/linking/linking.js.map +1 -1
  411. package/lib/module/api/navigation.js.map +1 -1
  412. package/lib/module/api/options/OptionsChain.js +2 -2
  413. package/lib/module/api/screens/arrangement.js +5 -2
  414. package/lib/module/api/screens/arrangement.js.map +1 -1
  415. package/lib/module/api/screens/defineScreen.js +45 -3
  416. package/lib/module/api/screens/defineScreen.js.map +1 -1
  417. package/lib/module/api/screens/nativeScreens.js +31 -6
  418. package/lib/module/api/screens/nativeScreens.js.map +1 -1
  419. package/lib/module/api/screens/registerScreens.js +193 -35
  420. package/lib/module/api/screens/registerScreens.js.map +1 -1
  421. package/lib/module/api/theme/theme.js +5 -0
  422. package/lib/module/api/theme/theme.js.map +1 -1
  423. package/lib/module/engine/commands.js +51 -9
  424. package/lib/module/engine/commands.js.map +1 -1
  425. package/lib/module/engine/layout.js +20 -11
  426. package/lib/module/engine/layout.js.map +1 -1
  427. package/lib/module/engine/nativeScreens.js +9 -0
  428. package/lib/module/engine/nativeScreens.js.map +1 -1
  429. package/lib/module/engine/options.js +49 -15
  430. package/lib/module/engine/options.js.map +1 -1
  431. package/lib/module/engine/optionsChange.js +102 -0
  432. package/lib/module/engine/optionsChange.js.map +1 -0
  433. package/lib/module/engine/places.js +52 -7
  434. package/lib/module/engine/places.js.map +1 -1
  435. package/lib/module/engine/props.js +30 -1
  436. package/lib/module/engine/props.js.map +1 -1
  437. package/lib/module/engine/refresh.js +85 -0
  438. package/lib/module/engine/refresh.js.map +1 -0
  439. package/lib/module/engine/rememberedOptions.js +61 -1
  440. package/lib/module/engine/rememberedOptions.js.map +1 -1
  441. package/lib/module/engine/screens.js +77 -16
  442. package/lib/module/engine/screens.js.map +1 -1
  443. package/lib/module/interfaces/contract/commands.json +101 -0
  444. package/lib/module/interfaces/contract/errors.json +275 -0
  445. package/lib/typescript/adapters/NativeANNTurboModule.d.ts +12 -2
  446. package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -1
  447. package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -1
  448. package/lib/typescript/api/app/createNavigation.d.ts +8 -3
  449. package/lib/typescript/api/app/createNavigation.d.ts.map +1 -1
  450. package/lib/typescript/api/commands/commands.d.ts.map +1 -1
  451. package/lib/typescript/api/commands/presentation.d.ts +4 -3
  452. package/lib/typescript/api/commands/presentation.d.ts.map +1 -1
  453. package/lib/typescript/api/events/navigationEvents.d.ts +3 -3
  454. package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -1
  455. package/lib/typescript/api/hooks/useNavigation.d.ts +1 -1
  456. package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -1
  457. package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts +4 -3
  458. package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -1
  459. package/lib/typescript/api/index.d.ts +1 -1
  460. package/lib/typescript/api/index.d.ts.map +1 -1
  461. package/lib/typescript/api/linking/dispatchedLinks.d.ts +7 -0
  462. package/lib/typescript/api/linking/dispatchedLinks.d.ts.map +1 -0
  463. package/lib/typescript/api/linking/linking.d.ts +8 -0
  464. package/lib/typescript/api/linking/linking.d.ts.map +1 -1
  465. package/lib/typescript/api/navigation.d.ts +4 -1
  466. package/lib/typescript/api/navigation.d.ts.map +1 -1
  467. package/lib/typescript/api/options/OptionsChain.d.ts +2 -2
  468. package/lib/typescript/api/screens/arrangement.d.ts +12 -2
  469. package/lib/typescript/api/screens/arrangement.d.ts.map +1 -1
  470. package/lib/typescript/api/screens/defineScreen.d.ts +23 -4
  471. package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -1
  472. package/lib/typescript/api/screens/nativeScreens.d.ts +8 -1
  473. package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -1
  474. package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -1
  475. package/lib/typescript/api/theme/theme.d.ts +2 -0
  476. package/lib/typescript/api/theme/theme.d.ts.map +1 -1
  477. package/lib/typescript/engine/commands.d.ts +5 -0
  478. package/lib/typescript/engine/commands.d.ts.map +1 -1
  479. package/lib/typescript/engine/layout.d.ts.map +1 -1
  480. package/lib/typescript/engine/nativeScreens.d.ts +5 -0
  481. package/lib/typescript/engine/nativeScreens.d.ts.map +1 -1
  482. package/lib/typescript/engine/options.d.ts +5 -2
  483. package/lib/typescript/engine/options.d.ts.map +1 -1
  484. package/lib/typescript/engine/optionsChange.d.ts +28 -0
  485. package/lib/typescript/engine/optionsChange.d.ts.map +1 -0
  486. package/lib/typescript/engine/places.d.ts +7 -2
  487. package/lib/typescript/engine/places.d.ts.map +1 -1
  488. package/lib/typescript/engine/props.d.ts +8 -1
  489. package/lib/typescript/engine/props.d.ts.map +1 -1
  490. package/lib/typescript/engine/refresh.d.ts +35 -0
  491. package/lib/typescript/engine/refresh.d.ts.map +1 -0
  492. package/lib/typescript/engine/rememberedOptions.d.ts +13 -0
  493. package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -1
  494. package/lib/typescript/engine/screens.d.ts +27 -6
  495. package/lib/typescript/engine/screens.d.ts.map +1 -1
  496. package/lib/typescript/interfaces/ComponentEvents.d.ts +4 -4
  497. package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -1
  498. package/lib/typescript/interfaces/Events.d.ts +28 -10
  499. package/lib/typescript/interfaces/Events.d.ts.map +1 -1
  500. package/lib/typescript/interfaces/Options.d.ts +1 -1
  501. package/lib/typescript/interfaces/Options.d.ts.map +1 -1
  502. package/lib/typescript/interfaces/options/animations.d.ts +80 -22
  503. package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
  504. package/lib/typescript/interfaces/options/bottomTabs.d.ts +21 -7
  505. package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -1
  506. package/lib/typescript/interfaces/options/buttons.d.ts +23 -15
  507. package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -1
  508. package/lib/typescript/interfaces/options/modals.d.ts +34 -26
  509. package/lib/typescript/interfaces/options/modals.d.ts.map +1 -1
  510. package/lib/typescript/interfaces/options/sideMenu.d.ts +23 -6
  511. package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -1
  512. package/lib/typescript/interfaces/options/stack.d.ts +17 -3
  513. package/lib/typescript/interfaces/options/stack.d.ts.map +1 -1
  514. package/lib/typescript/interfaces/options/system.d.ts +18 -11
  515. package/lib/typescript/interfaces/options/system.d.ts.map +1 -1
  516. package/lib/typescript/interfaces/options/toolbar.d.ts +2 -2
  517. package/lib/typescript/interfaces/options/topBar.d.ts +68 -38
  518. package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -1
  519. package/metro/acceptPlugin.js +57 -0
  520. package/metro/babelTransformer.js +45 -0
  521. package/metro/index.js +36 -0
  522. package/package.json +3 -1
  523. package/src/ARCHITECTURE.md +40 -27
  524. package/src/adapters/NativeANNTurboModule.ts +12 -2
  525. package/src/api/app/AppRegistry.ts +16 -2
  526. package/src/api/app/createNavigation.ts +203 -69
  527. package/src/api/commands/commands.ts +48 -7
  528. package/src/api/commands/presentation.ts +4 -3
  529. package/src/api/events/navigationEvents.ts +10 -4
  530. package/src/api/hooks/useNavigation.ts +9 -4
  531. package/src/api/hooks/useSafeAreaInsets.ts +4 -3
  532. package/src/api/index.ts +1 -0
  533. package/src/api/linking/dispatchedLinks.ts +18 -0
  534. package/src/api/linking/linking.ts +22 -1
  535. package/src/api/navigation.ts +4 -1
  536. package/src/api/options/OptionsChain.ts +2 -2
  537. package/src/api/screens/arrangement.ts +17 -4
  538. package/src/api/screens/defineScreen.ts +49 -5
  539. package/src/api/screens/nativeScreens.ts +40 -4
  540. package/src/api/screens/registerScreens.tsx +185 -42
  541. package/src/api/theme/theme.ts +5 -0
  542. package/src/engine/commands.ts +70 -13
  543. package/src/engine/layout.ts +27 -11
  544. package/src/engine/nativeScreens.ts +10 -1
  545. package/src/engine/options.ts +45 -19
  546. package/src/engine/optionsChange.ts +107 -0
  547. package/src/engine/places.ts +65 -7
  548. package/src/engine/props.ts +30 -1
  549. package/src/engine/refresh.ts +97 -0
  550. package/src/engine/rememberedOptions.ts +74 -1
  551. package/src/engine/screens.tsx +76 -21
  552. package/src/interfaces/ComponentEvents.ts +4 -4
  553. package/src/interfaces/Events.ts +29 -10
  554. package/src/interfaces/Options.ts +1 -0
  555. package/src/interfaces/contract/commands.json +101 -0
  556. package/src/interfaces/contract/errors.json +275 -0
  557. package/src/interfaces/options/animations.ts +81 -22
  558. package/src/interfaces/options/bottomTabs.ts +21 -7
  559. package/src/interfaces/options/buttons.ts +23 -15
  560. package/src/interfaces/options/modals.ts +34 -26
  561. package/src/interfaces/options/sideMenu.ts +24 -6
  562. package/src/interfaces/options/stack.ts +17 -3
  563. package/src/interfaces/options/system.ts +18 -11
  564. package/src/interfaces/options/toolbar.ts +2 -2
  565. package/src/interfaces/options/topBar.ts +68 -38
  566. package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +0 -41
  567. package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +0 -69
  568. package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +0 -62
  569. package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +0 -62
  570. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +0 -223
  571. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +0 -31
  572. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +0 -138
  573. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +0 -88
  574. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +0 -33
  575. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +0 -66
  576. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +0 -179
  577. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +0 -139
  578. package/ios/Layouts/Screen/ANNScreenInsets.h +0 -30
  579. package/ios/Layouts/Screen/ANNScreenInsets.mm +0 -68
  580. package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +0 -27
  581. package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +0 -55
@@ -254,13 +254,16 @@ export type ElementAnimation = AppearingElementAnimation | DisappearingElementAn
254
254
  /**
255
255
  * An animation of one view of a screen that moves together with the transition, with or without a counterpart on the
256
256
  * other screen. The view is found by its `nativeID`, first on the screen that goes, then on the one that comes; one
257
- * that is not found is skipped while the rest plays. The transition waits until it is found. Without an animation of
258
- * the screens of its own, the screen that comes fades in (or the one that goes fades out) in 300 ms around the
259
- * elements. When the transition ends or is cancelled, the element gets its own values back. `x` and `y` are the
260
- * position in the parent of the element on both platforms. As on a side of a screen, don't set `x` with `translationX`
261
- * or `y` with `translationY` on one element: the translation plays and the position doesn't. (Android) A view whose
262
- * parent is a React view with `removeClippedSubviews` turned on, such as a child of a clipping list, is not moved: it
263
- * counts as not found.
257
+ * that is not found is skipped while the rest plays. The transition waits until it is found. An element that fails on
258
+ * the way (an error in its animation) is skipped too, with a warning in the log: it shows and hides with its screen,
259
+ * and the transition and its command go on. Without an animation of the screens of its own, the screen that comes fades
260
+ * in (or the one that goes fades out) in 300 ms around the elements. When the transition ends or is cancelled, the
261
+ * element gets its own values back. The element's own `transform` counts: a property that doesn't animate keeps the
262
+ * element's value, and a missing end is that value (a turn read from −180° to 180°, as React Native draws it). `x`
263
+ * and `y` are the position in the parent of the element on both platforms. As on a side of a screen, don't set `x`
264
+ * with `translationX` or `y` with `translationY` on one element: the translation plays and the position doesn't.
265
+ * The element plays where it is, in its screen: it moves with its screen, its parents clip it, and the views drawn
266
+ * after it in its screen stay over it.
264
267
  */
265
268
  export interface ElementTransition {
266
269
  /** The `nativeID` of the view to animate. */
@@ -288,12 +291,23 @@ export interface ElementTransition {
288
291
  }
289
292
 
290
293
  /**
291
- * A view that flies from the screen that goes to the screen that comes, changing its place, size, corners and look
292
- * on the way. A pair whose view is not found on either screen is skipped while the rest plays, and the transition
293
- * waits until the views are found. Without an animation of the screens of its own, the screen that comes fades in (or
294
- * the one that goes fades out) in 300 ms around the pair. Text keeps its proportions and changes its picture within a
295
- * quarter of the flight. (Android) A picture that doesn't load within a second drops out of the transition, and so does
296
- * a pair with a view whose parent is a React view with `removeClippedSubviews` turned on: it counts as not found.
294
+ * A view that flies from the screen that goes to the screen that comes, changing its place, size, corners and look on
295
+ * the way. A pair whose view is not found on either screen is skipped while the rest plays, and the transition waits
296
+ * until the views are found. A pair that fails on the way (an error in its start or its flight) is skipped too, with a
297
+ * warning in the log: its views show and hide with their screens, and the transition and its command go on. So is a
298
+ * pair with a view without a size, or one whose picture can't be taken. Without an animation of the screens of its
299
+ * own, the screen that comes fades in (or the one that goes fades out) in 300 ms around the pair. What flies is a copy:
300
+ * pictures of the two views taken as the transition starts, while the views stay hidden in their places; what changes
301
+ * in them meanwhile shows when they are back. A view its parents cut (`overflow: hidden`, a scroll view, the edge of
302
+ * its screen) shows only the part they leave visible, and that part goes to the one of the other view on the way.
303
+ * Text keeps its proportions, flies whole and changes its picture within a quarter of the flight. A view turned or
304
+ * scaled by its own `transform` or by a parent's flies from where it shows, and its angle goes to the other view's
305
+ * along the shorter arc. The angle is the one React Native draws, from −180° to 180°:
306
+ * `rotate: '270deg'` turns back a quarter, and no pair spins a full turn. (Android) An image without a background or a
307
+ * border flies as the image of the view that comes, from the part and place the fit (`resizeMode`) shows in one view
308
+ * to those in the other, and an animated image plays on; images of other proportions fly as pictures. An image that
309
+ * doesn't load within a second drops out of the transition. A skew and a tilt (`skewX`, `rotateX`, …) don't fly: the
310
+ * view flies without them and has them again at the end.
297
311
  */
298
312
  export interface SharedElementTransition {
299
313
  /** The `nativeID` of the view on the screen that goes. */
@@ -350,22 +364,28 @@ export interface StackAnimationOptions {
350
364
  enabled?: boolean;
351
365
  /**
352
366
  * Whether to wait for the new top screen to be drawn before the transition. Without it, the transition waits for the
353
- * content of a screen with an animation of its own for half a second at most, `true` waits as long as it takes,
354
- * `false` starts at once, also with an animation of its own.
367
+ * first mount of the new top's content, half a second at most, with the platform's transition as with an animation
368
+ * of its own; on a push the options the screen sets as it renders for the first time (`useScreenOptions`, such as
369
+ * its title) are in its bar from the first frame. `true` waits as long as it takes, `false` starts at once, the
370
+ * content drawing as it comes ((Android) a push with `appProvider` still renders the screen first). (iOS) The
371
+ * components of the bar are waited for too, each to its own limit.
355
372
  */
356
373
  waitForRender?: boolean;
357
374
  /**
358
375
  * The animation of the screens: `enter` for the screen that comes (on a pop, the one that was below), `exit` for the
359
376
  * one that goes. A property with a `from` or a `to` makes it an animation of its own, which replaces the platform's
360
- * transition; the side left out stays still. (Android) With one of its own, the title and buttons of the bar and the
361
- * tab bar don't travel with the screens. (Android) When the transition has elements, a push plays only `enter` and a
377
+ * transition; the side left out stays still. With one of its own, (Android) the top bar goes with its screen: the
378
+ * bar of the screen that goes leaves with it, and the bar of the screen that comes moves, scales and fades with it;
379
+ * (iOS) UIKit keeps the bar in place and changes its title and buttons at once. (Android) The tab bar doesn't travel
380
+ * with the screens. (Android) When the transition has elements, a push plays only `enter` and a
362
381
  * pop only `exit`, and only when that side is a single `alpha`; any other side is not played, and the screen fades in
363
382
  * or out in 300 ms around the elements instead. iOS plays the sides as they are set.
364
383
  */
365
384
  content?: EnterExitAnimationOptions;
366
385
  /**
367
386
  * (Android) The animation of the top bar when it shows or hides because the screens differ in `topBar.visible`.
368
- * Without it, the bar slides up by its height and back in 300 ms. iOS animates the bar with UIKit.
387
+ * Without it, the bar slides up by its height and back in 300 ms; with a `content` of its own it shows or hides
388
+ * with its screen. iOS animates the bar with UIKit.
369
389
  */
370
390
  topBar?: EnterExitAnimationOptions<TopBarAnimationOptions>;
371
391
  /**
@@ -395,6 +415,33 @@ export interface StackPushAnimationOptions extends StackAnimationOptions {
395
415
  zoom?: ZoomTransitionOptions;
396
416
  }
397
417
 
418
+ /**
419
+ * The animation of a pop, read from the screen that goes. As {@link StackAnimationOptions}, with the swipe back of iOS
420
+ * and the preview of the back gesture on Android.
421
+ */
422
+ export interface StackPopAnimationOptions extends StackAnimationOptions {
423
+ /**
424
+ * (iOS) Whether the swipe back plays this pop under the finger. Without it, the swipe back plays UIKit's slide, and
425
+ * the pop's own animation plays only for the back button and `pop`. With `true`, the swipe from the edge plays the
426
+ * pop's own animation as far as the finger has gone across the screen: the user can stop halfway, and letting go
427
+ * finishes the pop or puts the screen back, the rest playing faster after a quick flick. It applies only when the pop
428
+ * has an animation of its own (`content`, `elementTransitions`, `sharedElementTransitions`). The top bar shows the
429
+ * screen under from the start of the swipe, as UIKit does in a transition of its own, and comes back when the swipe
430
+ * is given up. On iOS 26 the swipe from the content stays off for a screen with an own pop.
431
+ * Android ignores it: a pop with an animation of its own plays when the back gesture ends.
432
+ * @default false
433
+ */
434
+ interactive?: boolean;
435
+ /**
436
+ * (Android 14+) Whether the back gesture on a pushed screen previews its pop as the user swipes: the screen shrinks
437
+ * and follows the finger, the screen under it shows behind. `false` pops the screen when the gesture is released,
438
+ * as on Android 13 and older; back still pops it. iOS ignores it: its swipe back is UIKit's, or the pop's own
439
+ * animation with `interactive`.
440
+ * @default true
441
+ */
442
+ preview?: boolean;
443
+ }
444
+
398
445
  /**
399
446
  * The animation of `setStackRoot`, read from the new top screen. As {@link StackAnimationOptions}: without an animation
400
447
  * of its own, iOS plays the push animation of the new top screen or UIKit's transition, and Android plays a fade
@@ -416,8 +463,10 @@ export interface SetStackRootAnimationOptions extends StackAnimationOptions {
416
463
  * screen under it. The screen under a modal takes part (iOS) only under a modal that covers the full screen.
417
464
  *
418
465
  * A sheet keeps the system's sheet motion on both platforms: (iOS) a modal shown as `'pageSheet'`, `'formSheet'` or
419
- * without a style, (Android) a Material bottom sheet. The sides `enter` and `exit` and the lists of elements set here
420
- * don't apply to it.
466
+ * without a style, (Android) the Material bottom sheet of `'pageSheet'`, `'formSheet'`, `'popover'`, or of
467
+ * `modal.sheet` without a style. The sides `enter` and `exit` and the lists of elements set here don't apply to it.
468
+ * Without them a modal over the whole screen comes up from the bottom: on iOS by UIKit's `modalTransitionStyle`, on
469
+ * Android with the system's motion of a window over another, 300 ms up and 250 ms down, without a fade.
421
470
  *
422
471
  * (Android) When the modal has elements, `enter` of a show and `exit` of a dismiss play only when that side is a single
423
472
  * `alpha`; any other side is not played, and the modal fades in or out in 300 ms around the elements instead.
@@ -443,6 +492,12 @@ export interface ModalAnimationOptions extends EnterExitAnimationOptions {
443
492
  * options of the command. A change by `mergeOptions` is for the next command and animates nothing itself. A theme
444
493
  * switch or a rotation does not change an animation. Without a key, the transition is the platform's own.
445
494
  *
495
+ * The system's setting to reduce motion is respected, with no option to turn that off. (iOS) With Reduce Motion on, a
496
+ * transition of these keys is a fade of the same length: the screen that comes fades in (a push, `setStackRoot`, a
497
+ * modal's show, `setRoot`), the screen that goes fades out (a pop, a dismissal); no element moves. (Android) With
498
+ * Remove animations on (or the animator duration scale at 0), the transitions end at once, no element moves and none
499
+ * is waited for, a side menu opens and closes without its slide, and a sheet shows and closes without it.
500
+ *
446
501
  * ```ts
447
502
  * const options: Options = {
448
503
  * animations: {
@@ -456,8 +511,12 @@ export interface ModalAnimationOptions extends EnterExitAnimationOptions {
456
511
  export interface AnimationOptions {
457
512
  /** The push of a screen, read from the screen that comes. */
458
513
  push?: StackPushAnimationOptions;
459
- /** The pop of a screen, also `popTo` and `popToRoot`, read from the screen that goes. A swipe back is always the system's. */
460
- pop?: StackAnimationOptions;
514
+ /**
515
+ * The pop of a screen, also `popTo` and `popToRoot`, read from the screen that goes. The swipe back of iOS is
516
+ * UIKit's, or the pop's own animation under the finger (`interactive`); the back gesture of Android previews the pop
517
+ * (`preview`).
518
+ */
519
+ pop?: StackPopAnimationOptions;
461
520
  /** The replacing of the screens of a stack, read from the new top screen. */
462
521
  setStackRoot?: SetStackRootAnimationOptions;
463
522
  /**
@@ -73,8 +73,10 @@ export interface OptionsBottomTabsAccessoryComponent {
73
73
  /**
74
74
  * (iOS 26+) The accessory above the tab bar, like the mini player of a music app. The system sizes it (48 points high)
75
75
  * and the component fills that size. It is placed above the bar, or beside the bar when the bar is minimized; on an
76
- * iPad with the bar at the top it sits at the bottom over the full width, always above the bar. The accessory stops
77
- * together with the tabs. Android has no accessory.
76
+ * iPad with the bar at the top it sits at the bottom over the full width, always above the bar. A hidden accessory
77
+ * (`visible: false`, or no name) keeps its React root and its state, and shows again with them. When another accessory
78
+ * (another `componentId`) shows, the replaced one stops once it has left the window and its state is gone. The last
79
+ * accessory stops together with the tabs. Android has no accessory.
78
80
  */
79
81
  export interface OptionsBottomTabsAccessory {
80
82
  /**
@@ -155,6 +157,16 @@ export interface OptionsBottomTabs {
155
157
  * @default true
156
158
  */
157
159
  animate?: boolean;
160
+ /**
161
+ * How the content changes when another tab is selected on screen, by a press, by back or from code. `'platform'`
162
+ * does what the platform does: on Android the tab that goes fades out and the new one fades in and grows (Material's
163
+ * fade through, 300 ms), on iOS the content changes at once. `'none'` changes it at once on both platforms. The
164
+ * appear events of a switch and `ANN.BottomTabSelected` come at its end, so with `'none'` right away. The tab that is
165
+ * selected decides: the value of the screen it shows, over its own, the tabs' and the default options. A
166
+ * `mergeOptions` applies from the next switch. Off screen the content always changes at once.
167
+ * @default 'platform'
168
+ */
169
+ switchAnimation?: 'platform' | 'none';
158
170
  /**
159
171
  * The tab to select, as an index from 0. It selects once, when the options arrive, at creation (the first tab to
160
172
  * show) or in `mergeOptions`; it is not kept. An index out of range selects nothing (or the first tab at creation)
@@ -187,9 +199,10 @@ export interface OptionsBottomTabs {
187
199
  */
188
200
  drawBehind?: boolean;
189
201
  /**
190
- * The background color of the bar; `null` gives the default one. On Android the default is the surface color of the
191
- * Material 3 theme. Before iOS 26 (and with `UIDesignRequiresCompatibility`) the bar is opaque with the color, or
192
- * system opaque without it, and a transparent color makes it transparent. On iOS 26 with glass the color is ignored
202
+ * The background color of the bar; `null` gives the default one. On Android the default is the surface container color
203
+ * (`colorSurfaceContainer`) of the Material 3 theme. Before iOS 26, and in the compatibility mode (`UIDesignRequiresCompatibility` in Info.plist: iOS 26, and iOS 27
204
+ * only for an app built with an SDK before iOS 27), the bar is opaque with the color, or system opaque without it,
205
+ * and a transparent color makes it transparent. On iOS 26 and later with glass the color is ignored
193
206
  * with one warning, since the system has no color for glass, while a transparent color gives a transparent bar. The
194
207
  * theme color `bar` is its default option.
195
208
  */
@@ -198,7 +211,8 @@ export interface OptionsBottomTabs {
198
211
  * When the screens of the tabs are created: `'together'` creates and draws every tab at the start, and the tabs are
199
212
  * ready when all of them are; `'afterInitialTab'` creates the selected tab first and the others right after it;
200
213
  * `'onSwitchToTab'` creates a tab the first time it is selected. The screens of tabs not yet selected get no appear
201
- * events in any mode. It applies when the tabs are created; `mergeOptions` does not change it.
214
+ * events in any mode. On iOS a text input's `autoFocus` in a tab drawn before it is selected does nothing: focus it in
215
+ * `useScreenAppear`. It applies when the tabs are created; `mergeOptions` does not change it.
202
216
  * @default 'together'
203
217
  */
204
218
  tabsAttachMode?: 'together' | 'afterInitialTab' | 'onSwitchToTab';
@@ -396,7 +410,7 @@ export interface OptionsBottomTab {
396
410
  selectedFontSize?: number;
397
411
  /**
398
412
  * (iOS) The insets of the icon. Each side is independent. They apply before iOS 26 only; iOS 26 and the compatibility
399
- * mode ignore them, and so does a system role before iOS 18.
413
+ * mode (see `backgroundColor`) ignore them, and so does a system role before iOS 18.
400
414
  */
401
415
  iconInsets?: IconInsets;
402
416
  /**
@@ -60,7 +60,7 @@ export interface IconInsets {
60
60
  * a color the other fields are ignored.
61
61
  *
62
62
  * On iOS the icon is drawn onto the shape and the button becomes a button of its own (the back button keeps its
63
- * history menu), without the glass capsule on iOS 26 by default. On Android the icon sits on the shape, mirrored in a
63
+ * history menu), without the glass capsule (glass design, iOS 26+) by default. On Android the icon sits on the shape, mirrored in a
64
64
  * right-to-left layout. Layers merge differently: on iOS an object merges field by field like any other, on Android
65
65
  * an `iconBackground` that has a `color` replaces the earlier one as a whole.
66
66
  */
@@ -138,8 +138,10 @@ export type OptionsTopBarButtonMenuElement =
138
138
  /**
139
139
  * A menu of the top bar: the menu of a button, the overflow menu, the menu of the title. A list of `items` sent with
140
140
  * `mergeOptions` replaces the earlier list as a whole, and `items: []` removes the menu; `title` and
141
- * `singleSelection` merge field by field (iOS). What the user picks in a `singleSelection` menu is written back into
142
- * the options of the screen and survives the screen showing again.
141
+ * `singleSelection` merge field by field (iOS). What the user picks in a `singleSelection` menu stays with the screen,
142
+ * through it showing again, a `mergeOptions` that sends the same items again and `setDefaultOptions`; a `mergeOptions`
143
+ * into the screen that changes the checks of that menu's level, or takes the item away, replaces it. A merge into the
144
+ * stack or the tabs around the screen doesn't.
143
145
  */
144
146
  export interface OptionsTopBarButtonMenu {
145
147
  /** The title above the items. (iOS) Android doesn't show it. */
@@ -157,7 +159,7 @@ export interface OptionsTopBarButtonMenu {
157
159
  * A button of the top bar (`leftButtons`, `rightButtons`, `centerButtons`) or of the toolbar (`toolbar.buttons`). The
158
160
  * kinds are picked by the fields that are set. On iOS, the first that fits wins: a `component`, then an icon with text
159
161
  * and `showText`, then an icon with `iconBackground` or `iconInsets`, then an SF Symbol, an image `icon`, a `text`,
160
- * a `systemItem`; a button with none of them is not shown. On Android a button is a menu item of the bar: text, icon
162
+ * a `systemItem`; a button with none of them is not shown. On Android a button is a button of the bar's row: text, icon
161
163
  * or a component. Lists of buttons are replaced as a whole and take nothing from the lists of lower layers.
162
164
  *
163
165
  * Text, icon, color and similar fields are the same in all four places; where a place or a side differs, the field
@@ -187,7 +189,7 @@ export interface OptionsTopBarButton {
187
189
  */
188
190
  icon?: ImageResource;
189
191
  /**
190
- * (iOS) The space around the image of `icon`; the button becomes a button of its own, without a capsule on iOS 26.
192
+ * (iOS) The space around the image of `icon`; the button becomes a button of its own, without a capsule with the glass design (iOS 26+, see `UIDesignRequiresCompatibility`).
191
193
  */
192
194
  iconInsets?: IconInsets;
193
195
  /**
@@ -202,7 +204,7 @@ export interface OptionsTopBarButton {
202
204
  systemItem?: SystemItemIcon;
203
205
  /**
204
206
  * The text of the button. A button with an icon keeps it as a label for the overflow menu, the customization panel
205
- * and VoiceOver (iOS) or as the text of the menu item (Android, where it also shows when there is room).
207
+ * and VoiceOver (iOS), or for TalkBack, the tooltip of a long press and the overflow menu (Android).
206
208
  */
207
209
  text?: string;
208
210
  /** The text a screen reader says for the button. */
@@ -236,14 +238,14 @@ export interface OptionsTopBarButton {
236
238
  disabledColor?: Color;
237
239
  /**
238
240
  * A shape behind the icon. It works with an `icon` image and a `color` of the shape; on iOS the button becomes a
239
- * button of its own without menu, toggle or style, and without a capsule on iOS 26 by default. The color of a whole
241
+ * button of its own without menu, toggle or style, and without a capsule with the glass design by default. The color of a whole
240
242
  * side is `leftButtonBackgroundColor` / `rightButtonBackgroundColor`.
241
243
  */
242
244
  iconBackground?: IconBackgroundOptions;
243
245
  /**
244
- * (iOS) `'plain'` or `'prominent'`, the main action of the bar (Done, Send). On iOS 26 a prominent button is a
246
+ * (iOS) `'plain'` or `'prominent'`, the main action of the bar (Done, Send). With the glass design (iOS 26+, see `UIDesignRequiresCompatibility`) a prominent button is a
245
247
  * capsule in the button's tint with bold text or icon on it (the tint is `color`, the bar's tint without it);
246
- * before iOS 26 it is the system's done style with bold text. Not for component buttons, buttons with
248
+ * without it, it is the system's done style with bold text. Not for component buttons, buttons with
247
249
  * `iconBackground`, and `showText` buttons.
248
250
  * @default 'plain'
249
251
  */
@@ -255,7 +257,7 @@ export interface OptionsTopBarButton {
255
257
  */
256
258
  testID?: string;
257
259
  /**
258
- * (iOS 26+) Whether the button has no glass capsule under it; neighbors keep theirs. By default `true` for
260
+ * (iOS 26+, glass design) Whether the button has no glass capsule under it; neighbors keep theirs. By default `true` for
259
261
  * component buttons and for icon buttons with a background or insets, `false` for the rest. In a `group` of several
260
262
  * buttons the capsule is shared and this has no effect. A change by `mergeOptions` builds the buttons anew.
261
263
  */
@@ -268,8 +270,8 @@ export interface OptionsTopBarButton {
268
270
  */
269
271
  showText?: boolean;
270
272
  /**
271
- * (iOS 26+) Buttons next to each other with the same group share one capsule; a button without a group has its
272
- * own. Before iOS 26 it does nothing, on iOS 15 there are no groups. A side that has a group of several buttons
273
+ * (iOS 26+, glass design) Buttons next to each other with the same group share one capsule; a button without a group has its
274
+ * own. Without the glass design it does nothing, on iOS 15 there are no groups. A side that has a group of several buttons
273
275
  * doesn't animate button changes. The toolbar has no groups: only icons share a capsule there. For center buttons
274
276
  * the group is a section of the overflow menu, and its name is the id the customization is saved under.
275
277
  */
@@ -285,8 +287,10 @@ export interface OptionsTopBarButton {
285
287
  badgeTextColor?: Color;
286
288
  /**
287
289
  * (iOS) Whether the button is a toggle: every press flips `selected` and sends a press with the new state. The state
288
- * is written into the options of the screen under the button's id, so it survives the screen showing again, and a
289
- * button set again without `selected` takes the state of the button with the same id. Not for component buttons,
290
+ * stays with the screen under the button's id, through it showing again, a `mergeOptions` that sends the same
291
+ * buttons again and `setDefaultOptions`; a `mergeOptions` into the screen that changes `selected` replaces it (a merge
292
+ * into the stack around it doesn't). A button set again
293
+ * without `selected` takes the state of the button with the same id. Not for component buttons,
290
294
  * buttons with `iconBackground`, and `showText` buttons.
291
295
  */
292
296
  toggle?: boolean;
@@ -351,7 +355,11 @@ export interface OptionsTopBarButton {
351
355
  * replaces it.
352
356
  */
353
357
  export interface OptionsTopBarButtonComponent {
354
- /** The id of the component. Without it, the library gives one. The same `name` and `id` mean the same component. */
358
+ /**
359
+ * The id of the component. Without it, the library gives one made of the screen, the component's place in the
360
+ * options and its `name`: it stays the same for every `mergeOptions` of the screen, so the mounted component stays
361
+ * and only its props change. The same `name` and `id` mean the same component.
362
+ */
355
363
  id?: string;
356
364
  /** The name of the registered component. */
357
365
  name: string;
@@ -3,21 +3,25 @@
3
3
  * `'overCurrentContext'`, `'currentContext'` or `'popover'`. It is read once, when the modal shows, from the modal's
4
4
  * final options; `mergeOptions` afterwards doesn't change it, and neither does a change of theme or a rotation. Without
5
5
  * it the platform decides: on iOS the automatic style of UIKit (a sheet on iPhone, a card on iPad), on Android the
6
- * whole screen. An unknown string shows a full-screen modal on iOS and counts as not set on Android.
6
+ * whole screen, or the Material bottom sheet when `modal.sheet` is set. An unknown string shows a full-screen modal on
7
+ * iOS and counts as not set on Android.
7
8
  *
8
- * - `'pageSheet'`: (iOS) a sheet that leaves the screen below visible and pushed back; on iPad a wide card. Android
9
- * shows the whole screen, or the Material bottom sheet when `modal.sheet` is set.
10
- * - `'formSheet'`: (iOS) a sheet on iPhone, a card in the middle on iPad whose size is `modal.contentSize`. Android
11
- * shows the whole screen, or the bottom sheet when `modal.sheet` is set.
12
- * - `'fullScreen'`, `'currentContext'`: the whole screen; the screen below is taken off. Both platforms treat the two
13
- * alike.
14
- * - `'overFullScreen'`, `'overCurrentContext'`: the whole screen with the screen below kept in place. It shows
15
- * through only where the modal screen is transparent (`layout.backgroundColor` and `layout.componentBackgroundColor`
16
- * both `'transparent'`); the style does not make anything transparent by itself.
9
+ * - `'pageSheet'`: a sheet that leaves the screen below visible. On iOS the screen below is pushed back, and on iPad
10
+ * the sheet is a wide card. On Android it is the Material modal bottom sheet over a dimmed screen, at the full height
11
+ * under the status bar (`modal.sheet` changes its stops), at most 640 dp wide and in the middle of a wider window.
12
+ * - `'formSheet'`: on iOS a sheet on iPhone, a card in the middle on iPad whose size is `modal.contentSize`. On Android
13
+ * the same bottom sheet as `'pageSheet'`; `modal.contentSize` does nothing there.
14
+ * - `'fullScreen'`, `'currentContext'`: the whole screen; the screen below is taken off once the modal has come in.
15
+ * Both platforms treat the two alike. The modal comes up from the bottom: on Android with the system's motion of a
16
+ * window over another (300 ms up, 250 ms down), without a fade.
17
+ * - `'overFullScreen'`, `'overCurrentContext'`: the same, with the screen below kept in place under the modal. It
18
+ * shows through only where the modal screen is transparent (`layout.backgroundColor` and
19
+ * `layout.componentBackgroundColor` both `'transparent'`); the style does not make anything transparent by itself.
17
20
  * - `'popover'`: (iOS) a popover with an arrow on iPad, a sheet on iPhone unless `modal.popover.adaptive` is `false`.
18
- * Android has no popovers and shows the whole screen.
21
+ * Android has no popovers and shows the bottom sheet of `'pageSheet'`.
19
22
  *
20
- * The options of the sheet (`modal.sheet`) apply with `'pageSheet'`, `'formSheet'` and without a style.
23
+ * The options of the sheet (`modal.sheet`) apply with `'pageSheet'`, `'formSheet'` and without a style, and on
24
+ * Android with `'popover'` too.
21
25
  */
22
26
  export type OptionsModalPresentationStyle =
23
27
  | 'pageSheet'
@@ -32,9 +36,11 @@ export type OptionsModalPresentationStyle =
32
36
  * (iOS) The system transition a modal comes and goes with: `'coverVertical'` (from below), `'crossDissolve'` (a fade),
33
37
  * `'flipHorizontal'` (a flip) or `'partialCurl'`. It is read when the modal shows and doesn't change afterwards;
34
38
  * `animations.showModal` with values of its own, and the zoom of iOS 18, go over it. UIKit flips only a modal over the
35
- * whole screen (`'fullScreen'`, `'overFullScreen'`): a sheet comes in as usual and flips only on its way out, and
36
- * `'partialCurl'` is accepted by UIKit only for a full-screen modal. An unknown string means `'coverVertical'`. Android
37
- * doesn't read it.
39
+ * whole screen (`'fullScreen'`, `'overFullScreen'`): a sheet comes in as usual and flips only on its way out. UIKit
40
+ * curls only a `'fullScreen'` modal over a screen that fills the window, so `'partialCurl'` with any other
41
+ * `modalPresentationStyle` (or without one), or over a modal that doesn't fill the screen, shows as `'coverVertical'`.
42
+ * A modal shown with `'partialCurl'` can't show another modal over it: that `showModal` rejects. An unknown string
43
+ * means `'coverVertical'`. Android doesn't read it.
38
44
  */
39
45
  export type OptionsModalTransitionStyle =
40
46
  'coverVertical' | 'crossDissolve' | 'flipHorizontal' | 'partialCurl';
@@ -45,32 +51,34 @@ export type OptionsModalTransitionStyle =
45
51
  *
46
52
  * On iOS `'medium'` and `'large'` are the system stops; a number and `'content'` need iOS 16 and are left out below it
47
53
  * with a warning in the log. On Android `'medium'` is half of the window, `'large'` the full height under the status
48
- * bar, a number is capped at `'large'`, and `'content'` stands in as `'medium'` because the Material sheet has no
49
- * height by content.
54
+ * bar, a number is capped at `'large'`, and `'content'` is the height of the content, measured as on iOS.
50
55
  */
51
56
  export type OptionsModalSheetDetent = 'medium' | 'large' | 'content' | number;
52
57
 
53
58
  /**
54
59
  * The settings of a sheet: a modal that comes from below and rests on one of several heights, its stops (detents). On
55
60
  * iOS they configure the system sheet of a modal presented as `'pageSheet'`, `'formSheet'` or without a style. On
56
- * Android any one of them turns the modal into a Material bottom sheet, again for those styles only. They are read when
61
+ * Android they configure the Material bottom sheet of `'pageSheet'`, `'formSheet'` and `'popover'`, and without a style
62
+ * any one of them turns the modal into that sheet. They are read when
57
63
  * the modal shows, and a `mergeOptions` on any screen of the modal changes them while it is shown, with an animation.
58
64
  * Objects merge key by key; `detents` is replaced as a whole.
59
65
  */
60
66
  export interface OptionsModalSheet {
61
67
  /**
62
- * The stops the sheet can rest on, and the user drags it between. On Android they are sorted by height and repeats
63
- * dropped; the Material sheet has three resting places at most: the lowest stop of the list, the highest, and
64
- * `'medium'` between them when the list has both `'medium'` and `'large'`. A stop without a place is dropped. On iOS
65
- * the stops are handed to UIKit in the order given, which wants them from the lowest to the highest; a list left
66
- * empty by unsupported values gives `['large']`.
68
+ * The stops the sheet can rest on, and the user drags it between, in any order: on both platforms they are sorted by
69
+ * height and repeats dropped. On iOS `'medium'` counts as half of `'large'` there, and on both `'content'` takes its
70
+ * place by the height of the content, again whenever that changes; on iOS a list left empty by unsupported values
71
+ * gives `['large']`. On Android the Material sheet has three resting places at most: the lowest stop of the list, the
72
+ * highest, and one between them, `selectedDetent` when it stands there, else the lowest of the others; the rest are
73
+ * dropped. Stops of the same height there are one.
67
74
  * @default ['large']
68
75
  */
69
76
  detents?: OptionsModalSheetDetent[];
70
77
  /**
71
- * The stop the sheet opens on; a new value in `mergeOptions` moves the sheet there with an animation, and doesn't
72
- * send `sheetDetentChanged`. A value that isn't among `detents` opens on the lowest stop on iOS and is ignored on
73
- * Android.
78
+ * The stop the sheet opens on; a `mergeOptions` that names it moves the sheet there with an animation, and doesn't
79
+ * send `sheetDetentChanged`. Nothing else moves the sheet off the stop it stands at, the one the user dragged it to
80
+ * included: a `mergeOptions` without it, a new layout or new content. A value that isn't among `detents` opens on
81
+ * the lowest stop on iOS and is ignored on Android.
74
82
  * Without it, the lowest stop.
75
83
  */
76
84
  selectedDetent?: OptionsModalSheetDetent;
@@ -18,8 +18,8 @@ export interface SideMenuSide {
18
18
  visible?: boolean;
19
19
  /**
20
20
  * Whether the opening or closing that `visible` asks for is animated. With `false` it happens at once and the
21
- * screens of the menu get the same appearance events in the same order, except that on Android a menu that opens at
22
- * once sends its screens DidAppear without WillAppear. It acts only together with `visible` in the same merge.
21
+ * screens of the menu get the same appearance events in the same order: WillAppear, then DidAppear. It acts only
22
+ * together with `visible` in the same merge.
23
23
  * @default true
24
24
  */
25
25
  animate?: boolean;
@@ -32,15 +32,16 @@ export interface SideMenuSide {
32
32
  enabled?: boolean;
33
33
  /**
34
34
  * The width of the menu, in points on iOS and dp on Android. It is capped at the width of the side menu (iOS) and at
35
- * that width less 64 dp (Android). On iOS a change applies at once, also to an open menu. On Android it applies the
36
- * next time a screen in the side menu appears, the center's or a menu's.
35
+ * that width less 64 dp (Android). A change in `mergeOptions` applies at once, also to an open menu. A width set by
36
+ * a screen of the center acts while that screen shows.
37
37
  * Without it, 280 points on iOS and the width of the side menu less 64 dp on Android (the least gap the Material
38
38
  * drawer leaves).
39
39
  */
40
40
  width?: number;
41
41
  /**
42
- * (Android) The height of the menu in dp; a menu lower than the container is pinned to the top. It is read only when
43
- * the side menu is created. Without it, the menu takes the full height under the status bar. iOS doesn't read it.
42
+ * (Android) The height of the menu in dp; a menu lower than the container is pinned to the top. A change in
43
+ * `mergeOptions` applies at once, also to an open menu. Without it, the menu takes the full height under the status
44
+ * bar. iOS doesn't read it.
44
45
  */
45
46
  height?: number;
46
47
  /**
@@ -94,6 +95,9 @@ export type SideMenuOpenGestureMode = 'bezel' | 'entireScreen';
94
95
  */
95
96
  export type SideMenuAnimationType = 'parallax' | 'slide' | 'slide-and-scale' | 'door';
96
97
 
98
+ /** When the screens of the menus of a side menu are created: see `sideMenu.menusAttachMode`. */
99
+ export type SideMenuAttachMode = 'together' | 'afterCenter' | 'onOpen';
100
+
97
101
  /**
98
102
  * The options of a side menu: a center with a menu on the left, on the right or on both sides. They are set in the
99
103
  * options of the side menu, in the options of the screens inside it (through `mergeOptions` or the screen definition)
@@ -121,6 +125,20 @@ export interface OptionsSideMenu {
121
125
  * the center moves. It does nothing in `'aboveContent'` mode. A change applies at once. Android doesn't read it.
122
126
  */
123
127
  animationType?: SideMenuAnimationType;
128
+ /**
129
+ * When the screens of the menus are created, together with their React content: `'together'` creates them with the
130
+ * center; `'afterCenter'` creates them right after the center first appears, so they don't compete with its first
131
+ * render and still show at once on the first open; `'onOpen'` creates a menu the first time it starts to open — from
132
+ * a swipe, from `visible: true` or from `visible` in the layout — and until React draws its screen the menu shows its
133
+ * background. A command to a screen of a menu not created yet works: a push into its stack and `mergeOptions` wait
134
+ * for the menu like a tab not yet selected. The screens of a menu get appear events only when it opens, in every
135
+ * mode. With `appProvider` the screens render in the app's React tree at once in every mode, and the mode delays only
136
+ * their native containers. On iOS a menu's test identifier (`<testID>.left`, `<testID>.right`) is there once the menu
137
+ * is created; on Android from the start. It applies when the side menu is created, from its own options or the default options;
138
+ * `mergeOptions` does not change it.
139
+ * @default 'together'
140
+ */
141
+ menusAttachMode?: SideMenuAttachMode;
124
142
  /**
125
143
  * The test identifier of the side menu's container (on iOS its view, on Android the drawer). The parts derive from
126
144
  * it: `<testID>.center`, `<testID>.left`, `<testID>.right`, and on iOS `<testID>.scrim` for the dimming over the
@@ -26,17 +26,31 @@ export interface HardwareBackButtonOptions {
26
26
  * @internal
27
27
  */
28
28
  dismissModalOnPress?: boolean;
29
+ /**
30
+ * (Android) Whether back on the first screen of the app, with nothing left to go back to, plays the system's
31
+ * animation of going home. The system decides it as the gesture starts, so with `false` the navigation keeps the
32
+ * back on that screen too: the gesture shows no animation, and on release the press goes to `BackHandler` listeners,
33
+ * then to the activity's own back (`invokeDefaultOnBackPressed` of the app's activity, such as `moveTaskToBack`).
34
+ * Read from the screen back acts on; set it in the default options for the whole app. iOS ignores it.
35
+ * @default true
36
+ */
37
+ systemAnimation?: boolean;
29
38
  }
30
39
 
31
40
  /**
32
41
  * (Android) A floating action button over the screen, or an entry of its menu. The button shows while its screen is
33
- * on top of the stack; without the option there is none. `mergeOptions` and the default options of the app apply, and
34
- * the colors of the theme are read again when the theme changes.
42
+ * on top of the stack; without the option there is none. It changes as a push or a pop starts and moves with its
43
+ * screen, as the tab bar does: the new screen's button comes in with it, the old one goes out with the screen it
44
+ * belongs to, and an open menu closes. With an animation of the screens' own the old button shrinks away and the new
45
+ * one grows as it starts; during the back gesture the button of the screen under the top shows with that screen.
46
+ * `mergeOptions` and the default options of the app apply, and the colors of the theme are read again when the theme
47
+ * changes.
35
48
  */
36
49
  export interface OptionsFab {
37
50
  /**
38
51
  * The identifier of the button. A press reports it, and the app finds the `onPress` of the button by it. A button
39
- * without an `id` doesn't show. The same `id` on a later show or merge updates the button; another `id` replaces it.
52
+ * without an `id` doesn't show. The same `id` on a later show or merge updates the button, which stays in place
53
+ * while the screens move; another `id` replaces it.
40
54
  * For an entry of `actions` it is the id of that entry's own press.
41
55
  */
42
56
  id: string;