@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
@@ -3,6 +3,7 @@
3
3
  #import "ANNAppDirection.h"
4
4
  #import "ANNAppearanceDispatcher.h"
5
5
  #import "ANNAssert.h"
6
+ #import "ANNBottomTabsController.h"
6
7
  #import "ANNComponentViewController.h"
7
8
  #import "ANNElementFinder.h"
8
9
  #import "ANNErrorTexts.h"
@@ -12,7 +13,9 @@
12
13
  #import "ANNSheetPresenter.h"
13
14
  #import "ANNShownScreens.h"
14
15
  #import "ANNStackAnimatingDelegate.h"
16
+ #import "ANNStackPopAnimationOptions.h"
15
17
  #import "ANNStackPresenter.h"
18
+ #import "ANNSwipePopInteraction.h"
16
19
  #import "ANNSystemUI.h"
17
20
  #import "ANNTopBarPresenter.h"
18
21
  #import "ANNTransitionAnimator.h"
@@ -54,6 +57,10 @@ static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
54
57
  return state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged;
55
58
  }
56
59
 
60
+ // How far from the leading edge of the stack's view the stack's own swipe back starts, in points: the strip the side
61
+ // menu leaves to the swipe back (`ANNSideMenuEdgeWidth`).
62
+ static const CGFloat ANNOwnSwipeEdgeWidth = 20;
63
+
57
64
  @interface ANNStackController () <ANNStackDisplay, ANNStackAnimating>
58
65
  @end
59
66
 
@@ -90,6 +97,12 @@ static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
90
97
  ANNTransitionPlan *_pendingPlan;
91
98
  ANNStackChange _pendingChange;
92
99
  __weak ANNTransitionAnimator *_runningAnimator;
100
+ // The interaction of the swipe back that plays the top's own pop, until UIKit asks for it.
101
+ __weak ANNSwipePopInteraction *_swipeInteraction;
102
+ // The stack's own swipe from the leading edge, on while the top's pop follows the finger: UIKit runs its swipe
103
+ // without asking the delegate for a transition, so that one would only slide.
104
+ UIPanGestureRecognizer *_ownSwipe;
105
+ InteractivePopGestureDelegate *_ownSwipeDelegate;
93
106
  BOOL _gateUpdateScheduled;
94
107
  // The stack is made (its helper set up): its options can be resolved.
95
108
  BOOL _madeUp;
@@ -260,6 +273,16 @@ static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
260
273
  content:YES
261
274
  barSwipe:barSwipe];
262
275
  }
276
+ if (!_ownSwipe) {
277
+ _ownSwipe = [[UIPanGestureRecognizer alloc] initWithTarget:self
278
+ action:@selector(ownSwipeBack:)];
279
+ _ownSwipe.enabled = _animatingDelegate.answersInteraction;
280
+ [self.view addGestureRecognizer:_ownSwipe];
281
+ }
282
+ _ownSwipeDelegate = [InteractivePopGestureDelegate installOn:_ownSwipe
283
+ stack:self
284
+ content:NO
285
+ barSwipe:barSwipe];
263
286
  [self updateSwipeBack];
264
287
  }
265
288
 
@@ -520,6 +543,9 @@ static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
520
543
 
