@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,41 @@
1
1
  #import "ANNDeepLinkQueue.h"
2
2
  #import "ANNAssert.h"
3
+ #import "ANNEventEmitter.h"
4
+ #import "ApexNavigation+Internal.h"
3
5
  #import <React/RCTLinkingManager.h>
4
6
  #import <React/RCTRootView.h>
5
7
  #import <UIKit/UIKit.h>
6
8
 
9
+ // A link on its way to `Linking`, with the scene's own context or user activity it came in when it came from a scene.
10
+ @interface ANNDeepLink : NSObject
11
+ @property(nonatomic, readonly) NSURL *url;
12
+ @property(nonatomic, readonly, nullable) UIOpenURLContext *context;
13
+ @property(nonatomic, readonly, nullable) NSUserActivity *activity;
14
+ @property(nonatomic, readonly, weak, nullable) UIScene *scene;
15
+ @end
16
+
17
+ @implementation ANNDeepLink
18
+
19
+ - (instancetype)initWithURL:(NSURL *)url
20
+ context:(UIOpenURLContext *)context
21
+ activity:(NSUserActivity *)activity
22
+ scene:(UIScene *)scene {
23
+ if (self = [super init]) {
24
+ _url = url;
25
+ _context = context;
26
+ _activity = activity;
27
+ _scene = scene;
28
+ }
29
+ return self;
30
+ }
31
+
32
+ @end
33
+
7
34
  // Main queue only.
8
35
  static BOOL ANNDeepLinkQueueStarted = NO;
9
- static NSMutableArray<NSURL *> *ANNPendingDeepLinkURLs;
36
+ static NSMutableArray<ANNDeepLink *> *ANNPendingDeepLinks;
37
+ // The scene's link the scene delegate is handing to the app delegate: the app delegate dispatches its URL.
38
+ static ANNDeepLink *ANNForwardedSceneLink;
10
39
  // React content appeared: `RCTLinkingManager` exists and JS listens to `url` events.
11
40
  static BOOL ANNReactContentAppeared = NO;
12
41
  // Every URL that launched the app was dispatched.
@@ -20,7 +49,7 @@ static ANNLaunchLinkCompletion ANNWaitingLaunchLinkCompletion;
20
49
 
21
50
  + (void)initialize {
22
51
  if (self == ANNDeepLinkQueue.class) {
23
- ANNPendingDeepLinkURLs = [NSMutableArray new];
52
+ ANNPendingDeepLinks = [NSMutableArray new];
24
53
  }
25
54
  }
26
55
 
@@ -42,15 +71,51 @@ static ANNLaunchLinkCompletion ANNWaitingLaunchLinkCompletion;
42
71
  selector:@selector(applicationDidBecomeActive:)
43
72
  name:UIApplicationDidBecomeActiveNotification
44
73
  object:nil];
74
+ // Started once the app is active (an app that starts React Native later, on demand), the queue missed the scene's
75
+ // connection and the notification: the links that launched the app went elsewhere, and none waits for them.
76
+ if (UIApplication.sharedApplication.applicationState == UIApplicationStateActive) {
77
+ [self launchLinksKnown];
78
+ }
45
79
  }
46
80
 
