@apexnative/navigation 1.0.0-alpha.0 → 1.0.0-alpha.10

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 (574) hide show
  1. package/ApexNavigation.podspec +2 -1
  2. package/CHANGELOG.md +128 -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/SecondaryScreenPresenter.kt +13 -5
  67. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/AppliedTabCalls.kt +49 -0
  68. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +5 -3
  69. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +108 -34
  70. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +25 -24
  71. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +22 -0
  72. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +3 -3
  73. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +0 -5
  74. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +28 -7
  75. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +12 -9
  76. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +2 -2
  77. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +27 -7
  78. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +1 -1
  79. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +103 -56
  80. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +29 -11
  81. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +2 -6
  82. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +22 -24
  83. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +109 -21
  84. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +21 -6
  85. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +476 -73
  86. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +57 -25
  87. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetBack.kt +42 -0
  88. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetStops.kt +83 -0
  89. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackCheck.kt +50 -0
  90. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +49 -14
  91. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +71 -12
  92. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +37 -11
  93. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +10 -8
  94. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +11 -4
  95. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +3 -3
  96. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +6 -6
  97. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +42 -9
  98. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +19 -8
  99. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +16 -7
  100. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +43 -4
  101. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +23 -0
  102. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +77 -17
  103. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/BackPreview.kt +315 -0
  104. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +3 -3
  105. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +30 -20
  106. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +216 -18
  107. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +26 -1
  108. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +149 -41
  109. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +26 -8
  110. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +115 -6
  111. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabMotion.kt +142 -0
  112. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +222 -48
  113. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +3 -5
  114. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +30 -34
  115. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +5 -51
  116. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarRowTransition.kt +3 -2
  117. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +11 -5
  118. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +13 -56
  119. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +219 -54
  120. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +9 -2
  121. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +6 -9
  122. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +75 -21
  123. package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationLayer.kt +73 -0
  124. package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +29 -11
  125. package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +14 -0
  126. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +9 -7
  127. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +61 -2
  128. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +0 -5
  129. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +72 -10
  130. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStep.kt +31 -0
  131. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +143 -135
  132. package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +13 -5
  133. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +37 -112
  134. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +9 -6
  135. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionViews.kt +100 -0
  136. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +112 -4
  137. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +346 -36
  138. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMorph.kt +199 -0
  139. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +56 -41
  140. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextMorph.kt +176 -0
  141. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewMorph.kt +108 -0
  142. package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +12 -3
  143. package/android/src/main/java/dev/apexnative/navigation/views/stack/ScreenEdge.kt +45 -0
  144. package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +140 -1
  145. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +14 -10
  146. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCopy.kt +85 -0
  147. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +13 -0
  148. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +5 -17
  149. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +73 -34
  150. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +6 -6
  151. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonView.kt +113 -0
  152. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarMenu.kt +219 -0
  153. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +125 -178
  154. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +34 -64
  155. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonRow.kt +216 -0
  156. package/android/src/main/jni/ANNContentHeights.cpp +82 -0
  157. package/android/src/main/res/drawable/apex_navigation_ic_arrow_right.xml +14 -0
  158. package/android/src/main/res/layout/apex_navigation_menu_header.xml +19 -0
  159. package/android/src/main/res/layout/apex_navigation_menu_item.xml +68 -0
  160. package/android/src/main/res/values/styles.xml +1 -1
  161. package/android/src/main/res/values-night/styles.xml +1 -1
  162. package/cli/app.js +1 -1
  163. package/cli/doctor/checks/app.js +77 -14
  164. package/cli/doctor/checks/splash.js +4 -22
  165. package/cli/migrate/native.js +18 -0
  166. package/cli/project.js +10 -2
  167. package/cli/setup/index.js +18 -0
  168. package/cli/setup/source.js +2 -1
  169. package/cli/setup/steps/appDelegate.js +66 -11
  170. package/cli/setup/steps/mainApplication.js +134 -19
  171. package/cli/setup/steps/metro.js +46 -0
  172. package/cli/setup/steps/sceneDelegate.js +108 -0
  173. package/cli/splash/index.js +3 -1
  174. package/cli/upgrade/changelog.js +2 -2
  175. package/docs-md/architecture/native-screens.md +4 -0
  176. package/docs-md/architecture/theme-and-context.md +131 -12
  177. package/docs-md/architecture/transitions.md +58 -12
  178. package/docs-md/containers/modals.md +8 -4
  179. package/docs-md/containers/overlays.md +3 -1
  180. package/docs-md/containers/side-menu.md +19 -2
  181. package/docs-md/containers/tabs.md +5 -1
  182. package/docs-md/flows/bottom-sheets.md +4 -2
  183. package/docs-md/flows/forms-in-a-modal.md +1 -1
  184. package/docs-md/fundamentals/screens-and-props.md +9 -1
  185. package/docs-md/fundamentals/starting-the-app.md +1 -1
  186. package/docs-md/guides/cli.md +4 -3
  187. package/docs-md/guides/deep-links.md +15 -33
  188. package/docs-md/help/glossary.md +4 -4
  189. package/docs-md/help/troubleshooting.md +44 -6
  190. package/docs-md/index.json +57 -1
  191. package/docs-md/migration/from-expo-router.md +1 -1
  192. package/docs-md/migration/from-react-native-navigation.md +9 -3
  193. package/docs-md/migration/from-react-navigation.md +2 -2
  194. package/docs-md/screen-ui/back-and-gestures.md +46 -2
  195. package/docs-md/screen-ui/bar-buttons.md +5 -5
  196. package/docs-md/screen-ui/search.md +1 -1
  197. package/docs-md/screen-ui/system-ui.md +17 -12
  198. package/docs-md/screen-ui/toolbar-and-fab.md +4 -2
  199. package/docs-md/screen-ui/top-bar.md +8 -4
  200. package/docs-md/start/installation.md +21 -3
  201. package/ios/Animations/ANNFrameDriver.h +55 -15
  202. package/ios/Animations/ANNFrameDriver.mm +216 -60
  203. package/ios/Animations/ANNTransitionAnimator.h +26 -5
  204. package/ios/Animations/ANNTransitionAnimator.mm +61 -13
  205. package/ios/Animations/ANNTransitionPlan.h +2 -2
  206. package/ios/Animations/ANNTransitionPlan.mm +10 -0
  207. package/ios/Animations/ANNTransitionWait.mm +6 -7
  208. package/ios/Animations/Elements/ANNElementFinder.h +57 -0
  209. package/ios/Animations/Elements/ANNElementFinder.mm +174 -2
  210. package/ios/Animations/Elements/ANNElementTransition.h +10 -8
  211. package/ios/Animations/Elements/ANNElementTransition.mm +19 -21
  212. package/ios/Animations/Elements/ANNSharedElementFlight.h +16 -11
  213. package/ios/Animations/Elements/ANNSharedElementFlight.mm +308 -69
  214. package/ios/Animations/Interpolators/ANNInterpolate.h +2 -30
  215. package/ios/Animations/Interpolators/ANNTransformParts.h +48 -0
  216. package/ios/Animations/Interpolators/ANNTransformParts.mm +507 -0
  217. package/ios/Animations/Interpolators/ANNViewTracks.h +9 -6
  218. package/ios/Animations/Interpolators/ANNViewTracks.mm +100 -30
  219. package/ios/CLAUDE.md +60 -24
  220. package/ios/CORE.md +44 -34
  221. package/ios/Contract/ANNCommandAnswer.h +13 -5
  222. package/ios/Contract/ANNCommandAnswer.mm +40 -32
  223. package/ios/Contract/ANNCommandContract.h +15 -0
  224. package/ios/Contract/ANNCommandContract.mm +78 -0
  225. package/ios/Contract/ANNCommandRunner.h +10 -9
  226. package/ios/Contract/ANNCommandRunner.mm +22 -28
  227. package/ios/Contract/ANNErrorTexts.h +6 -2
  228. package/ios/Contract/ANNErrorTexts.mm +18 -10
  229. package/ios/Contract/ANNLayoutNode.h +3 -3
  230. package/ios/Contract/ANNLayoutReader.h +3 -3
  231. package/ios/Core/ANNAppDelegate.mm +0 -2
  232. package/ios/Core/ANNAppearanceDispatcher.h +5 -4
  233. package/ios/Core/ANNAppearanceDispatcher.mm +12 -1
  234. package/ios/Core/ANNDeepLinkQueue.h +22 -2
  235. package/ios/Core/ANNDeepLinkQueue.mm +121 -14
  236. package/ios/Core/ANNErrorHandler.h +9 -4
  237. package/ios/Core/ANNErrorHandler.mm +20 -2
  238. package/ios/Core/ANNEventContract.h +246 -0
  239. package/ios/Core/ANNEventContract.mm +225 -0
  240. package/ios/Core/ANNEventEmitter.h +6 -2
  241. package/ios/Core/ANNEventEmitter.mm +117 -80
  242. package/ios/Core/ANNHinge.h +6 -0
  243. package/ios/Core/ANNHinge.mm +15 -4
  244. package/ios/Core/ANNJavaScriptCalls.h +33 -0
  245. package/ios/Core/ANNJavaScriptCalls.mm +52 -0
  246. package/ios/Core/ANNLayoutProtocol.h +5 -5
  247. package/ios/Core/ANNNavigationState.h +7 -5
  248. package/ios/Core/ANNNavigationState.mm +8 -7
  249. package/ios/Core/ANNNodeHelper.h +32 -12
  250. package/ios/Core/ANNNodeHelper.mm +100 -3
  251. package/ios/Core/ANNParking.h +5 -4
  252. package/ios/Core/ANNReloadCoordinator.mm +5 -12
  253. package/ios/Core/ANNRenderWait.h +20 -6
  254. package/ios/Core/ANNRenderWait.mm +143 -56
  255. package/ios/Core/ANNSceneDelegate.mm +25 -15
  256. package/ios/Core/ANNSystemUI.h +3 -2
  257. package/ios/Core/ANNSystemUI.mm +7 -0
  258. package/ios/Core/ANNUtils.h +7 -0
  259. package/ios/Core/ANNUtils.mm +10 -0
  260. package/ios/Core/ApexNavigation+Internal.h +1 -1
  261. package/ios/Core/ApexNavigation.mm +7 -6
  262. package/ios/Core/UIViewController+LayoutProtocol.h +9 -2
  263. package/ios/Core/UIViewController+LayoutProtocol.mm +8 -0
  264. package/ios/Layouts/Arrangement/ANNArrangementState.h +2 -17
  265. package/ios/Layouts/Arrangement/ANNArrangementState.mm +0 -38
  266. package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +10 -8
  267. package/ios/Layouts/Modal/ANNModalCoordinator.h +1 -1
  268. package/ios/Layouts/Modal/ANNModalCoordinator.mm +57 -16
  269. package/ios/Layouts/Modal/ANNModalPresentation.h +8 -5
  270. package/ios/Layouts/Modal/ANNModalPresentation.mm +12 -12
  271. package/ios/Layouts/Modal/ANNSheetPresenter.mm +83 -1
  272. package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +2 -8
  273. package/ios/Layouts/Root/ANNRootCoordinator.mm +58 -19
  274. package/ios/Layouts/Root/ANNSplashViewController.h +5 -3
  275. package/ios/Layouts/Root/ANNSplashViewController.mm +147 -0
  276. package/ios/Layouts/Screen/ANNComponentPresenter.h +11 -3
  277. package/ios/Layouts/Screen/ANNComponentPresenter.mm +34 -6
  278. package/ios/Layouts/Screen/ANNComponentViewController.h +15 -13
  279. package/ios/Layouts/Screen/ANNComponentViewController.mm +130 -75
  280. package/ios/Layouts/Screen/ANNNativeScreenContext.mm +7 -5
  281. package/ios/Layouts/Screen/ANNPreviewInteraction.h +7 -4
  282. package/ios/Layouts/Screen/ANNPreviewInteraction.mm +72 -10
  283. package/ios/Layouts/Screen/ANNScreenEnvironment.h +63 -0
  284. package/ios/Layouts/Screen/ANNScreenEnvironment.mm +181 -0
  285. package/ios/Layouts/Screen/ANNScreenPlace.h +53 -0
  286. package/ios/Layouts/Screen/ANNScreenPlace.mm +205 -0
  287. package/ios/Layouts/Screen/ANNScreenRegions.h +3 -18
  288. package/ios/Layouts/Screen/ANNScreenRegions.mm +9 -44
  289. package/ios/Layouts/Screen/ANNScreenSafeArea.h +4 -9
  290. package/ios/Layouts/Screen/ANNScreenSafeArea.mm +14 -16
  291. package/ios/Layouts/Screen/ANNScreenSettling.h +32 -0
  292. package/ios/Layouts/Screen/ANNScreenSettling.mm +137 -0
  293. package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +8 -0
  294. package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +83 -14
  295. package/ios/Layouts/SplitView/ANNSplitViewCommands.h +3 -2
  296. package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +105 -39
  297. package/ios/Layouts/SplitView/ANNSplitViewController.mm +7 -8
  298. package/ios/Layouts/Stack/ANNPreviewPush.h +7 -6
  299. package/ios/Layouts/Stack/ANNPreviewPush.mm +142 -27
  300. package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +11 -2
  301. package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +14 -7
  302. package/ios/Layouts/Stack/ANNStackCommands.mm +1 -0
  303. package/ios/Layouts/Stack/ANNStackController.h +8 -0
  304. package/ios/Layouts/Stack/ANNStackController.mm +184 -16
  305. package/ios/Layouts/Stack/ANNStackQueue.h +5 -2
  306. package/ios/Layouts/Stack/ANNStackQueue.mm +56 -43
  307. package/ios/Layouts/Stack/ANNSwipePopInteraction.h +26 -0
  308. package/ios/Layouts/Stack/ANNSwipePopInteraction.mm +185 -0
  309. package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +28 -4
  310. package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +4 -2
  311. package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +2 -3
  312. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +4 -0
  313. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +11 -0
  314. package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.h +12 -1
  315. package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +23 -0
  316. package/ios/Layouts/Tabs/ANNBottomTabsController.h +3 -0
  317. package/ios/Layouts/Tabs/ANNBottomTabsController.mm +237 -57
  318. package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +8 -3
  319. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +6 -2
  320. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +232 -43
  321. package/ios/Layouts/Tabs/ANNTabsDesign.h +6 -5
  322. package/ios/Layouts/Tabs/ANNTabsDesign.mm +9 -1
  323. package/ios/Layouts/Tabs/UITabBar+utils.h +5 -5
  324. package/ios/Layouts/Tabs/UITabBar+utils.mm +32 -13
  325. package/ios/Options/ANNAnimationOptions.h +2 -1
  326. package/ios/Options/ANNAnimationOptions.mm +1 -1
  327. package/ios/Options/ANNBottomTabsOptions.h +2 -0
  328. package/ios/Options/ANNBottomTabsOptions.mm +1 -0
  329. package/ios/Options/ANNOptions.h +25 -0
  330. package/ios/Options/ANNOptions.mm +157 -1
  331. package/ios/Options/ANNOptionsCache.h +7 -6
  332. package/ios/Options/ANNOptionsReader.mm +108 -0
  333. package/ios/Options/ANNSearchBarOptions.h +4 -3
  334. package/ios/Options/ANNSheetOptions.h +4 -1
  335. package/ios/Options/ANNSideMenuOptions.h +2 -0
  336. package/ios/Options/ANNSideMenuOptions.mm +2 -0
  337. package/ios/Options/ANNStackPopAnimationOptions.h +13 -0
  338. package/ios/Options/ANNStackPopAnimationOptions.mm +11 -0
  339. package/ios/Options/ANNUserChoice.h +57 -0
  340. package/ios/Options/ANNUserChoice.mm +44 -0
  341. package/ios/Options/Params/ANNImageSource.h +61 -0
  342. package/ios/Options/Params/ANNImageSource.mm +101 -0
  343. package/ios/Options/Params/ANNOptionImages.h +37 -0
  344. package/ios/Options/Params/ANNOptionImages.mm +284 -0
  345. package/ios/Options/Params/ANNParam.h +15 -0
  346. package/ios/Options/Params/ANNParam.mm +61 -0
  347. package/ios/Options/Params/Color.h +3 -0
  348. package/ios/Options/Params/Color.mm +21 -0
  349. package/ios/Options/Params/ColorParser.h +4 -3
  350. package/ios/Options/Params/ColorParser.mm +22 -4
  351. package/ios/Options/Params/Image.h +15 -2
  352. package/ios/Options/Params/Image.mm +35 -2
  353. package/ios/Options/Params/ImageParser.h +5 -5
  354. package/ios/Options/Params/ImageParser.mm +28 -46
  355. package/ios/Public/ApexNavigation/ANNSceneDelegate.h +3 -0
  356. package/ios/Public/ApexNavigation/ApexNavigation.h +1 -1
  357. package/ios/RECIPES.md +13 -6
  358. package/ios/React/ANNReactView.mm +6 -25
  359. package/ios/React/ANNSafeAreaViewComponentView.mm +28 -17
  360. package/ios/React/ANNSurfaceHostingView.h +14 -0
  361. package/ios/React/ANNSurfaceHostingView.mm +144 -1
  362. package/ios/React/Slots/ANNSlotComponentView.mm +24 -17
  363. package/ios/React/Slots/ANNSlotContainers.h +14 -6
  364. package/ios/React/Slots/ANNSlotContainers.mm +75 -2
  365. package/ios/React/Slots/ANNSlotHost.mm +1 -3
  366. package/ios/React/Slots/ANNSlotScreenView.mm +8 -2
  367. package/ios/TopBar/ANNBackButtonPresenter.mm +6 -5
  368. package/ios/TopBar/ANNBarAppearance.h +2 -1
  369. package/ios/TopBar/ANNBarAppearance.mm +111 -30
  370. package/ios/TopBar/ANNBarBackgroundComponent.mm +16 -0
  371. package/ios/TopBar/ANNBarButtonComponentView.h +4 -4
  372. package/ios/TopBar/ANNBarButtonComponentView.mm +1 -1
  373. package/ios/TopBar/ANNBarButtons.h +14 -8
  374. package/ios/TopBar/ANNBarButtons.mm +397 -80
  375. package/ios/TopBar/ANNIconButtonImage.h +1 -0
  376. package/ios/TopBar/ANNIconButtonImage.mm +34 -1
  377. package/ios/TopBar/ANNLargeTitlePresenter.h +13 -0
  378. package/ios/TopBar/ANNLargeTitlePresenter.mm +50 -7
  379. package/ios/TopBar/ANNMainList.h +3 -0
  380. package/ios/TopBar/ANNMainList.mm +4 -0
  381. package/ios/TopBar/ANNScrollEdgeEffects.h +22 -6
  382. package/ios/TopBar/ANNScrollEdgeEffects.mm +123 -16
  383. package/ios/TopBar/ANNSearchPresenter.mm +172 -21
  384. package/ios/TopBar/ANNSearchResultsViewController.mm +29 -6
  385. package/ios/TopBar/ANNTopBarPresenter.h +8 -2
  386. package/ios/TopBar/ANNTopBarPresenter.mm +155 -33
  387. package/ios/TurboModules/ANNTurboEventEmitter.mm +4 -35
  388. package/ios/TurboModules/ANNTurboModule.mm +104 -33
  389. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.cpp +20 -0
  390. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +5 -14
  391. package/lib/module/ARCHITECTURE.md +40 -27
  392. package/lib/module/adapters/NativeANNTurboModule.js.map +1 -1
  393. package/lib/module/api/app/AppRegistry.js +14 -2
  394. package/lib/module/api/app/AppRegistry.js.map +1 -1
  395. package/lib/module/api/app/createNavigation.js +190 -66
  396. package/lib/module/api/app/createNavigation.js.map +1 -1
  397. package/lib/module/api/commands/commands.js +54 -6
  398. package/lib/module/api/commands/commands.js.map +1 -1
  399. package/lib/module/api/events/navigationEvents.js +6 -2
  400. package/lib/module/api/events/navigationEvents.js.map +1 -1
  401. package/lib/module/api/hooks/useNavigation.js +8 -3
  402. package/lib/module/api/hooks/useNavigation.js.map +1 -1
  403. package/lib/module/api/hooks/useSafeAreaInsets.js +4 -3
  404. package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -1
  405. package/lib/module/api/linking/dispatchedLinks.js +23 -0
  406. package/lib/module/api/linking/dispatchedLinks.js.map +1 -0
  407. package/lib/module/api/linking/linking.js +11 -0
  408. package/lib/module/api/linking/linking.js.map +1 -1
  409. package/lib/module/api/navigation.js.map +1 -1
  410. package/lib/module/api/options/OptionsChain.js +2 -2
  411. package/lib/module/api/screens/defineScreen.js +45 -3
  412. package/lib/module/api/screens/defineScreen.js.map +1 -1
  413. package/lib/module/api/screens/nativeScreens.js +31 -6
  414. package/lib/module/api/screens/nativeScreens.js.map +1 -1
  415. package/lib/module/api/screens/registerScreens.js +193 -35
  416. package/lib/module/api/screens/registerScreens.js.map +1 -1
  417. package/lib/module/api/theme/theme.js +5 -0
  418. package/lib/module/api/theme/theme.js.map +1 -1
  419. package/lib/module/engine/commands.js +51 -9
  420. package/lib/module/engine/commands.js.map +1 -1
  421. package/lib/module/engine/layout.js +20 -11
  422. package/lib/module/engine/layout.js.map +1 -1
  423. package/lib/module/engine/nativeScreens.js +9 -0
  424. package/lib/module/engine/nativeScreens.js.map +1 -1
  425. package/lib/module/engine/options.js +49 -15
  426. package/lib/module/engine/options.js.map +1 -1
  427. package/lib/module/engine/optionsChange.js +102 -0
  428. package/lib/module/engine/optionsChange.js.map +1 -0
  429. package/lib/module/engine/places.js +52 -7
  430. package/lib/module/engine/places.js.map +1 -1
  431. package/lib/module/engine/props.js +30 -1
  432. package/lib/module/engine/props.js.map +1 -1
  433. package/lib/module/engine/refresh.js +85 -0
  434. package/lib/module/engine/refresh.js.map +1 -0
  435. package/lib/module/engine/rememberedOptions.js +61 -1
  436. package/lib/module/engine/rememberedOptions.js.map +1 -1
  437. package/lib/module/engine/screens.js +77 -16
  438. package/lib/module/engine/screens.js.map +1 -1
  439. package/lib/module/interfaces/contract/commands.json +101 -0
  440. package/lib/module/interfaces/contract/errors.json +275 -0
  441. package/lib/typescript/adapters/NativeANNTurboModule.d.ts +12 -2
  442. package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -1
  443. package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -1
  444. package/lib/typescript/api/app/createNavigation.d.ts +8 -3
  445. package/lib/typescript/api/app/createNavigation.d.ts.map +1 -1
  446. package/lib/typescript/api/commands/commands.d.ts.map +1 -1
  447. package/lib/typescript/api/commands/presentation.d.ts +4 -3
  448. package/lib/typescript/api/commands/presentation.d.ts.map +1 -1
  449. package/lib/typescript/api/events/navigationEvents.d.ts +3 -3
  450. package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -1
  451. package/lib/typescript/api/hooks/useNavigation.d.ts +1 -1
  452. package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -1
  453. package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts +4 -3
  454. package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -1
  455. package/lib/typescript/api/index.d.ts +1 -1
  456. package/lib/typescript/api/index.d.ts.map +1 -1
  457. package/lib/typescript/api/linking/dispatchedLinks.d.ts +7 -0
  458. package/lib/typescript/api/linking/dispatchedLinks.d.ts.map +1 -0
  459. package/lib/typescript/api/linking/linking.d.ts +8 -0
  460. package/lib/typescript/api/linking/linking.d.ts.map +1 -1
  461. package/lib/typescript/api/navigation.d.ts +4 -1
  462. package/lib/typescript/api/navigation.d.ts.map +1 -1
  463. package/lib/typescript/api/options/OptionsChain.d.ts +2 -2
  464. package/lib/typescript/api/screens/defineScreen.d.ts +23 -4
  465. package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -1
  466. package/lib/typescript/api/screens/nativeScreens.d.ts +8 -1
  467. package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -1
  468. package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -1
  469. package/lib/typescript/api/theme/theme.d.ts +2 -0
  470. package/lib/typescript/api/theme/theme.d.ts.map +1 -1
  471. package/lib/typescript/engine/commands.d.ts +5 -0
  472. package/lib/typescript/engine/commands.d.ts.map +1 -1
  473. package/lib/typescript/engine/layout.d.ts.map +1 -1
  474. package/lib/typescript/engine/nativeScreens.d.ts +5 -0
  475. package/lib/typescript/engine/nativeScreens.d.ts.map +1 -1
  476. package/lib/typescript/engine/options.d.ts +5 -2
  477. package/lib/typescript/engine/options.d.ts.map +1 -1
  478. package/lib/typescript/engine/optionsChange.d.ts +28 -0
  479. package/lib/typescript/engine/optionsChange.d.ts.map +1 -0
  480. package/lib/typescript/engine/places.d.ts +7 -2
  481. package/lib/typescript/engine/places.d.ts.map +1 -1
  482. package/lib/typescript/engine/props.d.ts +8 -1
  483. package/lib/typescript/engine/props.d.ts.map +1 -1
  484. package/lib/typescript/engine/refresh.d.ts +35 -0
  485. package/lib/typescript/engine/refresh.d.ts.map +1 -0
  486. package/lib/typescript/engine/rememberedOptions.d.ts +13 -0
  487. package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -1
  488. package/lib/typescript/engine/screens.d.ts +27 -6
  489. package/lib/typescript/engine/screens.d.ts.map +1 -1
  490. package/lib/typescript/interfaces/ComponentEvents.d.ts +4 -4
  491. package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -1
  492. package/lib/typescript/interfaces/Events.d.ts +28 -10
  493. package/lib/typescript/interfaces/Events.d.ts.map +1 -1
  494. package/lib/typescript/interfaces/Options.d.ts +1 -1
  495. package/lib/typescript/interfaces/Options.d.ts.map +1 -1
  496. package/lib/typescript/interfaces/options/animations.d.ts +80 -22
  497. package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
  498. package/lib/typescript/interfaces/options/bottomTabs.d.ts +21 -7
  499. package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -1
  500. package/lib/typescript/interfaces/options/buttons.d.ts +23 -15
  501. package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -1
  502. package/lib/typescript/interfaces/options/modals.d.ts +34 -26
  503. package/lib/typescript/interfaces/options/modals.d.ts.map +1 -1
  504. package/lib/typescript/interfaces/options/sideMenu.d.ts +23 -6
  505. package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -1
  506. package/lib/typescript/interfaces/options/stack.d.ts +17 -3
  507. package/lib/typescript/interfaces/options/stack.d.ts.map +1 -1
  508. package/lib/typescript/interfaces/options/system.d.ts +18 -11
  509. package/lib/typescript/interfaces/options/system.d.ts.map +1 -1
  510. package/lib/typescript/interfaces/options/toolbar.d.ts +2 -2
  511. package/lib/typescript/interfaces/options/topBar.d.ts +68 -38
  512. package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -1
  513. package/metro/acceptPlugin.js +57 -0
  514. package/metro/babelTransformer.js +45 -0
  515. package/metro/index.js +36 -0
  516. package/package.json +4 -25
  517. package/src/ARCHITECTURE.md +40 -27
  518. package/src/adapters/NativeANNTurboModule.ts +12 -2
  519. package/src/api/app/AppRegistry.ts +16 -2
  520. package/src/api/app/createNavigation.ts +203 -69
  521. package/src/api/commands/commands.ts +48 -7
  522. package/src/api/commands/presentation.ts +4 -3
  523. package/src/api/events/navigationEvents.ts +10 -4
  524. package/src/api/hooks/useNavigation.ts +9 -4
  525. package/src/api/hooks/useSafeAreaInsets.ts +4 -3
  526. package/src/api/index.ts +1 -0
  527. package/src/api/linking/dispatchedLinks.ts +18 -0
  528. package/src/api/linking/linking.ts +22 -1
  529. package/src/api/navigation.ts +4 -1
  530. package/src/api/options/OptionsChain.ts +2 -2
  531. package/src/api/screens/defineScreen.ts +49 -5
  532. package/src/api/screens/nativeScreens.ts +40 -4
  533. package/src/api/screens/registerScreens.tsx +185 -42
  534. package/src/api/theme/theme.ts +5 -0
  535. package/src/engine/commands.ts +70 -13
  536. package/src/engine/layout.ts +27 -11
  537. package/src/engine/nativeScreens.ts +10 -1
  538. package/src/engine/options.ts +45 -19
  539. package/src/engine/optionsChange.ts +107 -0
  540. package/src/engine/places.ts +65 -7
  541. package/src/engine/props.ts +30 -1
  542. package/src/engine/refresh.ts +97 -0
  543. package/src/engine/rememberedOptions.ts +74 -1
  544. package/src/engine/screens.tsx +76 -21
  545. package/src/interfaces/ComponentEvents.ts +4 -4
  546. package/src/interfaces/Events.ts +29 -10
  547. package/src/interfaces/Options.ts +1 -0
  548. package/src/interfaces/contract/commands.json +101 -0
  549. package/src/interfaces/contract/errors.json +275 -0
  550. package/src/interfaces/options/animations.ts +81 -22
  551. package/src/interfaces/options/bottomTabs.ts +21 -7
  552. package/src/interfaces/options/buttons.ts +23 -15
  553. package/src/interfaces/options/modals.ts +34 -26
  554. package/src/interfaces/options/sideMenu.ts +24 -6
  555. package/src/interfaces/options/stack.ts +17 -3
  556. package/src/interfaces/options/system.ts +18 -11
  557. package/src/interfaces/options/toolbar.ts +2 -2
  558. package/src/interfaces/options/topBar.ts +68 -38
  559. package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +0 -41
  560. package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +0 -69
  561. package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +0 -62
  562. package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +0 -62
  563. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +0 -223
  564. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +0 -31
  565. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +0 -138
  566. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +0 -88
  567. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +0 -33
  568. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +0 -66
  569. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +0 -179
  570. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +0 -139
  571. package/ios/Layouts/Screen/ANNScreenInsets.h +0 -30
  572. package/ios/Layouts/Screen/ANNScreenInsets.mm +0 -68
  573. package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +0 -27
  574. package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +0 -55
