@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
@@ -2,17 +2,21 @@
2
2
  #import "ANNBackButtonPresenter.h"
3
3
  #import "ANNBarAppearance.h"
4
4
  #import "ANNComponentPresenter.h"
5
+ #import "ANNComponentViewController.h"
5
6
  #import "ANNExternalViewController.h"
6
7
  #import "ANNLargeTitlePresenter.h"
7
8
  #import "ANNMainList.h"
8
9
  #import "ANNScreenBars.h"
9
10
  #import "ANNScrollEdgeEffects.h"
10
11
  #import "ANNSearchPresenter.h"
12
+ #import "ANNSlotScreenView.h"
11
13
  #import "ANNStackController.h"
14
+ #import "ANNTabsDesign.h"
12
15
  #import "ANNTitleComponentView.h"
13
16
  #import "ANNTitleGlassView.h"
14
17
  #import "ANNTitleView.h"
15
18
  #import "ANNToolbarPresenter.h"
19
+ #import "ANNUserChoice.h"
16
20
  #import "UIViewController+LayoutProtocol.h"
17
21
 
18
22
  // The key of the bar's handler on the screen's content mounts.
@@ -32,11 +36,27 @@ typedef NS_ENUM(NSInteger, ANNBarPhase) {
32
36
  ANNBarPhaseDidAppear,
33
37
  };
34
38
 