47
81
  + (void)dispatchURL:(NSURL *)url {
48
- ANNAssertMainQueue();
49
- if (ANNReactContentAppeared && ANNWaitingLaunchLinkCompletion == nil) {
50
- [self openURL:url];
82
+ // The URL of the scene's link keeps its context; one the app delegate changed is a URL of its own.
83
+ ANNDeepLink *link = [ANNForwardedSceneLink.url isEqual:url]
84
+ ? ANNForwardedSceneLink
85
+ : [[ANNDeepLink alloc] initWithURL:url context:nil activity:nil scene:nil];
86
+ [self dispatchLink:link];
87
+ }
88
+
89
+ + (void)forwardURLContext:(UIOpenURLContext *)context
90
+ ofScene:(UIScene *)scene
91
+ through:(NS_NOESCAPE dispatch_block_t)forward {
92
+ [self forwardLink:[[ANNDeepLink alloc] initWithURL:context.URL context:context activity:nil scene:scene]
93
+ through:forward];
94
+ }
95
+
96
+ + (void)forwardUserActivity:(NSUserActivity *)activity
97
+ ofScene:(UIScene *)scene
98
+ through:(NS_NOESCAPE dispatch_block_t)forward {
99
+ if (activity.webpageURL == nil) {
100
+ forward();
51
101
  return;
52
102
  }
53
- [ANNPendingDeepLinkURLs addObject:url];
103
+ [self forwardLink:[[ANNDeepLink alloc] initWithURL:activity.webpageURL context:nil activity:activity scene:scene]
104
+ through:forward];
105
+ }
106
+
107
+ + (void)dispatchURLContext:(UIOpenURLContext *)context ofScene:(UIScene *)scene {
108
+ [self dispatchLink:[[ANNDeepLink alloc] initWithURL:context.URL context:context activity:nil scene:scene]];
109
+ }
110
+
111
+ + (void)dispatchUserActivity:(NSUserActivity *)activity ofScene:(UIScene *)scene {
112
+ if (activity.webpageURL == nil) {
113
+ return;
114
+ }
115
+ [self dispatchLink:[[ANNDeepLink alloc] initWithURL:activity.webpageURL
116
+ context:nil
117
+ activity:activity
118
+ scene:scene]];
54
119
  }
55
120
 
56
121
  + (void)windowSceneDidConnect {
@@ -98,10 +163,10 @@ static ANNLaunchLinkCompletion ANNWaitingLaunchLinkCompletion;
98
163
  if (ANNWaitingLaunchLinkCompletion != nil) {
99
164
  return;
100
165
  }
101
- NSArray<NSURL *> *urls = [ANNPendingDeepLinkURLs copy];
102
- [ANNPendingDeepLinkURLs removeAllObjects];
103
- for (NSURL *url in urls) {
104
- [self openURL:url];
166
+ NSArray<ANNDeepLink *> *links = [ANNPendingDeepLinks copy];
167
+ [ANNPendingDeepLinks removeAllObjects];
168
+ for (ANNDeepLink *link in links) {
169
+ [self openLink:link];
105
170
  }
106
171
  }
107
172
 
@@ -124,13 +189,55 @@ static ANNLaunchLinkCompletion ANNWaitingLaunchLinkCompletion;
124
189
  // One link opens the app. The links queued before it are dropped: opened after it, they would take the app elsewhere.
125
190
  + (void)giveLaunchLink:(ANNLaunchLinkCompletion)completion {
126
191
  ANNLaunchLinkTaken = YES;
127
- NSURL *url = ANNPendingDeepLinkURLs.lastObject;
128
- [ANNPendingDeepLinkURLs removeAllObjects];
192
+ NSURL *url = ANNPendingDeepLinks.lastObject.url;
193
+ [ANNPendingDeepLinks removeAllObjects];
129
194
  completion(url);
130
195
  }
131
196
 
132
- + (void)openURL:(NSURL *)url {
133
- [RCTLinkingManager application:UIApplication.sharedApplication openURL:url options:@{}];
197
+ + (void)dispatchLink:(ANNDeepLink *)link {
198
+ ANNAssertMainQueue();
199
+ if (ANNReactContentAppeared && ANNWaitingLaunchLinkCompletion == nil) {
200
+ [self openLink:link];
201
+ return;
202
+ }
203
+ [ANNPendingDeepLinks addObject:link];
204
+ }
205
+
206
+ + (void)forwardLink:(ANNDeepLink *)link through:(NS_NOESCAPE dispatch_block_t)forward {
207
+ ANNAssertMainQueue();
208
+ ANNDeepLink *outer = ANNForwardedSceneLink;
209
+ ANNForwardedSceneLink = link;
210
+ forward();
211
+ ANNForwardedSceneLink = outer;
212
+ }
213
+
214
+ // React Native 0.88 and newer take a scene's links through its scene methods: in an app whose Info.plist names a scene
215
+ // delegate, its app delegate methods take none. The earlier versions have only the app delegate methods.
216
+ + (void)openLink:(ANNDeepLink *)link {
217
+ UIScene *scene = link.scene;
218
+ if (scene != nil && link.context != nil) {
219
+ SEL openContexts = NSSelectorFromString(@"scene:openURLContexts:");
220
+ if ([RCTLinkingManager respondsToSelector:openContexts]) {
221
+ IMP implementation = [RCTLinkingManager methodForSelector:openContexts];
222
+ ((void (*)(id, SEL, UIScene *, NSSet<UIOpenURLContext *> *))implementation)(
223
+ RCTLinkingManager.class, openContexts, scene, [NSSet setWithObject:link.context]);
224
+ return;
225
+ }
226
+ }
227
+ if (scene != nil && link.activity != nil) {
228
+ SEL continueActivity = NSSelectorFromString(@"scene:continueUserActivity:");
229
+ if ([RCTLinkingManager respondsToSelector:continueActivity]) {
230
+ IMP implementation = [RCTLinkingManager methodForSelector:continueActivity];
231
+ ((void (*)(id, SEL, UIScene *, NSUserActivity *))implementation)(
232
+ RCTLinkingManager.class, continueActivity, scene, link.activity);
233
+ return;
234
+ }
235
+ }
236
+ // A link of the app's own (`dispatchDeepLinkURL`) has no scene: on React Native 0.88 and newer, with a scene
237
+ // delegate in Info.plist, `Linking` doesn't take it from here. JavaScript hands it to `Linking` itself.
238
+ if (![RCTLinkingManager application:UIApplication.sharedApplication openURL:link.url options:@{}]) {
239
+ [ApexNavigation.eventEmitter sendDeepLinkDispatched:link.url];
240
+ }
134
241
  }
135
242
 
136
243
  @end
@@ -3,13 +3,18 @@
3
3
  NS_ASSUME_NONNULL_BEGIN
4
4
 
5
5
  /// How a failed command tells JavaScript: a rejection carries only a sentence, never a code of its own, and a command
6
- /// without a promise writes the sentence to the log. The sentences are those of `ANNErrorTexts`.
6
+ /// without a promise writes the sentence to the log. The sentences are those of `ANNErrorTexts`. The one place that
7
+ /// calls a command's promise blocks: a block that is nil (a caller that passed none) is never called.
7
8
  @interface ANNErrorHandler : NSObject
8
9
 
9
- /// Rejects a command's promise with the sentence alone: React Native puts its own default code on it.
10
- + (void)reject:(RCTPromiseRejectBlock)reject text:(NSString *)text;
10
+ /// Rejects a command's promise with the sentence alone: React Native puts its own default code on it. Without a
11
+ /// reject block the sentence goes to the log as `logFailureOf:text:` writes it.
12
+ + (void)reject:(nullable RCTPromiseRejectBlock)reject of:(NSString *)method text:(NSString *)text;
11
13
 
12
- /// The log line of a command without a promise: `[ApexNavigation] <method>: <text>`.
14
+ /// Resolves a command's promise with `value`. Without a resolve block one line goes to the log instead.
15
+ + (void)resolve:(nullable RCTPromiseResolveBlock)resolve of:(NSString *)method value:(nullable id)value;
16
+
17
+ /// The log line of a command without a promise: `[ApexNavigation] <method>: <text>`, a warning (`RCTLogWarn`).
13
18
  + (void)logFailureOf:(NSString *)method text:(NSString *)text;
14
19
 
15
20
  @end
@@ -1,14 +1,32 @@
1
1
  #import "ANNErrorHandler.h"
2
+ #import "ANNErrorTexts.h"
2
3
  #import <React/RCTLog.h>
3
4
 
4
5
  @implementation ANNErrorHandler
5
6
 
6
- + (void)reject:(RCTPromiseRejectBlock)reject text:(NSString *)text {
7
+ // Calling a nil block ends the app (`EXC_BAD_ACCESS` at 0x10, its invoke field): JavaScript always passes both blocks,
8
+ // so a nil one comes from a caller in native code, and the answer goes to the log.
9
+ + (void)reject:(RCTPromiseRejectBlock)reject of:(NSString *)method text:(NSString *)text {
10
+ if (!reject) {
11
+ [self logFailureOf:method text:text];
12
+ return;
13
+ }
7
14
  reject(nil, text, nil);
8
15
  }
9
16
 
17
+ + (void)resolve:(RCTPromiseResolveBlock)resolve of:(NSString *)method value:(id)value {
18
+ if (!resolve) {
19
+ [self logFailureOf:method
20
+ text:[ANNErrorTexts couldNot:@"resolve its promise" reason:@"the command came without one"]];
21
+ return;
22
+ }
23
+ resolve(value);
24
+ }
25
+
26
+ // A warning, not an error: a failed command without a promise (a `mergeOptions` the screen can't take) is the app's
27
+ // to notice, not a red box over it; Android logs it the same way, without a dialog.
10
28
  + (void)logFailureOf:(NSString *)method text:(NSString *)text {
11
- RCTLogError(@"[ApexNavigation] %@: %@", method, text);
29
+ RCTLogWarn(@"[ApexNavigation] %@: %@", method, text);
12
30
  }
13
31
 
14
32
  @end
@@ -0,0 +1,246 @@
1
+ // Made by scripts/contract.mjs from the event types of src/interfaces/: change them and run the script again.
2
+
3
+ #import <Foundation/Foundation.h>
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ /// The names of the events `ANN.<Name>` (`event`) and the keys of their payloads, as the types of `src/interfaces/`
8
+ /// give them; what each field means is its JSDoc there. The object types a field holds have keys of their own. The
9
+ /// senders take every name and key from here: `ANNEventContract.CommandCompleted.commandId`.
10
+ FOUNDATION_EXPORT const struct ANNEventContractTable {
11
+ /// `ANN.AppLaunched`.
12
+ struct {
13
+ __unsafe_unretained NSString *event;
14
+ } AppLaunched;
15
+ /// `ANN.ArrangementChanged`.
16
+ struct {
17
+ __unsafe_unretained NSString *event;
18
+ __unsafe_unretained NSString *componentId;
19
+ __unsafe_unretained NSString *placement;
20
+ __unsafe_unretained NSString *layout;
21
+ __unsafe_unretained NSString *front;
22
+ __unsafe_unretained NSString *hidden;
23
+ } ArrangementChanged;
24
+ /// `ANN.BottomAccessoryPlacementChanged` (iOS).
25
+ struct {
26
+ __unsafe_unretained NSString *event;
27
+ __unsafe_unretained NSString *componentId;
28
+ __unsafe_unretained NSString *placement;
29
+ } BottomAccessoryPlacementChanged;
30
+ /// `ANN.BottomTabLongPressed`.
31
+ struct {
32
+ __unsafe_unretained NSString *event;
33
+ __unsafe_unretained NSString *selectedTabIndex;
34
+ __unsafe_unretained NSString *bottomTabsId;
35
+ } BottomTabLongPressed;
36
+ /// `ANN.BottomTabPressed`.
37
+ struct {
38
+ __unsafe_unretained NSString *event;
39
+ __unsafe_unretained NSString *tabIndex;
40
+ __unsafe_unretained NSString *bottomTabsId;
41
+ /// Optional.
42
+ __unsafe_unretained NSString *screenId;
43
+ __unsafe_unretained NSString *wasSelected;
44
+ } BottomTabPressed;
45
+ /// `ANN.BottomTabSelected`.
46
+ struct {
47
+ __unsafe_unretained NSString *event;
48
+ __unsafe_unretained NSString *selectedTabIndex;
49
+ __unsafe_unretained NSString *unselectedTabIndex;
50
+ __unsafe_unretained NSString *bottomTabsId;
51
+ } BottomTabSelected;
52
+ /// `ANN.CommandCompleted`.
53
+ struct {
54
+ __unsafe_unretained NSString *event;
55
+ __unsafe_unretained NSString *commandName;
56
+ __unsafe_unretained NSString *commandId;
57
+ __unsafe_unretained NSString *completionTime;
58
+ } CommandCompleted;
59
+ /// `ANN.ComponentDidAppear`.
60
+ struct {
61
+ __unsafe_unretained NSString *event;
62
+ __unsafe_unretained NSString *componentId;
63
+ __unsafe_unretained NSString *componentName;
64
+ __unsafe_unretained NSString *componentType;
65
+ } ComponentDidAppear;
66
+ /// `ANN.ComponentDidDisappear`.
67
+ struct {
68
+ __unsafe_unretained NSString *event;
69
+ __unsafe_unretained NSString *componentId;
70
+ __unsafe_unretained NSString *componentName;
71
+ __unsafe_unretained NSString *componentType;
72
+ } ComponentDidDisappear;
73
+ /// `ANN.ComponentWillAppear`.
74
+ struct {
75
+ __unsafe_unretained NSString *event;
76
+ __unsafe_unretained NSString *componentId;
77
+ __unsafe_unretained NSString *componentName;
78
+ __unsafe_unretained NSString *componentType;
79
+ } ComponentWillAppear;
80
+ /// `ANN.DeepLinkDispatched` (iOS).
81
+ struct {
82
+ __unsafe_unretained NSString *event;
83
+ __unsafe_unretained NSString *url;
84
+ } DeepLinkDispatched;
85
+ /// `ANN.HingeChanged`.
86
+ struct {
87
+ __unsafe_unretained NSString *event;
88
+ /// Optional.
89
+ __unsafe_unretained NSString *state;
90
+ /// Optional.
91
+ __unsafe_unretained NSString *angle;
92
+ } HingeChanged;
93
+ /// `ANN.KeyCommandPressed` (iOS).
94
+ struct {
95
+ __unsafe_unretained NSString *event;
96
+ __unsafe_unretained NSString *componentId;
97
+ __unsafe_unretained NSString *keyCommandId;
98
+ } KeyCommandPressed;
99
+ /// `ANN.ModalAttemptedToDismiss`.
100
+ struct {
101
+ __unsafe_unretained NSString *event;
102
+ __unsafe_unretained NSString *componentId;
103
+ } ModalAttemptedToDismiss;
104
+ /// `ANN.ModalDismissed`.
105
+ struct {
106
+ __unsafe_unretained NSString *event;
107
+ __unsafe_unretained NSString *componentId;
108
+ __unsafe_unretained NSString *componentName;
109
+ __unsafe_unretained NSString *modalsDismissed;
110
+ } ModalDismissed;
111
+ /// `ANN.NativeScreenCall`.
112
+ struct {
113
+ __unsafe_unretained NSString *event;
114
+ __unsafe_unretained NSString *componentId;
115
+ __unsafe_unretained NSString *callId;
116
+ __unsafe_unretained NSString *kind;
117
+ __unsafe_unretained NSString *name;
118
+ __unsafe_unretained NSString *args;
119
+ } NativeScreenCall;
120
+ /// `ANN.NativeScreenReleased`.
121
+ struct {
122
+ __unsafe_unretained NSString *event;
123
+ __unsafe_unretained NSString *componentId;
124
+ } NativeScreenReleased;
125
+ /// `ANN.NavigationButtonPressed`.
126
+ struct {
127
+ __unsafe_unretained NSString *event;
128
+ __unsafe_unretained NSString *componentId;
129
+ __unsafe_unretained NSString *buttonId;
130
+ /// Optional, iOS only.
131
+ __unsafe_unretained NSString *selected;
132
+ } NavigationButtonPressed;
133
+ /// `ANN.NavigationStateChanged`.
134
+ struct {
135
+ __unsafe_unretained NSString *event;
136
+ __unsafe_unretained NSString *screen;
137
+ __unsafe_unretained NSString *tab;
138
+ } NavigationStateChanged;
139
+ /// The object of `ANN.NavigationStateChanged.screen`.
140
+ struct {
141
+ __unsafe_unretained NSString *id;
142
+ __unsafe_unretained NSString *name;
143
+ } NavigationStateChangedScreen;
144
+ /// `ANN.PreviewCompleted` (iOS).
145
+ struct {
146
+ __unsafe_unretained NSString *event;
147
+ __unsafe_unretained NSString *componentId;
148
+ __unsafe_unretained NSString *previewComponentId;
149
+ } PreviewCompleted;
150
+ /// `ANN.ScreenInsetsChanged`.
151
+ struct {
152
+ __unsafe_unretained NSString *event;
153
+ __unsafe_unretained NSString *componentId;
154
+ __unsafe_unretained NSString *top;
155
+ __unsafe_unretained NSString *right;
156
+ __unsafe_unretained NSString *bottom;
157
+ __unsafe_unretained NSString *left;
158
+ } ScreenInsetsChanged;
159
+ /// `ANN.ScreenPopped`.
160
+ struct {
161
+ __unsafe_unretained NSString *event;
162
+ __unsafe_unretained NSString *componentId;
163
+ } ScreenPopped;
164
+ /// The object of `ANN.ScreenRegionsChanged.division`.
165
+ struct {
166
+ __unsafe_unretained NSString *x;
167
+ __unsafe_unretained NSString *y;
168
+ __unsafe_unretained NSString *width;
169
+ __unsafe_unretained NSString *height;
170
+ } ScreenRegionRect;
171
+ /// `ANN.ScreenRegionsChanged`.
172
+ struct {
173
+ __unsafe_unretained NSString *event;
174
+ __unsafe_unretained NSString *componentId;
175
+ __unsafe_unretained NSString *division;
176
+ __unsafe_unretained NSString *occlusion;
177
+ } ScreenRegionsChanged;
178
+ /// `ANN.SearchBarCancelPressed`.
179
+ struct {
180
+ __unsafe_unretained NSString *event;
181
+ __unsafe_unretained NSString *componentId;
182
+ } SearchBarCancelPressed;
183
+ /// `ANN.SearchBarSubmitted`.
184
+ struct {
185
+ __unsafe_unretained NSString *event;
186
+ __unsafe_unretained NSString *componentId;
187
+ __unsafe_unretained NSString *text;
188
+ /// Optional.
189
+ __unsafe_unretained NSString *scope;
190
+ /// Optional, iOS only.
191
+ __unsafe_unretained NSString *tokens;
192
+ } SearchBarSubmitted;
193
+ /// `ANN.SearchBarUpdated`.
194
+ struct {
195
+ __unsafe_unretained NSString *event;
196
+ __unsafe_unretained NSString *componentId;
197
+ __unsafe_unretained NSString *text;
198
+ __unsafe_unretained NSString *isFocused;
199
+ /// Optional.
200
+ __unsafe_unretained NSString *scope;
201
+ /// Optional, iOS only.
202
+ __unsafe_unretained NSString *tokens;
203
+ } SearchBarUpdated;
204
+ /// `ANN.SearchSuggestionPicked`.
205
+ struct {
206
+ __unsafe_unretained NSString *event;
207
+ __unsafe_unretained NSString *componentId;
208
+ __unsafe_unretained NSString *suggestionId;
209
+ } SearchSuggestionPicked;
210
+ /// `ANN.SheetDetentChanged`.
211
+ struct {
212
+ __unsafe_unretained NSString *event;
213
+ __unsafe_unretained NSString *componentId;
214
+ __unsafe_unretained NSString *detent;
215
+ } SheetDetentChanged;
216
+ /// `ANN.SlotDestroyed`.
217
+ struct {
218
+ __unsafe_unretained NSString *event;
219
+ __unsafe_unretained NSString *componentId;
220
+ } SlotDestroyed;
221
+ /// `ANN.SplitViewColumnsStacked`.
222
+ struct {
223
+ __unsafe_unretained NSString *event;
224
+ __unsafe_unretained NSString *componentId;
225
+ __unsafe_unretained NSString *stacked;
226
+ } SplitViewColumnsStacked;
227
+ /// `ANN.SplitViewDisplayModeChanged` (iOS).
228
+ struct {
229
+ __unsafe_unretained NSString *event;
230
+ __unsafe_unretained NSString *componentId;
231
+ __unsafe_unretained NSString *displayMode;
232
+ /// Optional.
233
+ __unsafe_unretained NSString *inspectorVisible;
234
+ } SplitViewDisplayModeChanged;
235
+ /// `ANN.TitleRenamed` (iOS).
236
+ struct {
237
+ __unsafe_unretained NSString *event;
238
+ __unsafe_unretained NSString *componentId;
239
+ __unsafe_unretained NSString *text;
240
+ } TitleRenamed;
241
+ } ANNEventContract;
242
+
243
+ /// The name of every event, `ANN.<Name>`.
244
+ FOUNDATION_EXPORT NSArray<NSString *> *ANNEventContractNames(void);
245
+
246
+ NS_ASSUME_NONNULL_END