@@ -1,12 +1,26 @@
1
1
  #import "ANNRenderWait.h"
2
2
  #import "ANNAssert.h"
3
3
  #import "ANNComponentViewController.h"
4
+ #import "ANNJavaScriptCalls.h"
4
5
  #import "ANNScreenReadiness.h"
5
6
  #import "UIViewController+LayoutProtocol.h"
7
+ #import <QuartzCore/QuartzCore.h>
6
8
 
7
9
  // A screen whose rendered state stays unknown counts as ready after this, with `unknownContentRule`.
8
10
  static const NSTimeInterval ANNUnknownContentLimit = 1;
9
11
 
12
+ // What a kind of the bar whose limit passed in the content phase still gets, with `barLimitsFromStart`: a limit of 0
13
+ // would mean none of its own.
14
+ static const NSTimeInterval ANNPassedBarLimit = 0.001;
15
+
16
+ // What is left of a bar kind's `limit` after `spent`; no limit of its own stays none.
17
+ static NSTimeInterval ANNBarLimitLeft(NSTimeInterval limit, NSTimeInterval spent) {
18
+ if (limit <= 0) {
19
+ return limit;
20
+ }
21
+ return MAX(limit - spent, ANNPassedBarLimit);
22
+ }
23
+
10
24
  // The number of the last wait made: each wait listens under a key of its own.