35
- static BOOL ANNIsIOS26(void) {
36
- if (@available(iOS 26.0, *)) {
37
- return YES;
39
+ // The glass design of iOS 26, not its compatibility mode: the large title in the list, the title's capsule, the
40
+ // system subtitle and the pin of the title's color are its own (`ANNTabsDesign`).
41
+ static BOOL ANNIsGlass(void) {
42
+ return ANNTabsDesign.isGlass;
43
+ }
44
+
45
+ // The same look: the item's appearance is the one set last, or one equal to it.
46
+ static BOOL ANNSameAppearance(UINavigationBarAppearance *a, UINavigationBarAppearance *b) {
47
+ return a == b || [a isEqual:b];
48
+ }
49
+
50
+ // The traits a look's colors and fonts resolve with: the style, the contrast, the elevation (the 1×1 background is
51
+ // drawn with them) and the text size.
52
+ static NSArray *ANNLookTraitsOf(UITraitCollection *traits) {
53
+ if (!traits) {
54
+ return @[];
38
55
  }
39
- return NO;
56
+ return @[
57
+ @(traits.userInterfaceStyle), @(traits.accessibilityContrast), @(traits.userInterfaceLevel),
58
+ traits.preferredContentSizeCategory ?: @""
59
+ ];
40
60
  }
41
61
 
42
62
  static BOOL ANNHasComponentName(ANNComponentOptions *component) {
@@ -59,6 +79,30 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
59
79
  return kept;
60
80
  }
61
81
 
82
+ static NSString *const ANNRenameChoiceKey = @"topBar.title.text";
83
+
84
+ // The title the user gave: it stays over the app's `title.text` until a merge gives another text than the app had
85
+ // there (the own options', else the title the screen resolved to before the merge, as the other choices); a re-render
86
+ // that sends the old title again keeps it.
87
+ static ANNUserChoice *ANNRenameChoice(NSString *title) {
88
+ return [ANNUserChoice choiceWithValue:title
89
+ apply:^(ANNNavigationOptions *options, id value) {
90
+ options.topBar.title.text = [Text withValue:value];
91
+ }
92
+ merged:^id(id value, ANNNavigationOptions *merge, ANNNavigationOptions *own,
93
+ ANNNavigationOptions *before, ANNNavigationOptions *after) {
94
+ Text *text = merge.topBar.title.text;
95
+ if (!text.hasValue) {
96
+ return value;
97
+ }
98
+ Text *ownText = own.topBar.title.text;
99
+ Text *was = ownText.hasValue ? ownText : before.topBar.title.text;
100
+ NSString *merged = [text withDefault:nil];
101
+ NSString *had = [was withDefault:nil];
102
+ return merged == had || [merged isEqualToString:had] ? value : nil;
103
+ }];
104
+ }
105
+
62
106
  @interface ANNTopBarPresenter () <UINavigationItemRenameDelegate>
63
107
  @end
64
108
 
@@ -84,6 +128,10 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
84
128
  NSUInteger _pinToken;
85
129
  // A pop's band under the title keeps the bar's look as it is (the screen leaves for one without a band of its own).
86
130
  BOOL _bandKeepsLook;
131
+ // What the last look was filled from, and the two appearances the item held right after it.
132
+ NSArray *_lookInputs;
133
+ UINavigationBarAppearance *_lookStandard;
134
+ UINavigationBarAppearance *_lookEdge;
87
135
  }
88
136
 
89
137
  - (instancetype)initWithScreen:(UIViewController *)screen {
@@ -151,13 +199,13 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
151
199
  BOOL collapses = [ANNLargeTitlePresenter collapsesIntoList:options];
152
200
  BOOL inlineInRow = [self inlineInRow:options];
153
201
  BOOL ownEdge = [options.topBar.scrollEdgeAppearance.active withDefault:NO];
154
- context.transparentEdge = ANNIsIOS26() && collapses && !inlineInRow && !ownEdge;
202
+ context.transparentEdge = ANNIsGlass() && collapses && !inlineInRow && !ownEdge;
155
203
  // While a pop draws the band behind the title in the title's own place, the bar's edge stays clear: UIKit grows
156
204
  // the bar's background with an interactive pop, over the screen's top where the title is.
157
205
  if ([_largeTitle drawsTitleBand] && !_bandKeepsLook && !ownEdge) {
158
206
  context.transparentEdge = YES;
159
207
  }
160
- context.largeTitleNeedsBackground = ANNIsIOS26() && canShow && !collapses && !inlineInRow;
208
+ context.largeTitleNeedsBackground = ANNIsGlass() && canShow && !collapses && !inlineInRow;
161
209
  return context;
162
210
  }
163
211
 
@@ -341,26 +389,64 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
341
389
 
342
390
  #pragma mark - The look
343
391
 
392
+ // Several callers ask for the look along one appearance (the screen's, a merge, the band and the pin of iOS 26): it
393
+ // is filled only when what the fill reads changed or the item holds another look, and set only when it differs from
394
+ // the item's. A look set again makes UIKit lay the bar out anew, and on iOS 26 copy it into the stack's bar.
344
395
  - (void)applyLook:(ANNNavigationOptions *)options {
345
396
  UIViewController *screen = _screen;
346
397
  UINavigationItem *item = screen.navigationItem;
398
+ UITraitCollection *traits =
399
+ screen.viewIfLoaded.window.traitCollection ?: screen.traitCollection;
400
+ ANNBarAppearanceContext context = [self appearanceContextOf:options];
401
+ UITraitCollection *pinned = ANNIsGlass() ? _pinnedTraits : nil;
402
+ NSArray *inputs = [self lookInputsOf:options context:context traits:traits pinned:pinned];
403
+ if (_lookInputs && ANNOptionValuesSame(_lookInputs, inputs) &&
404
+ ANNSameAppearance(item.standardAppearance, _lookStandard) &&
405
+ ANNSameAppearance(item.scrollEdgeAppearance, _lookEdge)) {
406
+ return;
407
+ }
347
408
  // The screen's own looks, filled whole and set again (the item copies them).
348
409
  UINavigationBarAppearance *standard =
349
410
  [item.standardAppearance copy] ?: [UINavigationBarAppearance new];
350
411
  UINavigationBarAppearance *edge =
351
412
  [item.scrollEdgeAppearance copy] ?: [UINavigationBarAppearance new];
352
- UITraitCollection *traits =
353
- screen.viewIfLoaded.window.traitCollection ?: screen.traitCollection;
354
413
  [ANNBarAppearance fillStandard:standard
355
414
  scrollEdge:edge
356
415
  withOptions:options
357
- context:[self appearanceContextOf:options]
416
+ context:context
358
417
  traits:traits];
359
- if (_pinnedTraits && ANNIsIOS26()) {
360
- [self pinTitleColorsOf:standard edge:edge options:options traits:_pinnedTraits];
418
+ if (pinned) {
419
+ [self pinTitleColorsOf:standard edge:edge options:options traits:pinned];
420
+ }
421
+ if (!ANNSameAppearance(item.standardAppearance, standard)) {
422
+ item.standardAppearance = standard;
361
423
  }
362
- item.standardAppearance = standard;
363
- item.scrollEdgeAppearance = edge;
424
+ if (!ANNSameAppearance(item.scrollEdgeAppearance, edge)) {
425
+ item.scrollEdgeAppearance = edge;
426
+ }
427
+ _lookInputs = inputs;
428
+ _lookStandard = item.standardAppearance;
429
+ _lookEdge = item.scrollEdgeAppearance;
430
+ }
431
+
432
+ // What `fillStandard:scrollEdge:withOptions:context:traits:` and the pin read: the bar's options by value, the
433
+ // image the back button's icon loads (a file written again at its path is another image), the context, the traits.
434
+ - (NSArray *)lookInputsOf:(ANNNavigationOptions *)options
435
+ context:(ANNBarAppearanceContext)context
436
+ traits:(UITraitCollection *)traits
437
+ pinned:(nullable UITraitCollection *)pinned {
438
+ ANNTopBarOptions *topBar = options.topBar;
439
+ Image *backIcon = topBar.backButton.icon;
440
+ ANNImageSource *source = backIcon.source;
441
+ BOOL loads = backIcon.hasValue && !(source && source.kind == ANNImageSourceKindSymbol);
442
+ id backImage = loads ? [backIcon withDefault:nil] : nil;
443
+ return @[
444
+ topBar.background, topBar.scrollEdgeAppearance, topBar.noBorder, topBar.borderColor,
445
+ topBar.title.font, topBar.title.color, topBar.largeTitle.font, topBar.largeTitle.color,
446
+ topBar.backButton, backImage ?: NSNull.null, @(context.transparentEdge),
447
+ @(context.largeTitleNeedsBackground), ANNLookTraitsOf(traits),
448
+ pinned ? ANNLookTraitsOf(pinned) : NSNull.null
449
+ ];
364
450
  }
365
451
 
366
452
  // The title colors resolved for `traits`: fixed colors that don't follow the glass's style.
@@ -388,7 +474,7 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
388
474
  - (void)pinTitleColorAlong:(id<UIViewControllerTransitionCoordinator>)coordinator
389
475
  traits:(UITraitCollection *)traits {
390
476
  UIViewController *screen = _screen;
391
- if (!screen || !ANNIsIOS26()) {
477
+ if (!screen || !ANNIsGlass()) {
392
478
  return;
393
479
  }
394
480
  NSUInteger token = ++_pinToken;
@@ -435,7 +521,7 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
435
521
  NSString *glass = [title.glass withDefault:nil];
436
522
  BOOL glassShows = NO;
437
523
  if (@available(iOS 26.0, *)) {
438
- glassShows = [ANNTitleGlassView isGlass:glass];
524
+ glassShows = ANNIsGlass() && [ANNTitleGlassView isGlass:glass];
439
525
  }
440
526
  [self applySubtitle:options glass:glassShows];
441
527
 
@@ -471,7 +557,7 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
471
557
  }
472
558
  } else if (_titleComponent) {
473
559
  titleView = _titleComponent;
474
- } else if (!ANNIsIOS26() && subtitle.length > 0 && !ANNLargeTitleCanShow(options)) {
560
+ } else if (!ANNIsGlass() && subtitle.length > 0 && !ANNLargeTitleCanShow(options)) {
475
561
  // Before iOS 26 a subtitle is a two-label title, without a large title that can show.
476
562
  titleView = [[ANNTitleView alloc] initWithOptions:options];
477
563
  }
@@ -495,8 +581,11 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
495
581
  // The layers of the title: the screen's own text hides a component of its stack or of the defaults; a component in the
496
582
  // screen's own options shows over its own text.
497
583
  - (BOOL)ownTextHidesComponent {
498
- ANNTopBarTitleOptions *own = _screen.options.topBar.title;
499
- return own.text.hasValue && !own.text.isNull && !ANNHasComponentName(own.component);
584
+ UIViewController *screen = _screen;
585
+ ANNTopBarTitleOptions *own = screen.options.topBar.title;
586
+ BOOL ownText = (own.text.hasValue && !own.text.isNull) ||
587
+ [screen userChoiceForKey:ANNRenameChoiceKey] != nil;
588
+ return ownText && !ANNHasComponentName(own.component);
500
589
  }
501
590
 
502
591
  // iOS 26: the system subtitle under the title and under the large title, with only the attributes given (a color, or
@@ -509,7 +598,8 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
509
598
  if (_native && !subtitle.text.hasValue) {
510
599
  return;
511
600
  }
512
- if (text.length == 0) {
601
+ // The compatibility mode draws no system subtitle: a two-label title shows it, as before iOS 26.
602
+ if (text.length == 0 || !ANNIsGlass()) {
513
603
  item.attributedSubtitle = nil;
514
604
  item.largeAttributedSubtitle = nil;
515
605
  return;
@@ -561,7 +651,7 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
561
651
  return NO;
562
652
  }
563
653
  CGFloat height = ANNTitleRowHeight;
564
- if (!ANNIsIOS26()) {
654
+ if (!ANNIsGlass()) {
565
655
  if (_screen.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
566
656
  height = ANNTitleRowHeightPad;
567
657
  }
@@ -644,11 +734,12 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
644
734
  __weak ANNBarButtons *buttons = _buttons;
645
735
  UIMenu *menu = [title.menu menuWithPickHandler:^(NSString *itemId) {
646
736
  [buttons menuItemPicked:itemId
647
- menuOf:^ANNMenuOptions *(ANNNavigationOptions *resolved) {
648
- return resolved.topBar.title.menu;
737
+ choiceKey:@"topBar.title.menu"
738
+ menuOf:^ANNMenuOptions *(ANNNavigationOptions *options) {
739
+ return options.topBar.title.menu;
649
740
  }
650
- setMenu:^(ANNNavigationOptions *own, ANNMenuOptions *copy) {
651
- own.topBar.title.menu = copy;
741
+ setMenu:^(ANNNavigationOptions *options, ANNMenuOptions *copy) {
742
+ options.topBar.title.menu = copy;
652
743
  }];
653
744
  }];
654
745
  menuTitle = menu.title;
@@ -659,8 +750,8 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
659
750
 
660
751
  #pragma mark - UINavigationItemRenameDelegate
661
752
 
662
- // Empty or blank: the old title back, no event; the same: nothing; new: the screen's own `title.text`, the title drawn
663
- // again, then `ANN.TitleRenamed`.
753
+ // Empty or blank: the old title back, no event; the same: nothing; new: `title.text` in the screen's user layer, the
754
+ // title drawn again, then `ANN.TitleRenamed`.
664
755
  - (void)navigationItem:(UINavigationItem *)navigationItem
665
756
  didEndRenamingWithTitle:(NSString *)title {
666
757
  UIViewController *screen = _screen;
@@ -677,9 +768,7 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
677
768
  if ([title isEqualToString:old]) {
678
769
  return;
679
770
  }
680
- [screen changeOwnOptions:^(ANNNavigationOptions *own) {
681
- own.topBar.title.text = [Text withValue:title];
682
- }];
771
+ [screen setUserChoice:ANNRenameChoice(title) forKey:ANNRenameChoiceKey];
683
772
  ANNNavigationOptions *options = [screen resolveOptionsWithDefault];
684
773
  [self applyTitle:options textWins:NO];
685
774
  NSString *componentId = screen.layoutInfo.componentId;
@@ -1001,8 +1090,10 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
1001
1090
  ANNNavigationOptions *options = [screen resolveOptionsWithDefault];
1002
1091
  [_largeTitle screenDidDisappear:options list:[self followedList]];
1003
1092
  }
1004
- // The lists the screen set leave with it; its color and its React background leave the main list.
1005
- [self releaseLists];
1093
+ // The lists the screen set leave with it (the edge effects stay known for its next appearance); its color and its
1094
+ // React background leave the main list.
1095
+ [_edgeEffects screenDidDisappear];
1096
+ [self releaseListsKeepingEdgeEffects:YES];
1006
1097
  _bandKeepsLook = NO;
1007
1098
  // A swipe back given up: the screen keeps the bar's own look for its next appearance.
1008
1099
  if (band && screen) {
@@ -1011,7 +1102,13 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
1011
1102
  }
1012
1103
 
1013
1104
  - (void)releaseLists {
1014
- [_edgeEffects reset];
1105
+ [self releaseListsKeepingEdgeEffects:NO];
1106
+ }
1107
+
1108
+ - (void)releaseListsKeepingEdgeEffects:(BOOL)keepEdgeEffects {
1109
+ if (!keepEdgeEffects) {
1110
+ [_edgeEffects reset];
1111
+ }
1015
1112
  [_largeTitle removeListFill];
1016
1113
  [_largeTitle removeTitlePlaceFill];
1017
1114
  [_largeTitle removeTitleHost];
@@ -1056,6 +1153,10 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
1056
1153
  [weakSelf contentDidMount];
1057
1154
  }
1058
1155
  forKey:ANNTopBarMountKey];
1156
+ // The edge effect walks the screen again only after a mount. A native screen's views are the app's, never told; a
1157
+ // screen of one tree (`appProvider`) hears the mounts only in the window, so it walks at each appearance.
1158
+ [self edgeEffects].mountsReported =
1159
+ !_native && ![content isKindOfClass:ANNSlotScreenView.class];
1059
1160
  }
1060
1161
 
1061
1162
  // The list the bar follows at the top edge under a large title that folds into it: the main list of a React screen;
@@ -1101,6 +1202,27 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
1101
1202
  options:[screen resolveOptionsWithDefault]];
1102
1203
  }
1103
1204
 
1205
+ // The top of the safe area the screen takes on the stack is that of its place while it waited parked: UIKit lays it out
1206
+ // only inside the push.
1207
+ - (void)arrivesByPushOn:(UINavigationController *)navigation {
1208
+ UIViewController *screen = _screen;
1209
+ if (_native || ![screen isKindOfClass:ANNComponentViewController.class]) {
1210
+ return;
1211
+ }
1212
+ ANNComponentViewController *component = (ANNComponentViewController *)screen;
1213
+ ANNScreenPlace * (^placeWhileParked)(void) = component.placeWhileParked;
1214
+ ANNScreenPlace *place = placeWhileParked ? placeWhileParked() : nil;
1215
+ if (!place || !component.reactView.isReady) {
1216
+ return;
1217
+ }
1218
+ ANNNavigationOptions *options = [screen resolveOptionsWithDefault];
1219
+ [_largeTitle screenInPush:options
1220
+ list:[self followedList]
1221
+ inlineInRow:[self inlineInRow:options]
1222
+ top:place.safeArea.top
1223
+ stackTop:navigation.view.safeAreaInsets.top];
1224
+ }
1225
+
1104
1226
  // A native screen's views are the app's: the core lays nothing into them. The band behind the title is filled where
1105
1227
  // the title is, and the look follows it, before UIKit lays the screen out for the transition.
1106
1228
  - (BOOL)revealedByPop {
@@ -1175,7 +1297,7 @@ static NSArray<UIMenuElement *> *ANNRenameElementsOf(NSArray<UIMenuElement *> *e
1175
1297
  return;
1176
1298
  }
1177
1299
  ANNNavigationOptions *options = [screen resolveOptionsWithDefault];
1178
- BOOL eligible = ANNIsIOS26() && [self isShownTop] && screen.viewIfLoaded.window != nil &&
1300
+ BOOL eligible = ANNIsGlass() && [self isShownTop] && screen.viewIfLoaded.window != nil &&
1179
1301
  [background isShownInBar:bar] &&
1180
1302
  [ANNLargeTitlePresenter collapsesIntoList:options] &&
1181
1303
  ![self inlineInRow:options];
@@ -1,5 +1,6 @@
1
1
  #import "ANNTurboEventEmitter.h"
2
2
  #import "ANNAssert.h"
3
+ #import "ANNEventContract.h"
3
4
  #import "ANNEventEmitter.h"
4
5
  #import "ANNReloadCoordinator.h"
5
6
  #import <React/RCTUtils.h>
@@ -40,41 +41,9 @@ RCT_EXPORT_MODULE(ANNTurboEventEmitter)
40
41
  return self;
41
42
  }
42
43
 
43
- // Every event of the navigation and of the modules.
44
+ // Every event of the navigation and of the modules, as the types of `src/interfaces/` name them.
44
45
  - (NSArray<NSString *> *)supportedEvents {
45
- return @[
46
- @"ANN.AppLaunched",
47
- @"ANN.ArrangementChanged",
48
- @"ANN.BottomAccessoryPlacementChanged",
49
- @"ANN.BottomTabLongPressed",
50
- @"ANN.BottomTabPressed",
51
- @"ANN.BottomTabSelected",
52
- @"ANN.CommandCompleted",
53
- @"ANN.ComponentDidAppear",
54
- @"ANN.ComponentDidDisappear",
55
- @"ANN.ComponentWillAppear",
56
- @"ANN.HingeChanged",
57
- @"ANN.KeyCommandPressed",
58
- @"ANN.ModalAttemptedToDismiss",
59
- @"ANN.ModalDismissed",
60
- @"ANN.NativeScreenCall",
61
- @"ANN.NativeScreenReleased",
62
- @"ANN.NavigationButtonPressed",
63
- @"ANN.NavigationStateChanged",
64
- @"ANN.PreviewCompleted",
65
- @"ANN.ScreenInsetsChanged",
66
- @"ANN.ScreenPopped",
67
- @"ANN.ScreenRegionsChanged",
68
- @"ANN.SearchBarCancelPressed",
69
- @"ANN.SearchBarSubmitted",
70
- @"ANN.SearchBarUpdated",
71
- @"ANN.SearchSuggestionPicked",
72
- @"ANN.SheetDetentChanged",
73
- @"ANN.SlotDestroyed",
74
- @"ANN.SplitViewColumnsStacked",
75
- @"ANN.SplitViewDisplayModeChanged",
76
- @"ANN.TitleRenamed",
77
- ];
46
+ return ANNEventContractNames();
78
47
  }
79
48
 
80
49
  #pragma mark - Listeners
@@ -99,7 +68,7 @@ RCT_EXPORT_MODULE(ANNTurboEventEmitter)
99
68
 
100
69
  - (void)addListener:(NSString *)eventName {
101
70
  [super addListener:eventName];
102
- if ([eventName isEqualToString:@"ANN.AppLaunched"] && !_listensToAppLaunched) {
71
+ if ([eventName isEqualToString:ANNEventContract.AppLaunched.event] && !_listensToAppLaunched) {
103
72
  _listensToAppLaunched = YES;
104
73
  [ANNEventEmitter eventEmitterListensToAppLaunched:self];
105
74
  }