521
544
  - (BOOL)isSwipingBack {
522
545
  UINavigationController *navigation = self.shownNavigationController;
546
+ if (navigation == self && ANNIsActive(_ownSwipe)) {
547
+ return YES;
548
+ }
523
549
  if (ANNIsActive(navigation.interactivePopGestureRecognizer)) {
524
550
  return YES;
525
551
  }
@@ -813,15 +839,20 @@ static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
813
839
  #pragma mark - The custom transitions
814
840
 
815
841
  // UIKit asks while it starts the change the queue asked for: the queue's plan when the operation and the arriving
816
- // entry are the plan's (the back button and the commands go through the queue, so its plan covers them); nil for
817
- // anything else — UIKit's own pops, the interactive swipe (UIKit never asks for it), a zoom alone.
842
+ // entry are the plan's (the back button and the commands go through the queue, so its plan covers them); the swipe
843
+ // back gets the top's own pop only with `animations.pop.interactive` (`swipeAnimatorFrom:to:`); nil for anything
844
+ // else — UIKit's own pops, a zoom alone.
818
845
  - (id<UIViewControllerAnimatedTransitioning>)
819
846
  animatorForOperation:(UINavigationControllerOperation)operation
820
847
  from:(UIViewController *)from
821
848
  to:(UIViewController *)to {
849
+ if ([self isSwipingBack]) {
850
+ return operation == UINavigationControllerOperationPop
851
+ ? [self swipeAnimatorFrom:from to:to]
852
+ : nil;
853
+ }
822
854
  ANNTransitionPlan *plan = _pendingPlan;
823
- if (!plan || operation == UINavigationControllerOperationNone || to != plan.toNode ||
824
- [self isSwipingBack]) {
855
+ if (!plan || operation == UINavigationControllerOperationNone || to != plan.toNode) {
825
856
  return nil;
826
857
  }
827
858
  BOOL matches = _pendingChange == ANNStackChangeReplace ||
@@ -838,16 +869,73 @@ static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
838
869
  return animator;
839
870
  }
840
871
 
872
+ // The stack's own swipe back of a top whose pop follows the finger (`animations.pop.interactive`, not
873
+ // `enabled: false`): the pop plays under it. Nil otherwise, also when UIKit won't ask for the interaction (the gate
874
+ // hasn't seen the option yet: a change of the default options) or the screen under hasn't settled
875
+ // (`revealedEntrySettled:`): UIKit asks for the transition before the queue takes the swipe and moves those, and the
876
+ // frames take the views as they are now.
877
+ - (nullable ANNTransitionAnimator *)swipeAnimatorFrom:(UIViewController *)from
878
+ to:(UIViewController *)to {
879
+ if (!ANNIsActive(_ownSwipe) || !_animatingDelegate.answersInteraction ||
880
+ ![self isOwnViewController:from] || ![self revealedEntrySettled:to]) {
881
+ return nil;
882
+ }
883
+ ANNStackPopAnimationOptions *pop = [from resolveOptionsWithDefault].animations.pop;
884
+ if (![ANNStackController popFollowsSwipe:pop]) {
885
+ return nil;
886
+ }
887
+ ANNTransitionPlan *plan = [ANNTransitionPlan stackPlanOfKind:ANNTransitionKindPop
888
+ animation:pop
889
+ waitForRender:nil
890
+ waitLimit:0
891
+ from:from
892
+ to:to];
893
+ if (!plan) {
894
+ return nil;
895
+ }
896
+ ANNTransitionAnimator *animator = [[ANNTransitionAnimator alloc] initWithPlan:plan];
897
+ // The interaction keeps itself while it follows the gesture; UIKit keeps it once it starts it.
898
+ ANNSwipePopInteraction *interaction =
899
+ [[ANNSwipePopInteraction alloc] initWithAnimator:animator recognizer:_ownSwipe view:self.view];
900
+ _swipeInteraction = interaction;
901
+ _runningAnimator = animator;
902
+ return animator;
903
+ }
904
+
905
+ // The screen under is in place for the frames: its view made, not parked, not rendering as a lower screen.
906
+ - (BOOL)revealedEntrySettled:(nullable UIViewController *)revealed {
907
+ return revealed.isViewLoaded && ![_lowerRendering objectForKey:revealed] &&
908
+ ![_lowerToRender containsObject:revealed] &&
909
+ ![[self parkedEntries] containsObject:revealed];
910
+ }
911
+
912
+ + (BOOL)popFollowsSwipe:(nullable ANNStackPopAnimationOptions *)pop {
913
+ return [ANNAnimationRules stackIsOwn:pop] && [pop.interactive withDefault:NO] &&
914
+ [pop.enabled withDefault:YES];
915
+ }
916
+
917
+ - (nullable id<UIViewControllerInteractiveTransitioning>)interactionForAnimator:
918
+ (id<UIViewControllerAnimatedTransitioning>)animator {
919
+ ANNSwipePopInteraction *interaction = _swipeInteraction;
920
+ return interaction && interaction.animator == animator ? interaction : nil;
921
+ }
922
+
841
923
  // The animating delegate while a custom animation may be needed: a change with its own plan now, or a top whose
842
924
  // `animations.pop` is its own; the stack itself otherwise. UIKit reads the delegate's methods when it is set, so it is
843
- // set again at each change.
925
+ // set again at each change, and again when the interaction of the swipe comes or goes with the top's
926
+ // `animations.pop.interactive`.
844
927
  - (void)updateAnimationGateWith:(ANNTransitionPlan *)plan {
845
- BOOL needed = plan != nil;
846
- if (!needed) {
847
- UIViewController *top = [self getCurrentChild];
848
- needed = top && [ANNAnimationRules
849
- stackIsOwn:[top resolveOptionsWithDefault].animations.pop];
928
+ UIViewController *top = [self getCurrentChild];
929
+ ANNStackPopAnimationOptions *pop = top ? [top resolveOptionsWithDefault].animations.pop : nil;
930
+ BOOL needed = plan != nil || [ANNAnimationRules stackIsOwn:pop];
931
+ BOOL interactive = [ANNStackController popFollowsSwipe:pop];
932
+ if (_animatingDelegate.answersInteraction != interactive) {
933
+ _animatingDelegate.answersInteraction = interactive;
934
+ if (self.delegate == _animatingDelegate) {
935
+ self.delegate = self;
936
+ }
850
937
  }
938
+ _ownSwipe.enabled = interactive;
851
939
  id<UINavigationControllerDelegate> delegate =
852
940
  needed ? (id<UINavigationControllerDelegate>)_animatingDelegate : self;
853
941
  if (self.delegate != delegate) {
@@ -934,13 +1022,66 @@ static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
934
1022
  if (top != nil && top != [self getCurrentChild]) {
935
1023
  return YES;
936
1024
  }
937
- BOOL own = recognizer == self.interactivePopGestureRecognizer;
1025
+ BOOL own = recognizer == self.interactivePopGestureRecognizer || recognizer == _ownSwipe;
938
1026
  if (@available(iOS 26.0, *)) {
939
1027
  own = own || recognizer == self.interactiveContentPopGestureRecognizer;
940
1028
  }
941
1029
  return !own && _queue.shown.count < 2;
942
1030
  }
943
1031
 
1032
+ - (BOOL)swipeBackIsStacks:(UIGestureRecognizer *)recognizer {
1033
+ return recognizer != nil && recognizer == _ownSwipe;
1034
+ }
1035
+
1036
+ - (BOOL)swipeBackTakes:(UIGestureRecognizer *)recognizer {
1037
+ BOOL uikits = recognizer == self.interactivePopGestureRecognizer;
1038
+ if (@available(iOS 26.0, *)) {
1039
+ uikits = uikits || recognizer == self.interactiveContentPopGestureRecognizer;
1040
+ }
1041
+ if (recognizer != _ownSwipe && !uikits) {
1042
+ return YES;
1043
+ }
1044
+ NSArray<UIViewController *> *shown = _queue.shown;
1045
+ UIViewController *revealed = shown.count >= 2 ? shown[shown.count - 2] : nil;
1046
+ // The options as they are now, as `swipeAnimatorFrom:to:` reads them: the gate may lag a change of the defaults,
1047
+ // and a swipe of ours without the pop would be a pop the finger can't hold.
1048
+ UIViewController *top = self.topViewController;
1049
+ BOOL ownPlays = _ownSwipe.enabled && _animatingDelegate.answersInteraction && top &&
1050
+ top == [self getCurrentChild] && [self isOwnViewController:top] &&
1051
+ [ANNStackController
1052
+ popFollowsSwipe:[top resolveOptionsWithDefault].animations.pop] &&
1053
+ [self revealedEntrySettled:revealed];
1054
+ if (uikits) {
1055
+ return !ownPlays;
1056
+ }
1057
+ return ownPlays && [self panStartsAtLeadingEdge:_ownSwipe];
1058
+ }
1059
+
1060
+ // A pan that starts near the leading edge of the stack's view and moves more across than along, toward the trailing
1061
+ // side: where UIKit's edge swipe starts.
1062
+ - (BOOL)panStartsAtLeadingEdge:(UIPanGestureRecognizer *)pan {
1063
+ UIView *view = self.view;
1064
+ CGPoint at = [pan locationInView:view];
1065
+ CGPoint move = [pan translationInView:view];
1066
+ BOOL rightToLeft =
1067
+ view.effectiveUserInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft;
1068
+ CGFloat start = at.x - move.x;
1069
+ CGFloat fromEdge = rightToLeft ? view.bounds.size.width - start : start;
1070
+ if (move.x == 0 && move.y == 0) {
1071
+ move = [pan velocityInView:view];
1072
+ }
1073
+ CGFloat along = rightToLeft ? -move.x : move.x;
1074
+ return fromEdge <= ANNOwnSwipeEdgeWidth && along > fabs(move.y);
1075
+ }
1076
+
1077
+ // The stack's own swipe began: a pop as UIKit's swipe makes it, which the stack follows as the swipe back
1078
+ // (`followUIKitTransition`); the transition asks for the top's pop and its interaction (`swipeAnimatorFrom:to:`).
1079
+ - (void)ownSwipeBack:(UIPanGestureRecognizer *)recognizer {
1080
+ if (recognizer.state == UIGestureRecognizerStateBegan) {
1081
+ [self popViewControllerAnimated:YES];
1082
+ }
1083
+ }
1084
+
944
1085
  - (BOOL)hasOneEntry {
945
1086
  return _queue.entries.count < 2;
946
1087
  }
@@ -983,6 +1124,7 @@ static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
983
1124
  BOOL edge = !(isBool && ![value boolValue]);
984
1125
  BOOL content = !value || (isBool && [value boolValue]);
985
1126
  _edgeSwipeDelegate.enabled = edge;
1127
+ _ownSwipeDelegate.enabled = edge;
986
1128
  _moreEdgeSwipeDelegate.enabled = edge;
987
1129
  _contentSwipeDelegate.enabled = content;
988
1130
  _moreContentSwipeDelegate.enabled = content;
@@ -992,6 +1134,7 @@ static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
992
1134
  - (void)swipeBackFollowsBar {
993
1135
  BOOL hidden = [ANNSystemUI barHiddenOf:self.shownNavigationController];
994
1136
  _edgeSwipeDelegate.barHidden = hidden;
1137
+ _ownSwipeDelegate.barHidden = hidden;
995
1138
  _contentSwipeDelegate.barHidden = hidden;
996
1139
  _moreEdgeSwipeDelegate.barHidden = hidden;
997
1140
  _moreContentSwipeDelegate.barHidden = hidden;
@@ -1033,10 +1176,12 @@ static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
1033
1176
  return self;
1034
1177
  }
1035
1178
 
1036
- // In More the More navigation is what shows the screens.
1179
+ // In More the More navigation is what shows the screens. A tab rendered before it shows is in a window while its
1180
+ // screens render there, and not on screen.
1037
1181
  - (BOOL)stackIsOnScreen {
1038
1182
  return self.shownNavigationController.viewIfLoaded.window != nil &&
1039
- ![ANNPendingLayers isWaitingToShow:self];
1183
+ ![ANNPendingLayers isWaitingToShow:self] &&
1184
+ ![ANNBottomTabsController isInUnseenTab:self];
1040
1185
  }
1041
1186
 
1042
1187
  // Only the stack's own transitions (a push, a pop, a replace of its view controllers, the interactive pop): a
@@ -1102,6 +1247,11 @@ static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
1102
1247
  if (change == ANNStackChangePush && animated) {
1103
1248
  lowerBarBottom = [self lowerBarBottomOf:navigation leaving:coveredTop];
1104
1249
  }
1250
+ // The large title of a screen that comes with its content takes its place for the transition before UIKit's push.
1251
+ if (change == ANNStackChangePush && animated) {
1252
+ UIViewController *arriving = ANNStackOptionsScreen(entries.lastObject);
1253
+ [[ANNTopBarPresenter presenterOfScreen:arriving] arrivesByPushOn:navigation];
1254
+ }
1105
1255
  // The revealed screen's large title takes its place for the transition before UIKit lays the screen out for it.
1106
1256
  if (change == ANNStackChangePop && animated) {
1107
1257
  [self popReveals:entries.lastObject leaving:coveredTop on:navigation];
@@ -1428,10 +1578,28 @@ static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
1428
1578
 
1429
1579
  // The screen waits in the window at the stack's size, under UIKit's container view ( `ANNParking`): it isn't a child of
1430
1580
  // anything there, gets no touches, is hidden from accessibility, and its appearance is driven, so UIKit's callbacks
1431
- // report nothing for it. Each path that ends the wait gives the view back as it was; UIKit's push of the entry
1432
- // re-parents it in the same turn, so its departure is not ended here.
1581
+ // report nothing for it. UIKit gives such a view no safe area: its screens lay out with that of their place on top of
1582
+ // the stack meanwhile (`ANNScreenPlace`). Each path that ends the wait gives the view back as it was; UIKit's push of
1583
+ // the entry re-parents it in the same turn, so its departure is not ended here.
1433
1584
  - (void)stackPark:(UIViewController *)entry {
1434
- [_parking park:entry inView:self.shownNavigationController.view];
1585
+ UINavigationController *navigation = self.shownNavigationController;
1586
+ // Its screens lay out as on top of the stack, with the bar and the toolbar the entry shows there.
1587
+ __weak UIViewController *weakEntry = entry;
1588
+ __weak UINavigationController *weakNavigation = navigation;
1589
+ ANNScreenPlace * (^place)(void) = ^ANNScreenPlace * {
1590
+ UIViewController *parked = weakEntry;
1591
+ UINavigationController *stack = weakNavigation;
1592
+ if (!parked || !stack) {
1593
+ return nil;
1594
+ }
1595
+ return [ANNScreenPlace placeOfEntry:parked
1596
+ inStack:stack
1597
+ options:[ANNStackOptionsScreen(parked) resolveOptionsWithDefault]];
1598
+ };
1599
+ for (ANNComponentViewController *screen in ANNStackScreensOfEntry(entry)) {
1600
+ screen.placeWhileParked = place;
1601
+ }
1602
+ [_parking park:entry inView:navigation.view];
1435
1603
  }
1436
1604
 
1437
1605
  - (void)stackUnpark:(UIViewController *)entry {
@@ -60,7 +60,8 @@ typedef NS_ENUM(NSInteger, ANNStackChange) {
60
60
  /// The stack's own view controller: the layout parent of the nodes it took and doesn't show yet.
61
61
  - (UIViewController *)stackViewController;
62
62
 
63
- /// The stack is seen: its view is in a window, and it isn't inside a layer that waits to show (`ANNPendingLayers`).
63
+ /// The stack is seen: its view is in a window, and it isn't inside a layer that waits to show (`ANNPendingLayers`) nor
64
+ /// in a tab that renders before it shows (`isInUnseenTab:` of the tabs).
64
65
  - (BOOL)stackIsOnScreen;
65
66
 
66
67
  /// A transition UIKit runs on the stack now (one the queue didn't start); nil when none runs.
@@ -166,9 +167,11 @@ typedef NS_ENUM(NSInteger, ANNStackChange) {
166
167
  completion:(nullable dispatch_block_t)completion
167
168
  rejection:(nullable ANNTransitionRejectionBlock)rejection;
168
169
 
169
- /// A command that moves nothing (`popTo` of the top) answers `value` in its turn.
170
+ /// A command that moves nothing (`popTo` of the top) answers `value` in its turn; a failure meanwhile rejects with the
171
+ /// command's own `what`.
170
172
  - (void)noneWithValue:(id)value
171
173
  answer:(ANNCommandAnswer *)answer
174
+ what:(NSString *)what
172
175
  componentId:(NSString *)componentId
173
176
  source:(nullable UIViewController *)source;
174
177
 
@@ -16,7 +16,11 @@
16
16
  // How long the new top of a `setStackRoot` waits for its first content when `waitForRender` is not set.
17
17
  static const NSTimeInterval ANNStackRootRenderLimit = 0.5;
18
18
 
19
- // The limits of the bar components of a push: title and background 1 s, buttons 0.5 s, together from the wait's start.
19
+ // How long a push waits for its new top's first content when `waitForRender` is not set.
20
+ static const NSTimeInterval ANNPushRenderLimit = 0.5;
21
+
22
+ // The limits of the bar components of a push: title and background 1 s, buttons 0.5 s. With `waitForRender` unset they
23
+ // count from the wait's start, the content's time coming off them; with `true`, from the content's end.
20
24
  static const ANNBarWaitLimits ANNPushBarLimits = {1, 0.5};
21
25
 
22
26
  // The bar components of a `setStackRoot` within its 0.5 s.
@@ -53,8 +57,8 @@ typedef NS_ENUM(NSInteger, ANNStackOperationKind) {
53
57
  @property(nonatomic) BOOL animated;
54
58
  @property(nonatomic) BOOL waits;
55
59
  @property(nonatomic) BOOL atOnce;
56
- // When the replace's own wait for its new top started (`waitForRender` unset): the custom transition's wait takes what
57
- // is left of the 0.5 s. 0 when it didn't wait so.
60
+ // When the push's or the replace's own wait for its new top started (`waitForRender` unset): the custom transition's
61
+ // wait takes what is left of the 0.5 s. 0 when it didn't wait so.
58
62
  @property(nonatomic) CFTimeInterval waitStarted;
59
63
  @property(nonatomic, copy, nullable) dispatch_block_t completion;
60
64
  @property(nonatomic, copy, nullable) ANNTransitionRejectionBlock rejection;
@@ -371,12 +375,13 @@ static NSArray<UIViewController *> *ANNTopFirst(NSArray<UIViewController *> *ent
371
375
 
372
376
  - (void)noneWithValue:(id)value
373
377
  answer:(ANNCommandAnswer *)answer
378
+ what:(NSString *)what
374
379
  componentId:(NSString *)componentId
375
380
  source:(UIViewController *)source {
376
381
  ANNAssertMainQueue();
377
382
  ANNStackOperation *operation = [self operationOfKind:ANNStackOperationNone
378
383
  answer:answer
379
- what:@"pop"
384
+ what:what
380
385
  componentId:componentId
381
386
  source:source];
382
387
  operation.value = value;
@@ -559,41 +564,35 @@ static NSArray<UIViewController *> *ANNTopFirst(NSArray<UIViewController *> *ent
559
564
  [self scheduleRunNext];
560
565
  return;
561
566
  }
562
- // `waitForRender: true` waits for the content as long as it takes, then for the bar components (their limits from
563
- // the content's end); unset (also with `enabled: false`), only for the bar components, each kind to its own limit,
564
- // without parking (bar roots render out of a window); `false`, for nothing. The content comes during the
565
- // transition. A stack that isn't seen never waits.
567
+ // `waitForRender: true` waits for the content as long as it takes, then for the bar components, each kind to its own
568
+ // limit from the content's end; unset (also with `enabled: false`), for its first content at most 0.5 s, then for
569
+ // the bar components, each kind to its own limit from the wait's start (as when the push waited for them alone);
570
+ // `false`, for nothing, the content coming during the transition. Either wait's content ends after the calls
571
+ // JavaScript made in the commit that mounted the content (its `useScreenOptions`), content there already too, so
572
+ // that their options are in the bar on the transition's first frame. A native screen ends the wait at its start. A
573
+ // stack that isn't seen never waits.
566
574
  Bool *waitForRender = [node resolveOptionsWithDefault].animations.push.waitForRender;
567
575
  // A push whose caller waited already (a preview, `showInColumn`) waits for nothing here.
568
576
  BOOL onScreen = operation.waits && [_display stackIsOnScreen];
569
577
  __weak ANNStackQueue *weakSelf = self;
570
578
  __weak ANNStackOperation *weakOperation = operation;
571
- if (onScreen && waitForRender.hasValue && waitForRender.get) {
572
- [self waitFor:operation
573
- entry:node
574
- content:ANNRenderWaitContentNode
575
- limit:0
576
- unknownLimit:YES
577
- bar:ANNRenderWaitBarAfterContent
578
- barLimits:ANNPushBarLimits
579
- then:^{
580
- [weakSelf startPushTransition:weakOperation];
581
- }];
582
- return;
583
- }
584
- if (onScreen && !waitForRender.hasValue) {
579
+ if (onScreen && (!waitForRender.hasValue || waitForRender.get)) {
580
+ BOOL bounded = !waitForRender.hasValue;
581
+ if (bounded) {
582
+ operation.waitStarted = CACurrentMediaTime();
583
+ }
585
584
  [self waitFor:operation
586
- entry:node
587
- content:ANNRenderWaitContentNone
588
- limit:0
589
- unknownLimit:NO
590
- bar:ANNRenderWaitBarAfterContent
591
- barLimits:ANNPushBarLimits
592
- then:^{
593
- // UIKit sizes the screen inside the push: it makes its content right before.
594
- [weakOperation.node render];
595
- [weakSelf startPushTransition:weakOperation];
596
- }];
585
+ entry:node
586
+ content:ANNRenderWaitContentNode
587
+ limit:bounded ? ANNPushRenderLimit : 0
588
+ unknownLimit:!bounded
589
+ bar:ANNRenderWaitBarAfterContent
590
+ barLimits:ANNPushBarLimits
591
+ afterJavaScript:YES
592
+ barFromStart:bounded
593
+ then:^{
594
+ [weakSelf startPushTransition:weakOperation];
595
+ }];
597
596
  return;
598
597
  }
599
598
  // UIKit sizes the screen inside the push: it makes its content right before.
@@ -616,10 +615,14 @@ static NSArray<UIViewController *> *ANNTopFirst(NSArray<UIViewController *> *ent
616
615
  operation.covered = covered;
617
616
  ANNTransitionPlan *plan = nil;
618
617
  if (animated) {
618
+ // Unset `waitForRender`: the custom transition's wait takes what is left of the push's own 0.5 s.
619
+ NSTimeInterval limit =
620
+ [ANNAnimationRules customWaitLimitAfterWaitStartedAt:operation.waitStarted
621
+ commandLimit:ANNPushRenderLimit];
619
622
  plan = [ANNTransitionPlan stackPlanOfKind:ANNTransitionKindPush
620
623
  animation:push
621
624
  waitForRender:push.waitForRender
622
- waitLimit:ANNCustomTransitionWaitLimit
625
+ waitLimit:limit
623
626
  from:covered
624
627
  to:node];
625
628
  }
@@ -746,6 +749,8 @@ static NSArray<UIViewController *> *ANNTopFirst(NSArray<UIViewController *> *ent
746
749
  unknownLimit:NO
747
750
  bar:ANNRenderWaitBarWithContent
748
751
  barLimits:ANNStackRootBarLimits
752
+ afterJavaScript:NO
753
+ barFromStart:NO
749
754
  then:^{
750
755
  [weakSelf startReplaceTransition:weakOperation];
751
756
  }];
@@ -759,6 +764,8 @@ static NSArray<UIViewController *> *ANNTopFirst(NSArray<UIViewController *> *ent
759
764
  unknownLimit:YES
760
765
  bar:ANNRenderWaitBarAfterContent
761
766
  barLimits:ANNStackRootBarLimits
767
+ afterJavaScript:NO
768
+ barFromStart:NO
762
769
  then:^{
763
770
  [weakSelf startReplaceTransition:weakOperation];
764
771
  }];
@@ -1046,16 +1053,20 @@ static NSArray<UIViewController *> *ANNTopFirst(NSArray<UIViewController *> *ent
1046
1053
  // for it in the stack's view, its appearance driven: the wait ends at the entry's ready handler (set first, then the
1047
1054
  // park and `render`, then the test of 16.1), at `limit` with `markReady`, or with `unknownLimit` for a screen whose
1048
1055
  // rendered state stays unknown after 1 s. Without content, only the bar components, without parking (bar roots render
1049
- // out of a window). A wait that would end does nothing once its operation ended or belongs to an old JavaScript; its
1050
- // end runs protected (the end steps of the operation, `then`).
1056
+ // out of a window). With `afterJavaScript` the content's end waits for the calls JavaScript made by then
1057
+ // (`settlesThroughJavaScript`); with `barFromStart` the bar phase's limits count from the wait's start
1058
+ // (`barLimitsFromStart`). A wait that would end does nothing once its operation ended or belongs to an old
1059
+ // JavaScript; its end runs protected (the end steps of the operation, `then`).
1051
1060
  - (void)waitFor:(ANNStackOperation *)operation
1052
- entry:(UIViewController *)entry
1053
- content:(ANNRenderWaitContent)content
1054
- limit:(NSTimeInterval)limit
1055
- unknownLimit:(BOOL)unknownLimit
1056
- bar:(ANNRenderWaitBar)bar
1057
- barLimits:(ANNBarWaitLimits)barLimits
1058
- then:(dispatch_block_t)then {
1061
+ entry:(UIViewController *)entry
1062
+ content:(ANNRenderWaitContent)content
1063
+ limit:(NSTimeInterval)limit
1064
+ unknownLimit:(BOOL)unknownLimit
1065
+ bar:(ANNRenderWaitBar)bar
1066
+ barLimits:(ANNBarWaitLimits)barLimits
1067
+ afterJavaScript:(BOOL)afterJavaScript
1068
+ barFromStart:(BOOL)barFromStart
1069
+ then:(dispatch_block_t)then {
1059
1070
  __weak ANNStackQueue *weakSelf = self;
1060
1071
  __weak ANNStackOperation *weakOperation = operation;
1061
1072
  // The screens the wait is about are those the entry waits for (a pair: the ones it puts in the window).
@@ -1069,6 +1080,8 @@ static NSArray<UIViewController *> *ANNTopFirst(NSArray<UIViewController *> *ent
1069
1080
  bar:bar
1070
1081
  barLimits:barLimits];
1071
1082
  wait.unknownContentRule = unknownLimit;
1083
+ wait.settlesThroughJavaScript = afterJavaScript;
1084
+ wait.barLimitsFromStart = barFromStart;
1072
1085
  wait.canEnd = ^BOOL {
1073
1086
  ANNStackQueue *queue = weakSelf;
1074
1087
  ANNStackOperation *waiting = weakOperation;
@@ -0,0 +1,26 @@
1
+ #import <UIKit/UIKit.h>
2
+
3
+ @class ANNTransitionAnimator;
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ /// The interaction of a swipe back that plays the screen's own pop (`animations.pop.interactive`). It follows the
8
+ /// stack's own swipe from the leading edge (UIKit runs its swipe without asking the delegate for a transition), and
9
+ /// shows the animator's frames as far as the finger went across `view`, in the direction of the swipe back. Letting go
10
+ /// finishes the pop after a flick back or past half way, and puts the screen back otherwise; the rest plays faster
11
+ /// after a quick flick, never slower, and UIKit ends its part at the same pace. An interaction UIKit never starts goes
12
+ /// with the end of the gesture. Main queue.
13
+ @interface ANNSwipePopInteraction : NSObject <UIViewControllerInteractiveTransitioning>
14
+
15
+ - (instancetype)initWithAnimator:(ANNTransitionAnimator *)animator
16
+ recognizer:(UIPanGestureRecognizer *)recognizer
17
+ view:(UIView *)view NS_DESIGNATED_INITIALIZER;
18
+
19
+ - (instancetype)init NS_UNAVAILABLE;
20
+ + (instancetype)new NS_UNAVAILABLE;
21
+
22
+ @property(nonatomic, weak, readonly, nullable) ANNTransitionAnimator *animator;
23
+
24
+ @end
25
+
26
+ NS_ASSUME_NONNULL_END