11
25
  static NSUInteger ANNRenderWaitCount;
12
26
 
@@ -18,19 +32,25 @@ static NSUInteger ANNRenderWaitCount;
18
32
  ANNRenderWaitBar _bar;
19
33
  ANNBarWaitLimits _barLimits;
20
34
  NSString *_key;
35
+ // When the running wait started (`barLimitsFromStart`).
36
+ CFTimeInterval _startTime;
21
37
  // The token: each start, phase and end takes the next one, so that what an earlier one set up does nothing.
22
38
  NSUInteger _number;
23
39
  // Inside `start`: a step runs as it is, under the caller's protection.
24
40
  BOOL _starting;
25
41
  // Inside `setUp`: a ready handler leaves the node to the readiness test after it.
26
42
  BOOL _settingUp;
43
+ // The content is there and the phase waits for the calls JavaScript made by then (`settlesThroughJavaScript`); the
44
+ // number of that settle, so that one of an earlier take does nothing.
45
+ BOOL _settling;
46
+ NSUInteger _settleNumber;
27
47
  // The content nodes still waited, and every node the wait set its ready handler on.
28
48
  NSHashTable<UIViewController *> *_waited;
29
49
  NSHashTable<UIViewController *> *_listened;
30
- // The waited screens of the "root mounted" kind (a subset of `_waited`), and whether their limit passed in this
31
- // start (a retake waits for them no more then).
32
- NSHashTable<UIViewController *> *_mountWaited;
33
- BOOL _mountLimitPassed;
50
+ // The waited screens of the "unseen" kind (a subset of `_waited`), and whether their limit passed in this start (a
51
+ // retake waits for them no more then).
52
+ NSHashTable<UIViewController *> *_unseenWaited;
53
+ BOOL _unseenLimitPassed;
34
54
  ANNBarComponentsWait *_barWait;
35
55
  // What the last take of the running phase took: its screens (weakly) and, in the content phase, what the take read
36
56
  // of each to decide what it waits for (`takeStateOfScreens:`). A retake that would take the same does nothing.
@@ -55,7 +75,7 @@ static NSUInteger ANNRenderWaitCount;
55
75
  stringWithFormat:@"ApexNavigation.renderWait.%lu", (unsigned long)++ANNRenderWaitCount];
56
76
  _waited = [NSHashTable weakObjectsHashTable];
57
77
  _listened = [NSHashTable weakObjectsHashTable];
58
- _mountWaited = [NSHashTable weakObjectsHashTable];
78
+ _unseenWaited = [NSHashTable weakObjectsHashTable];
59
79
  }
60
80
  return self;
61
81
  }
@@ -69,7 +89,8 @@ static NSUInteger ANNRenderWaitCount;
69
89
  }
70
90
  _isWaiting = YES;
71
91
  _isInBarPhase = NO;
72
- _mountLimitPassed = NO;
92
+ _unseenLimitPassed = NO;
93
+ _startTime = CACurrentMediaTime();
73
94
  NSUInteger number = ++_number;
74
95
  _starting = YES;
75
96
  @try {
@@ -87,10 +108,10 @@ static NSUInteger ANNRenderWaitCount;
87
108
  [weakSelf limitOfNumber:number];
88
109
  });
89
110
  }
90
- if (_mountLimit > 0) {
91
- int64_t delay = (int64_t)(_mountLimit * NSEC_PER_SEC);
111
+ if (_unseenLimit > 0) {
112
+ int64_t delay = (int64_t)(_unseenLimit * NSEC_PER_SEC);
92
113
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay), dispatch_get_main_queue(), ^{
93
- [weakSelf mountLimitOfNumber:number];
114
+ [weakSelf unseenLimitOfNumber:number];
94
115
  });
95
116
  }
96
117
  if (_unknownContentRule) {
@@ -117,11 +138,9 @@ static NSUInteger ANNRenderWaitCount;
117
138
  if (![self runs:number]) {
118
139
  return;
119
140
  }
120
- if (_content == ANNRenderWaitContentNode && _node && [self screensAreReady]) {
121
- [_waited removeObject:_node];
122
- }
141
+ [self testNode];
123
142
  if (_waited.count == 0 && !_barWait) {
124
- [self phaseOfNumber:number endedMarkingReady:NO];
143
+ [self contentOfNumber:number];
125
144
  }
126
145
  }
127
146
 
@@ -143,8 +162,8 @@ static NSUInteger ANNRenderWaitCount;
143
162
  case ANNRenderWaitContentNone:
144
163
  break;
145
164
  case ANNRenderWaitContentEachScreen:
146
- // Each screen by the readiness it needs: its content, or the first mount of its root (an unselected
147
- // tab's screen). A screen with no content to wait for (a native screen) is ready.
165
+ // Each screen by its content; an unselected tab's to the unseen limit. A screen with no content to wait
166
+ // for (a native screen) is ready.
148
167
  for (UIViewController *node in screens) {
149
168
  if (![node isKindOfClass:ANNComponentViewController.class]) {
150
169
  continue;
@@ -158,25 +177,11 @@ static NSUInteger ANNRenderWaitCount;
158
177
  [self listenTo:screen number:number];
159
178
  continue;
160
179
  }
161
- if (_mountLimitPassed) {
162
- continue;
163
- }
164
- [_mountWaited addObject:screen];
165
- // A slot screen's readiness is its mount: its ready handler serves.
166
- if (![content respondsToSelector:@selector(whenMounted:)]) {
167
- [self listenTo:screen number:number];
168
- continue;
169
- }
170
- if (content.hasMounted) {
171
- [_mountWaited removeObject:screen];
180
+ if (_unseenLimitPassed) {
172
181
  continue;
173
182
  }
174
- [_waited addObject:screen];
175
- __weak ANNRenderWait *weakSelf = self;
176
- __weak UIViewController *weakScreen = screen;
177
- [content whenMounted:^{
178
- [weakSelf node:weakScreen readyOfNumber:number];
179
- }];
183
+ [_unseenWaited addObject:screen];
184
+ [self listenTo:screen number:number];
180
185
  }
181
186
  break;
182
187
  case ANNRenderWaitContentNode:
@@ -206,7 +211,7 @@ static NSUInteger ANNRenderWaitCount;
206
211
  }
207
212
  [_waited removeObject:node];
208
213
  if (_waited.count == 0 && !_barWait) {
209
- [self phaseOfNumber:number endedMarkingReady:NO];
214
+ [self contentOfNumber:number];
210
215
  }
211
216
  }
212
217
 
@@ -219,30 +224,69 @@ static NSUInteger ANNRenderWaitCount;
219
224
  if (_waited.count > 0) {
220
225
  return;
221
226
  }
227
+ [self contentOfNumber:number];
228
+ }
229
+
230
+ // What the running phase waited for came by its signals, or was there already. The content phase with
231
+ // `settlesThroughJavaScript` ends once the calls JavaScript made by now are applied: the commit that mounted the content
232
+ // ran its layout effects (`useScreenOptions`) in the same task of the JavaScript thread, so their `mergeOptions` are on
233
+ // their way to the main queue ahead of the settle. Content that was there already (as the wait starts or takes its
234
+ // screens again) may have mounted in a commit that ran just now: it settles too. The bar phase, and screens without
235
+ // React content (a native screen), end at once.
236
+ - (void)contentOfNumber:(NSUInteger)number {
237
+ if (!_settlesThroughJavaScript || _isInBarPhase || ![self hasReactScreen]) {
238
+ [self phaseOfNumber:number endedMarkingReady:NO];
239
+ return;
240
+ }
241
+ if (_settling) {
242
+ return;
243
+ }
244
+ _settling = YES;
245
+ NSUInteger settle = ++_settleNumber;
246
+ __weak ANNRenderWait *weakSelf = self;
247
+ [ANNJavaScriptCalls afterCallsMadeSoFar:^{
248
+ [weakSelf settleOfNumber:number settle:settle];
249
+ }];
250
+ }
251
+
252
+ - (void)settleOfNumber:(NSUInteger)number settle:(NSUInteger)settle {
253
+ if (![self runs:number] || !_settling || settle != _settleNumber) {
254
+ return;
255
+ }
256
+ _settling = NO;
222
257
  [self phaseOfNumber:number endedMarkingReady:NO];
223
258
  }
224
259
 
225
- // The screens of the "root mounted" kind are waited no longer: nobody sees them, nothing of theirs is held.
226
- - (void)mountLimitOfNumber:(NSUInteger)number {
260
+ // The screens of the "unseen" kind are waited no longer: nobody sees them, nothing of theirs is held.
261
+ - (void)unseenLimitOfNumber:(NSUInteger)number {
227
262
  if (![self runs:number]) {
228
263
  return;
229
264
  }
230
- _mountLimitPassed = YES;
231
- if (_mountWaited.count == 0) {
265
+ _unseenLimitPassed = YES;
266
+ if (_unseenWaited.count == 0) {
232
267
  return;
233
268
  }
234
- for (UIViewController *node in _mountWaited.allObjects) {
269
+ for (UIViewController *node in _unseenWaited.allObjects) {
235
270
  [_waited removeObject:node];
236
271
  }
237
- [_mountWaited removeAllObjects];
272
+ [_unseenWaited removeAllObjects];
238
273
  if (_waited.count == 0 && !_barWait) {
239
274
  [self phaseOfNumber:number endedMarkingReady:NO];
240
275
  }
241
276
  }
242
277
 
243
- // The limit: what is still waited counts as rendered from now on, its held events go at once.
278
+ // The limit: what is still waited counts as rendered from now on, its held events go at once. A phase that only waits
279
+ // for the calls of JavaScript (its content is there) ends without marking anything.
244
280
  - (void)limitOfNumber:(NSUInteger)number {
245
- if (![self runs:number] || (_waited.count == 0 && !_barWait)) {
281
+ if (![self runs:number]) {
282
+ return;
283
+ }
284
+ if (_settling) {
285
+ [self stopSettling];
286
+ [self phaseOfNumber:number endedMarkingReady:NO];
287
+ return;
288
+ }
289
+ if (_waited.count == 0 && !_barWait) {
246
290
  return;
247
291
  }
248
292
  [self phaseOfNumber:number endedMarkingReady:YES];
@@ -288,7 +332,7 @@ static NSUInteger ANNRenderWaitCount;
288
332
  [self markContentReady];
289
333
  }
290
334
  if (self->_bar == ANNRenderWaitBarAfterContent && !self->_isInBarPhase) {
291
- [self startBarPhase];
335
+ [self startBarPhaseWithLimits:[self barLimitsAfterContent]];
292
336
  return;
293
337
  }
294
338
  [self finish];
@@ -309,9 +353,10 @@ static NSUInteger ANNRenderWaitCount;
309
353
 
310
354
  #pragma mark - The bar phase
311
355
 
312
- // The content is there: the bar components of the screens now, each kind to its own limit from now. Nothing to wait
313
- // for ends the wait at once.
314
- - (void)startBarPhase {
356
+ // The content is there: the bar components of the screens now, each kind to its limit in `limits` from now. Nothing to
357
+ // wait for ends the wait at once.
358
+ - (void)startBarPhaseWithLimits:(ANNBarWaitLimits)limits {
359
+ [self stopSettling];
315
360
  [_barWait cancel];
316
361
  _barWait = nil;
317
362
  [self releaseContent];
@@ -321,7 +366,7 @@ static NSUInteger ANNRenderWaitCount;
321
366
  NSArray<UIViewController *> *barScreens = [self barScreens];
322
367
  [self rememberTakenScreens:barScreens states:nil];
323
368
  ANNBarComponentsWait *barWait = [ANNBarComponentsWait waitForScreens:barScreens
324
- limits:_barLimits
369
+ limits:limits
325
370
  done:^{
326
371
  [weakSelf barOfNumber:number];
327
372
  }];
@@ -344,23 +389,28 @@ static NSUInteger ANNRenderWaitCount;
344
389
  }
345
390
  if (_isInBarPhase) {
346
391
  [self runStep:^{
347
- [self startBarPhase];
392
+ [self startBarPhaseWithLimits:self->_barLimits];
348
393
  }];
349
394
  return;
350
395
  }
351
396
  // The same token: the limit set at the start stays.
352
397
  NSUInteger number = _number;
398
+ [self stopSettling];
353
399
  [self releaseContent];
354
400
  [_barWait cancel];
355
401
  _barWait = nil;
356
- if (take) {
357
- [self takeScreensOfNumber:number];
358
- } else {
402
+ if (!take) {
359
403
  _takenScreens = nil;
360
404
  _takenStates = nil;
405
+ [self phaseOfNumber:number endedMarkingReady:NO];
406
+ return;
361
407
  }
408
+ // As at the start: a node ready already counts at once (its ready handler waits for the next time), and content
409
+ // that is there settles again, the settle of the last take having stopped.
410
+ [self takeScreensOfNumber:number];
411
+ [self testNode];
362
412
  if (_waited.count == 0 && !_barWait) {
363
- [self phaseOfNumber:number endedMarkingReady:NO];
413
+ [self contentOfNumber:number];
364
414
  }
365
415
  }
366
416
 
@@ -382,6 +432,7 @@ static NSUInteger ANNRenderWaitCount;
382
432
 
383
433
  // The wait lets go of everything: its handlers, its bar wait; its limits find another token.
384
434
  - (void)stop {
435
+ [self stopSettling];
385
436
  _isWaiting = NO;
386
437
  _isInBarPhase = NO;
387
438
  _takenScreens = nil;
@@ -399,21 +450,26 @@ static NSUInteger ANNRenderWaitCount;
399
450
  }
400
451
  [_listened removeAllObjects];
401
452
  [_waited removeAllObjects];
402
- [_mountWaited removeAllObjects];
453
+ [_unseenWaited removeAllObjects];
403
454
  }
404
455
 
405
456
  #pragma mark - Helpers
406
457
 
458
+ // A settle on its way does nothing from now on.
459
+ - (void)stopSettling {
460
+ _settling = NO;
461
+ _settleNumber++;
462
+ }
463
+
407
464
  // What the content phase's take reads of each screen to decide what it waits for: the readiness it needs, whether it
408
- // has its content yet, whether that content is ready, and whether its root mounted.
465
+ // has its content yet, and whether that content is ready.
409
466
  - (NSArray<NSNumber *> *)takeStateOfScreens:(NSArray<UIViewController *> *)screens {
410
467
  NSMutableArray<NSNumber *> *states = [NSMutableArray arrayWithCapacity:screens.count];
411
468
  for (UIViewController *node in screens) {
412
- NSUInteger state = (NSUInteger)ANNWaitedReadinessOf(node) << 3;
469
+ NSUInteger state = (NSUInteger)ANNWaitedReadinessOf(node) << 2;
413
470
  if ([node isKindOfClass:ANNComponentViewController.class]) {
414
471
  UIView<ANNComponentProtocol> *content = ((ANNComponentViewController *)node).reactView;
415
- BOOL mounted = [content respondsToSelector:@selector(hasMounted)] && content.hasMounted;
416
- state |= (content ? 1 : 0) | (content.isReady ? 2 : 0) | (mounted ? 4 : 0);
472
+ state |= (content ? 1 : 0) | (content.isReady ? 2 : 0);
417
473
  }
418
474
  [states addObject:@(state)];
419
475
  }
@@ -470,6 +526,37 @@ static NSUInteger ANNRenderWaitCount;
470
526
  return screens;
471
527
  }
472
528
 
529
+ // With `ANNRenderWaitContentNode`, the node counts as ready when every screen of it is.
530
+ - (void)testNode {
531
+ if (_content == ANNRenderWaitContentNode && _node && [self screensAreReady]) {
532
+ [_waited removeObject:_node];
533
+ }
534
+ }
535
+
536
+ // The limits of the bar phase that follows the content phase: with `barLimitsFromStart`, what is left of each since the
537
+ // wait started.
538
+ - (ANNBarWaitLimits)barLimitsAfterContent {
539
+ ANNBarWaitLimits limits = _barLimits;
540
+ if (!_barLimitsFromStart) {
541
+ return limits;
542
+ }
543
+ NSTimeInterval spent = CACurrentMediaTime() - _startTime;
544
+ limits.titleAndBackground = ANNBarLimitLeft(limits.titleAndBackground, spent);
545
+ limits.buttons = ANNBarLimitLeft(limits.buttons, spent);
546
+ return limits;
547
+ }
548
+
549
+ // A screen with React content is among the screens: a commit of React mounted it.
550
+ - (BOOL)hasReactScreen {
551
+ for (UIViewController *node in [self screens]) {
552
+ if ([node isKindOfClass:ANNComponentViewController.class] &&
553
+ ((ANNComponentViewController *)node).reactView) {
554
+ return YES;
555
+ }
556
+ }
557
+ return NO;
558
+ }
559
+
473
560
  // Every screen has no content to wait for (a native screen) or its content is ready.
474
561
  - (BOOL)screensAreReady {
475
562
  for (UIViewController *node in [self screens]) {
@@ -1,9 +1,10 @@
1
1
  #import "ANNSceneDelegate.h"
2
+ #import "ANNDeepLinkQueue.h"
2
3
  #import "ApexNavigation.h"
3
- #import <React/RCTLinkingManager.h>
4
4
 
5
5
  // On the scene life cycle UIKit stops calling the app delegate's URL, user activity and foreground/background
6
- // methods. The scene forwards them, so AppDelegate overrides (and the deep links of ANNDeepLinkQueue) keep working.
6
+ // methods. The scene forwards them, so AppDelegate overrides (and the deep links of ANNDeepLinkQueue) keep working; the
7
+ // links keep their scene, through which React Native 0.88 and newer take them.
7
8
  @implementation ANNSceneDelegate
8
9
 
9
10
  - (void)scene:(UIScene *)scene
@@ -15,21 +16,21 @@
15
16
  self.window = [ApexNavigation attachToWindowScene:(UIWindowScene *)scene];
16
17
 
17
18
  for (UIOpenURLContext *context in connectionOptions.URLContexts) {
18
- [self ann_openURLContext:context];
19
+ [self ann_openURLContext:context ofScene:scene];
19
20
  }
20
21
  for (NSUserActivity *activity in connectionOptions.userActivities) {
21
- [self ann_continueUserActivity:activity];
22
+ [self ann_continueUserActivity:activity ofScene:scene];
22
23
  }
23
24
  }
24
25
 
25
26
  - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
26
27
  for (UIOpenURLContext *context in URLContexts) {
27
- [self ann_openURLContext:context];
28
+ [self ann_openURLContext:context ofScene:scene];
28
29
  }
29
30
  }
30
31
 
31
32
  - (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
32
- [self ann_continueUserActivity:userActivity];
33
+ [self ann_continueUserActivity:userActivity ofScene:scene];
33
34
  }
34
35
 
35
36
  - (void)sceneDidBecomeActive:(UIScene *)scene {
@@ -62,7 +63,7 @@
62
63
 
63
64
  #pragma mark - private
64
65
 
65
- - (void)ann_openURLContext:(UIOpenURLContext *)context {
66
+ - (void)ann_openURLContext:(UIOpenURLContext *)context ofScene:(UIScene *)scene {
66
67
  UIApplication *application = UIApplication.sharedApplication;
67
68
  id<UIApplicationDelegate> appDelegate = application.delegate;
68
69
  if ([appDelegate respondsToSelector:@selector(application:openURL:options:)]) {
@@ -70,22 +71,31 @@
70
71
  options[UIApplicationOpenURLOptionsSourceApplicationKey] = context.options.sourceApplication;
71
72
  options[UIApplicationOpenURLOptionsAnnotationKey] = context.options.annotation;
72
73
  options[UIApplicationOpenURLOptionsOpenInPlaceKey] = @(context.options.openInPlace);
73
- [appDelegate application:application openURL:context.URL options:options];
74
+ [ANNDeepLinkQueue forwardURLContext:context
75
+ ofScene:scene
76
+ through:^{
77
+ [appDelegate application:application openURL:context.URL options:options];
78
+ }];
74
79
  } else {
75
- [RCTLinkingManager application:application openURL:context.URL options:@{}];
80
+ [ANNDeepLinkQueue dispatchURLContext:context ofScene:scene];
76
81
  }
77
82
  }
78
83
 
79
- - (void)ann_continueUserActivity:(NSUserActivity *)activity {
84
+ - (void)ann_continueUserActivity:(NSUserActivity *)activity ofScene:(UIScene *)scene {
80
85
  UIApplication *application = UIApplication.sharedApplication;
81
86
  id<UIApplicationDelegate> appDelegate = application.delegate;
82
87
  if ([appDelegate respondsToSelector:@selector(application:continueUserActivity:restorationHandler:)]) {
83
- [appDelegate application:application
84
- continueUserActivity:activity
85
- restorationHandler:^(NSArray<id<UIUserActivityRestoring>> *restorableObjects){
86
- }];
88
+ [ANNDeepLinkQueue forwardUserActivity:activity
89
+ ofScene:scene
90
+ through:^{
91
+ [appDelegate application:application
92
+ continueUserActivity:activity
93
+ restorationHandler:^(
94
+ NSArray<id<UIUserActivityRestoring>> *restorableObjects){
95
+ }];
96
+ }];
87
97
  } else if ([activity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
88
- [RCTLinkingManager application:application openURL:activity.webpageURL options:@{}];
98
+ [ANNDeepLinkQueue dispatchUserActivity:activity ofScene:scene];
89
99
  }
90
100
  }
91
101
 
@@ -36,8 +36,9 @@ typedef NS_ENUM(NSInteger, ANNSystemUIQuestion) {
36
36
  /// The owner adds the asks UIKit doesn't make — a merge, a side menu at rest, an overlay, a root replaced, the bar of a
37
37
  /// stack shown or hidden, the orientation after an appearance — and makes them once per turn of the main queue: a
38
38
  /// trigger marks groups, the marks of a turn are coalesced, and at its end UIKit is asked again for each marked group
39
- /// in the main window and every overlay window. It keeps no values but the last status bar of each window, which only
40
- /// chooses whether a change of the style animates. Never a wait. Main queue.
39
+ /// in the main window and every overlay window. Each ask of the status bar also lays out the screens' blurs under it
40
+ /// (`statusBar.blur`), then and on the next turn. It keeps no values but the last status bar of each window, which
41
+ /// only chooses whether a change of the style animates. Never a wait. Main queue.
41
42
  @interface ANNSystemUI : NSObject
42
43
 
43
44
  - (instancetype)init NS_UNAVAILABLE;
@@ -1,5 +1,6 @@
1
1
  #import "ANNSystemUI.h"
2
2
  #import "ANNAssert.h"
3
+ #import "ANNComponentPresenter.h"
3
4
  #import "ANNComponentViewController.h"
4
5
  #import "ANNDefaultOptions.h"
5
6
  #import "ANNOverlayCoordinator.h"
@@ -280,6 +281,12 @@ static NSArray<UIViewController *> *ANNChainOf(UIWindow *window) {
280
281
  ask();
281
282
  }
282
283
  }
284
+ // The status bar hidden or shown moves no view where the safe area stays (a device with a notch): the blurs under
285
+ // it take its frame now, and once more on the next turn of the main queue, in case UIKit settles it after the ask.
286
+ [ANNComponentPresenter statusBarDidChange];
287
+ dispatch_async(dispatch_get_main_queue(), ^{
288
+ [ANNComponentPresenter statusBarDidChange];
289
+ });
283
290
  }
284
291
 
285
292
  // A controller that is no node of the layout (React Native's `<Modal>`, an alert, the splash) animates as UIKit's
@@ -23,6 +23,13 @@ NS_ASSUME_NONNULL_BEGIN
23
23
  /// The key window of `scene`; nil when none of its windows is key.
24
24
  + (nullable UIWindow *)keyWindowOfScene:(nullable UIWindowScene *)scene;
25
25
 
26
+ /// A new window of `windowClass` (`UIWindow` or a subclass) for the core: in the navigation window's scene, or at the
27
+ /// size of `mainScreen` before that window has one. It takes the navigation window's `overrideUserInterfaceStyle`:
28
+ /// React Native's `Appearance.setColorScheme` sets the style once, on the windows there are at that moment, and a
29
+ /// window of the system's style would show its screens in the other theme and switch the app's theme in JS when its
30
+ /// hosting views move in. Every window the core makes but the main window, the style's source, comes from here.
31
+ + (__kindof UIWindow *)makeWindowOfClass:(Class)windowClass;
32
+
26
33
  /// The status bar's frame in the navigation window's scene (its status bar manager); `CGRectZero` without a scene.
27
34
  @property(class, nonatomic, readonly) CGRect statusBarFrame;
28
35
 
@@ -26,6 +26,16 @@
26
26
  return windows;
27
27
  }
28
28
 
29
+ + (UIWindow *)makeWindowOfClass:(Class)windowClass {
30
+ UIWindowScene *scene = self.mainWindow.windowScene;
31
+ // `initWithFrame:` is deprecated from iOS 26 on and warns only with a deployment target from 26: a window without a
32
+ // scene is made so, and joins the scene as the main window gets it.
33
+ UIWindow *window = scene ? [[windowClass alloc] initWithWindowScene:scene]
34
+ : [[windowClass alloc] initWithFrame:self.mainScreen.bounds];
35
+ window.overrideUserInterfaceStyle = self.mainWindow.overrideUserInterfaceStyle;
36
+ return window;
37
+ }
38
+
29
39
  + (UIWindow *)keyWindowOfScene:(UIWindowScene *)scene {
30
40
  for (UIWindow *window in scene.windows) {
31
41
  if (window.isKeyWindow) {
@@ -18,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN
18
18
  + (nullable ANNNativeScreenCreator)nativeScreenCreatorForName:(NSString *)name;
19
19
 
20
20
  /// Whether a native screen is registered under the name by `registerNativeScreen:creator:` (the registration of 8.x is
21
- /// gone). Any thread: the layout of a command is checked on the module's queue.
21
+ /// gone). Any thread (the layout check of a command reads it on the main queue).
22
22
  + (BOOL)hasNativeScreenNamed:(NSString *)name;
23
23
 
24
24
  @end
@@ -9,7 +9,6 @@
9
9
  #import "ANNReloadCoordinator.h"
10
10
  #import "ANNSlotHost.h"
11
11
  #import "ANNSplashViewController.h"
12
- #import "ANNTabsPreloadWindow.h"
13
12
  #import "ANNUtils.h"
14
13
  #import <React/RCTLog.h>
15
14
  #import <ReactCommon/RCTHost.h>
@@ -45,8 +44,9 @@ static UIWindowScene *ANNConnectedWindowScene(void) {
45
44
  }
46
45
  }
47
46
 
48
- // Once, on the main queue: the generated native screens before any other part, then the core's parts, the `<Modal>`
49
- // replacement before any React content, the window with the copy of the launch screen, and the watch of the bundles.
47
+ // Once, on the main queue: the generated native screens before any other part, then the core's parts, the queue of the
48
+ // links, the `<Modal>` replacement before any React content, the window with the copy of the launch screen, and the
49
+ // watch of the bundles.
50
50
  + (void)bootstrapWithHost:(RCTHost *)host {
51
51
  ANNAssertMainQueue();
52
52
  if (ANNBootstrapped) {
@@ -55,6 +55,9 @@ static UIWindowScene *ANNConnectedWindowScene(void) {
55
55
  ANNBootstrapped = YES;
56
56
  [self registerGeneratedScreens];
57
57
  ANNHost = host;
58
+ // The links that come before React content wait for it; the launch link waits for the scene. Here, not in
59
+ // `ANNAppDelegate`, so an app delegate of the app's own keeps its launch link.
60
+ [ANNDeepLinkQueue start];
58
61
  // React Native lets a class with the descriptor of `ModalHostView` stand in for its own.
59
62
  [ANNModalHostViewComponentView registerForModalHostView];
60
63
  [self makeMainWindowInScene:nil];
@@ -145,9 +148,7 @@ static UIWindowScene *ANNConnectedWindowScene(void) {
145
148
  ANNMainWindow.windowScene = windowScene;
146
149
  ANNMainWindow.frame = windowScene.coordinateSpace.bounds;
147
150
  [ANNMainWindow makeKeyAndVisible];
148
- // The tabs' preload windows, the overlay windows and the slot host's window made before the scene go where the
149
- // main window is.
150
- [ANNTabsPreloadWindow mainWindowSceneDidConnect:windowScene];
151
+ // The overlay windows and the slot host's window made before the scene go where the main window is.
151
152
  [ANNOverlayCoordinator mainWindowSceneDidConnect:windowScene];
152
153
  [ANNSlotHost mainWindowSceneDidConnect:windowScene];
153
154
  // A direction the app set before the window had a scene takes the scene now.
@@ -64,10 +64,17 @@ FOUNDATION_EXPORT ANNWaitedReadiness ANNWaitedReadinessOf(UIViewController *scre
64
64
  /// The own options merged with `options` (`ANNNodeHelper mergeOwnOptions:`).
65
65
  - (void)mergeOwnOptions:(ANNNavigationOptions *)options;
66
66
 
67
- /// A change of the own options on a copy (`ANNNodeHelper changeOwnOptions:`): the way a presenter or a module keeps a
68
- /// choice of the user (a scope, tokens, a checked menu item, a toggled button).
67
+ /// A change of the own options on a copy (`ANNNodeHelper changeOwnOptions:`): what the core keeps of the app's merges.
69
68
  - (void)changeOwnOptions:(void (^)(ANNNavigationOptions *options))change;
70
69
 
70
+ /// A choice of the user in the node's user layer (`ANNNodeHelper setUserChoice:forKey:`): the way a presenter or a
71
+ /// module keeps what the user did (a scope, tokens, a checked menu item, a toggled button, a renamed title). Nil
72
+ /// removes it.
73
+ - (void)setUserChoice:(nullable ANNUserChoice *)choice forKey:(NSString *)key;
74
+
75
+ /// The choice of the user layer under `key`, or nil (`ANNNodeHelper userChoiceForKey:`).
76
+ - (nullable ANNUserChoice *)userChoiceForKey:(NSString *)key;
77
+
71
78
  #pragma mark - Readiness
72
79
 
73
80
  /// A ready handler of the node under the waiter's own key (`ANNNodeHelper setReadyHandler:forKey:`): it runs once, the
@@ -125,6 +125,14 @@ ANNWaitedReadiness ANNWaitedReadinessOf(UIViewController *screen) {
125
125
  [self.nodeHelper changeOwnOptions:change];
126
126
  }
127
127
 
128
+ - (void)setUserChoice:(ANNUserChoice *)choice forKey:(NSString *)key {
129
+ [self.nodeHelper setUserChoice:choice forKey:key];
130
+ }
131
+
132
+ - (ANNUserChoice *)userChoiceForKey:(NSString *)key {
133
+ return [self.nodeHelper userChoiceForKey:key];
134
+ }
135
+
128
136
  #pragma mark - Readiness
129
137
 
130
138
  - (void)setReadyHandler:(dispatch_block_t)handler forKey:(NSString *)key {
@@ -1,30 +1,15 @@
1
- #import "ANNEventEmitter.h"
2
1
  #import <UIKit/UIKit.h>
3
2
 
4
3
  NS_ASSUME_NONNULL_BEGIN
5
4
 
6
- /// The state of each screen of an arrangement (`useArrangement`): `{ placement, layout, front, hidden }`, which view of
7
- /// the pair it is and how the pair lies. The native side keeps it on the main queue; JavaScript reads it from its own
8
- /// thread for a screen's first render, and gets every change as `ANN.ArrangementChanged`.
5
+ /// Whether the app can show pairs at all. The state of each screen of a pair (`useArrangement`) is kept for JavaScript
6
+ /// by `ANNScreenEnvironment`.
9
7
  @interface ANNArrangementState : NSObject
10
8
 
11
9
  /// Whether the app shows arrangements (`getStartInfo().arrangements`): built with the iOS 27.1 SDK and running on
12
10
  /// iOS 27.1 or later. Without them JavaScript sends only the primary, as a screen. Any thread.
13
11
  + (BOOL)canShowArrangements;
14
12
 
15
- /// Keeps the screen's state and tells when it changed; nothing goes without an emitter. Main queue.
16
- + (void)setState:(NSDictionary<NSString *, id> *)state
17
- forScreenId:(NSString *)screenId
18
- eventEmitter:(nullable ANNEventEmitter *)eventEmitter;
19
-
20
- /// The screen's state, or nil for a screen outside a pair. Any thread.
21
- + (nullable NSDictionary<NSString *, id> *)stateForScreenId:(NSString *)screenId;
22
-
23
- + (void)removeScreenId:(NSString *)screenId;
24
-
25
- /// Forgets every screen: after a reload the new JavaScript counts its ids anew. Main queue.
26
- + (void)removeAll;
27
-
28
13
  @end
29
14
 
30
15
  NS_ASSUME_NONNULL_END