@apexnative/navigation 0.0.0-stage → 1.0.0-alpha.1

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 (1373) hide show
  1. package/ApexNavigation.podspec +42 -0
  2. package/CHANGELOG.md +8 -0
  3. package/LICENSE +21 -0
  4. package/README.md +76 -2
  5. package/android/CLAUDE.md +183 -0
  6. package/android/CORE.md +219 -0
  7. package/android/MATERIAL_SYMBOLS_LICENSE.txt +205 -0
  8. package/android/RECIPES.md +39 -0
  9. package/android/build.gradle +108 -0
  10. package/android/consumer-rules.pro +2 -0
  11. package/android/src/main/AndroidManifest.xml +9 -0
  12. package/android/src/main/java/dev/apexnative/navigation/EdgeToEdgeDecision.kt +25 -0
  13. package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +339 -0
  14. package/android/src/main/java/dev/apexnative/navigation/NavigationApplication.kt +90 -0
  15. package/android/src/main/java/dev/apexnative/navigation/NavigationPackage.kt +37 -0
  16. package/android/src/main/java/dev/apexnative/navigation/customrow/BottomTabsCustomRowOptions.kt +85 -0
  17. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutChecks.kt +51 -0
  18. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutException.kt +7 -0
  19. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutNode.kt +118 -0
  20. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutReader.kt +274 -0
  21. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutType.kt +35 -0
  22. package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenCalls.kt +61 -0
  23. package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenContext.kt +84 -0
  24. package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenCreator.kt +17 -0
  25. package/android/src/main/java/dev/apexnative/navigation/options/AnimationsOptions.kt +54 -0
  26. package/android/src/main/java/dev/apexnative/navigation/options/BottomTabOptions.kt +238 -0
  27. package/android/src/main/java/dev/apexnative/navigation/options/BottomTabsOptions.kt +244 -0
  28. package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +70 -0
  29. package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +296 -0
  30. package/android/src/main/java/dev/apexnative/navigation/options/ComponentOptions.kt +141 -0
  31. package/android/src/main/java/dev/apexnative/navigation/options/DefaultOptions.kt +21 -0
  32. package/android/src/main/java/dev/apexnative/navigation/options/FabOptions.kt +97 -0
  33. package/android/src/main/java/dev/apexnative/navigation/options/FontOptions.kt +47 -0
  34. package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +49 -0
  35. package/android/src/main/java/dev/apexnative/navigation/options/InterpolationOptions.kt +203 -0
  36. package/android/src/main/java/dev/apexnative/navigation/options/KeyCommandOptions.kt +49 -0
  37. package/android/src/main/java/dev/apexnative/navigation/options/LargeTitleOptions.kt +78 -0
  38. package/android/src/main/java/dev/apexnative/navigation/options/LayoutAnimation.kt +157 -0
  39. package/android/src/main/java/dev/apexnative/navigation/options/LayoutOptions.kt +94 -0
  40. package/android/src/main/java/dev/apexnative/navigation/options/ModalOptions.kt +87 -0
  41. package/android/src/main/java/dev/apexnative/navigation/options/ModalPlacementOptions.kt +90 -0
  42. package/android/src/main/java/dev/apexnative/navigation/options/NavigationBarOptions.kt +44 -0
  43. package/android/src/main/java/dev/apexnative/navigation/options/Options.kt +167 -0
  44. package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +21 -0
  45. package/android/src/main/java/dev/apexnative/navigation/options/OptionsReader.kt +133 -0
  46. package/android/src/main/java/dev/apexnative/navigation/options/PreviewOptions.kt +97 -0
  47. package/android/src/main/java/dev/apexnative/navigation/options/ReadableMaps.kt +70 -0
  48. package/android/src/main/java/dev/apexnative/navigation/options/ScrollEdgeEffectOptions.kt +98 -0
  49. package/android/src/main/java/dev/apexnative/navigation/options/SearchBarOptions.kt +151 -0
  50. package/android/src/main/java/dev/apexnative/navigation/options/SharedElementTransitionOptions.kt +57 -0
  51. package/android/src/main/java/dev/apexnative/navigation/options/SheetOptions.kt +108 -0
  52. package/android/src/main/java/dev/apexnative/navigation/options/SideMenuOptions.kt +130 -0
  53. package/android/src/main/java/dev/apexnative/navigation/options/SplitViewGroupOptions.kt +190 -0
  54. package/android/src/main/java/dev/apexnative/navigation/options/SplitViewOptions.kt +28 -0
  55. package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +270 -0
  56. package/android/src/main/java/dev/apexnative/navigation/options/StatusBarOptions.kt +75 -0
  57. package/android/src/main/java/dev/apexnative/navigation/options/TitleOptions.kt +167 -0
  58. package/android/src/main/java/dev/apexnative/navigation/options/ToolbarOptions.kt +60 -0
  59. package/android/src/main/java/dev/apexnative/navigation/options/TopBarAppearanceOptions.kt +223 -0
  60. package/android/src/main/java/dev/apexnative/navigation/options/TopBarOptions.kt +381 -0
  61. package/android/src/main/java/dev/apexnative/navigation/options/ViewAnimationOptions.kt +225 -0
  62. package/android/src/main/java/dev/apexnative/navigation/options/WindowOptions.kt +36 -0
  63. package/android/src/main/java/dev/apexnative/navigation/options/params/Bool.kt +23 -0
  64. package/android/src/main/java/dev/apexnative/navigation/options/params/Fraction.kt +12 -0
  65. package/android/src/main/java/dev/apexnative/navigation/options/params/LayoutDirection.kt +26 -0
  66. package/android/src/main/java/dev/apexnative/navigation/options/params/Param.kt +24 -0
  67. package/android/src/main/java/dev/apexnative/navigation/options/params/Text.kt +24 -0
  68. package/android/src/main/java/dev/apexnative/navigation/options/params/ThemeColour.kt +259 -0
  69. package/android/src/main/java/dev/apexnative/navigation/options/params/Variant.kt +36 -0
  70. package/android/src/main/java/dev/apexnative/navigation/options/parsers/BoolParser.kt +15 -0
  71. package/android/src/main/java/dev/apexnative/navigation/options/parsers/FontParser.kt +28 -0
  72. package/android/src/main/java/dev/apexnative/navigation/options/parsers/FractionParser.kt +24 -0
  73. package/android/src/main/java/dev/apexnative/navigation/options/parsers/IconParser.kt +48 -0
  74. package/android/src/main/java/dev/apexnative/navigation/options/parsers/StringListParser.kt +27 -0
  75. package/android/src/main/java/dev/apexnative/navigation/options/parsers/TextParser.kt +32 -0
  76. package/android/src/main/java/dev/apexnative/navigation/options/parsers/TypefaceLoader.kt +42 -0
  77. package/android/src/main/java/dev/apexnative/navigation/options/parsers/VariantParser.kt +34 -0
  78. package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +41 -0
  79. package/android/src/main/java/dev/apexnative/navigation/react/CommandAnswer.kt +111 -0
  80. package/android/src/main/java/dev/apexnative/navigation/react/CommandListener.kt +27 -0
  81. package/android/src/main/java/dev/apexnative/navigation/react/CommandRunner.kt +131 -0
  82. package/android/src/main/java/dev/apexnative/navigation/react/DeveloperReload.kt +69 -0
  83. package/android/src/main/java/dev/apexnative/navigation/react/ErrorTexts.kt +123 -0
  84. package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +154 -0
  85. package/android/src/main/java/dev/apexnative/navigation/react/LaunchLink.kt +37 -0
  86. package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +311 -0
  87. package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +89 -0
  88. package/android/src/main/java/dev/apexnative/navigation/react/ReactGateway.kt +67 -0
  89. package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +197 -0
  90. package/android/src/main/java/dev/apexnative/navigation/react/ReadableJson.kt +60 -0
  91. package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +130 -0
  92. package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +69 -0
  93. package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +87 -0
  94. package/android/src/main/java/dev/apexnative/navigation/react/ScrollEvents.kt +160 -0
  95. package/android/src/main/java/dev/apexnative/navigation/react/StartInfo.kt +44 -0
  96. package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +507 -0
  97. package/android/src/main/java/dev/apexnative/navigation/react/events/ComponentType.kt +13 -0
  98. package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +199 -0
  99. package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +62 -0
  100. package/android/src/main/java/dev/apexnative/navigation/react/events/ScreenAppearance.kt +87 -0
  101. package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +62 -0
  102. package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaReadyEvent.kt +16 -0
  103. package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +140 -0
  104. package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaViewManager.kt +45 -0
  105. package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +44 -0
  106. package/android/src/main/java/dev/apexnative/navigation/slots/SlotHost.kt +91 -0
  107. package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +158 -0
  108. package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +141 -0
  109. package/android/src/main/java/dev/apexnative/navigation/slots/SlotViewManager.kt +50 -0
  110. package/android/src/main/java/dev/apexnative/navigation/splash/SplashHold.kt +67 -0
  111. package/android/src/main/java/dev/apexnative/navigation/splash/SplashTheme.kt +81 -0
  112. package/android/src/main/java/dev/apexnative/navigation/splash/SplashView.kt +77 -0
  113. package/android/src/main/java/dev/apexnative/navigation/system/AppDirection.kt +92 -0
  114. package/android/src/main/java/dev/apexnative/navigation/system/SystemUiLayers.kt +126 -0
  115. package/android/src/main/java/dev/apexnative/navigation/system/SystemUiOwner.kt +229 -0
  116. package/android/src/main/java/dev/apexnative/navigation/system/SystemUiRules.kt +302 -0
  117. package/android/src/main/java/dev/apexnative/navigation/system/SystemUiState.kt +58 -0
  118. package/android/src/main/java/dev/apexnative/navigation/system/SystemUiWindow.kt +405 -0
  119. package/android/src/main/java/dev/apexnative/navigation/utils/ColorUtils.kt +22 -0
  120. package/android/src/main/java/dev/apexnative/navigation/utils/DevelopmentLog.kt +45 -0
  121. package/android/src/main/java/dev/apexnative/navigation/utils/DimensionExtensions.kt +16 -0
  122. package/android/src/main/java/dev/apexnative/navigation/utils/ImageLoader.kt +112 -0
  123. package/android/src/main/java/dev/apexnative/navigation/utils/MaterialTheme.kt +148 -0
  124. package/android/src/main/java/dev/apexnative/navigation/utils/NavigationLog.kt +6 -0
  125. package/android/src/main/java/dev/apexnative/navigation/utils/ScrollToTop.kt +33 -0
  126. package/android/src/main/java/dev/apexnative/navigation/utils/SystemUiUtils.kt +41 -0
  127. package/android/src/main/java/dev/apexnative/navigation/utils/TestIds.kt +89 -0
  128. package/android/src/main/java/dev/apexnative/navigation/utils/TextViewUtils.kt +10 -0
  129. package/android/src/main/java/dev/apexnative/navigation/utils/UiThread.kt +31 -0
  130. package/android/src/main/java/dev/apexnative/navigation/utils/UiUtils.kt +43 -0
  131. package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +124 -0
  132. package/android/src/main/java/dev/apexnative/navigation/utils/ViewExtensions.kt +41 -0
  133. package/android/src/main/java/dev/apexnative/navigation/utils/ViewUtils.kt +15 -0
  134. package/android/src/main/java/dev/apexnative/navigation/utils/WindowFolds.kt +107 -0
  135. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +258 -0
  136. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementDefinition.kt +57 -0
  137. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementLayout.kt +225 -0
  138. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementPlanner.kt +120 -0
  139. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/SecondaryScreenPresenter.kt +31 -0
  140. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +54 -0
  141. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +664 -0
  142. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +367 -0
  143. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +81 -0
  144. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +223 -0
  145. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabBarLook.kt +74 -0
  146. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabBarMotion.kt +83 -0
  147. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabCellState.kt +27 -0
  148. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabHistory.kt +38 -0
  149. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +172 -0
  150. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabSelection.kt +65 -0
  151. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsAttach.kt +42 -0
  152. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +72 -0
  153. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/child/ChildController.kt +45 -0
  154. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/child/ChildControllersRegistry.kt +29 -0
  155. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +90 -0
  156. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +254 -0
  157. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +65 -0
  158. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +231 -0
  159. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RestPlace.kt +28 -0
  160. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenContentFactory.kt +28 -0
  161. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFocus.kt +22 -0
  162. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +154 -0
  163. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +104 -0
  164. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +148 -0
  165. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentCreator.kt +18 -0
  166. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +187 -0
  167. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/NativeScreens.kt +25 -0
  168. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +40 -0
  169. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalContainer.kt +20 -0
  170. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +1269 -0
  171. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +186 -0
  172. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +342 -0
  173. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +398 -0
  174. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetContainer.kt +67 -0
  175. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +78 -0
  176. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/FirstRootDraw.kt +58 -0
  177. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/LayoutFactory.kt +203 -0
  178. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +562 -0
  179. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigators.kt +53 -0
  180. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +514 -0
  181. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/WaitingLayer.kt +18 -0
  182. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayContainer.kt +33 -0
  183. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +383 -0
  184. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayTouches.kt +44 -0
  185. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayViews.kt +117 -0
  186. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +62 -0
  187. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +43 -0
  188. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +218 -0
  189. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ShownChildren.kt +82 -0
  190. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +283 -0
  191. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +276 -0
  192. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +92 -0
  193. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +107 -0
  194. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +59 -0
  195. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +509 -0
  196. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewLayout.kt +61 -0
  197. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewPresenter.kt +25 -0
  198. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +19 -0
  199. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedPushes.kt +114 -0
  200. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +387 -0
  201. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +635 -0
  202. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +167 -0
  203. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackPresenter.kt +24 -0
  204. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +1274 -0
  205. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +82 -0
  206. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +222 -0
  207. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPlacement.kt +47 -0
  208. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPlan.kt +44 -0
  209. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +279 -0
  210. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +450 -0
  211. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/SearchPanel.kt +176 -0
  212. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +243 -0
  213. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +211 -0
  214. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarRowTransition.kt +122 -0
  215. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonCells.kt +30 -0
  216. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +65 -0
  217. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/LargeTitleCollapse.kt +71 -0
  218. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +72 -0
  219. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarCollapseBehavior.kt +104 -0
  220. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +1085 -0
  221. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarRoom.kt +95 -0
  222. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +122 -0
  223. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/IReactView.kt +89 -0
  224. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/Presenter.kt +51 -0
  225. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +194 -0
  226. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +320 -0
  227. package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationRules.kt +141 -0
  228. package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +193 -0
  229. package/android/src/main/java/dev/apexnative/navigation/views/animations/FadeThrough.kt +57 -0
  230. package/android/src/main/java/dev/apexnative/navigation/views/animations/SideAnimator.kt +143 -0
  231. package/android/src/main/java/dev/apexnative/navigation/views/animations/SystemTransition.kt +26 -0
  232. package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +93 -0
  233. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabItem.kt +13 -0
  234. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +550 -0
  235. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsContainer.kt +135 -0
  236. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +89 -0
  237. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +91 -0
  238. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +165 -0
  239. package/android/src/main/java/dev/apexnative/navigation/views/component/ComponentLayout.kt +89 -0
  240. package/android/src/main/java/dev/apexnative/navigation/views/component/Renderable.kt +6 -0
  241. package/android/src/main/java/dev/apexnative/navigation/views/element/DrawOrder.kt +44 -0
  242. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +31 -0
  243. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +281 -0
  244. package/android/src/main/java/dev/apexnative/navigation/views/element/ImageLoads.kt +103 -0
  245. package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +112 -0
  246. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +152 -0
  247. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +53 -0
  248. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +46 -0
  249. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +53 -0
  250. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +138 -0
  251. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +88 -0
  252. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +33 -0
  253. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +66 -0
  254. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +70 -0
  255. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +179 -0
  256. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +139 -0
  257. package/android/src/main/java/dev/apexnative/navigation/views/externalcomponent/ExternalComponentLayout.kt +44 -0
  258. package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +183 -0
  259. package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +137 -0
  260. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +125 -0
  261. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabAnimator.kt +8 -0
  262. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCollapseBehaviour.kt +34 -0
  263. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +133 -0
  264. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/LargeTitleView.kt +45 -0
  265. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +211 -0
  266. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +407 -0
  267. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBarDefaults.kt +35 -0
  268. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/ScopeRow.kt +82 -0
  269. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/SearchField.kt +130 -0
  270. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/SearchStyle.kt +29 -0
  271. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/SuggestionList.kt +77 -0
  272. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +80 -0
  273. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +334 -0
  274. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +106 -0
  275. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/IconBackgroundDrawable.kt +93 -0
  276. package/android/src/main/jni/ApexNavigationSpec.h +18 -0
  277. package/android/src/main/jni/CMakeLists.txt +33 -0
  278. package/android/src/main/res/color/apex_navigation_highlight_inverse.xml +5 -0
  279. package/android/src/main/res/color/apex_navigation_text_primary.xml +6 -0
  280. package/android/src/main/res/color/apex_navigation_text_primary_inverse.xml +6 -0
  281. package/android/src/main/res/color/apex_navigation_text_secondary.xml +6 -0
  282. package/android/src/main/res/color/apex_navigation_text_secondary_inverse.xml +6 -0
  283. package/android/src/main/res/drawable/apex_navigation_ic_arrow_back.xml +13 -0
  284. package/android/src/main/res/drawable/apex_navigation_ic_close.xml +12 -0
  285. package/android/src/main/res/drawable/ic_fab_add_24dp.xml +12 -0
  286. package/android/src/main/res/values/attrs.xml +13 -0
  287. package/android/src/main/res/values/dimens.xml +5 -0
  288. package/android/src/main/res/values/dimens_splash.xml +9 -0
  289. package/android/src/main/res/values/ids.xml +12 -0
  290. package/android/src/main/res/values/styles.xml +18 -0
  291. package/android/src/main/res/values/themes.xml +75 -0
  292. package/android/src/main/res/values-night/styles.xml +6 -0
  293. package/android/src/main/res/values-night/themes.xml +67 -0
  294. package/cli/app.js +113 -0
  295. package/cli/changes.js +235 -0
  296. package/cli/codegen/commands.js +356 -0
  297. package/cli/codegen/index.js +211 -0
  298. package/cli/codegen/kotlin.js +396 -0
  299. package/cli/codegen/names.js +99 -0
  300. package/cli/codegen/read.js +602 -0
  301. package/cli/codegen/swift.js +342 -0
  302. package/cli/config.js +78 -0
  303. package/cli/diff.js +139 -0
  304. package/cli/doctor/checks/android.js +217 -0
  305. package/cli/doctor/checks/app.js +305 -0
  306. package/cli/doctor/checks/conflicts.js +42 -0
  307. package/cli/doctor/checks/devices.js +98 -0
  308. package/cli/doctor/checks/icons.js +69 -0
  309. package/cli/doctor/checks/ios.js +187 -0
  310. package/cli/doctor/checks/navigation.js +285 -0
  311. package/cli/doctor/checks/splash.js +102 -0
  312. package/cli/doctor/fix.js +66 -0
  313. package/cli/doctor/index.js +136 -0
  314. package/cli/doctor/types.js +30 -0
  315. package/cli/exec.js +34 -0
  316. package/cli/gradle.js +142 -0
  317. package/cli/icons/android.js +173 -0
  318. package/cli/icons/images.js +202 -0
  319. package/cli/icons/index.js +97 -0
  320. package/cli/icons/ios.js +113 -0
  321. package/cli/icons/settings.js +116 -0
  322. package/cli/images.js +67 -0
  323. package/cli/index.js +307 -0
  324. package/cli/info/index.js +290 -0
  325. package/cli/init/index.js +426 -0
  326. package/cli/init/packageManager.js +48 -0
  327. package/cli/init/starter.js +440 -0
  328. package/cli/links/files.js +109 -0
  329. package/cli/links/identity.js +75 -0
  330. package/cli/links/index.js +532 -0
  331. package/cli/links/native.js +396 -0
  332. package/cli/links/open.js +120 -0
  333. package/cli/links/prefixes.js +89 -0
  334. package/cli/mcp/appMap.js +128 -0
  335. package/cli/mcp/docs.js +175 -0
  336. package/cli/mcp/index.js +153 -0
  337. package/cli/mcp/markdown.js +210 -0
  338. package/cli/mcp/protocol.js +151 -0
  339. package/cli/mcp/tools.js +389 -0
  340. package/cli/migrate/entry.js +451 -0
  341. package/cli/migrate/index.js +305 -0
  342. package/cli/migrate/native.js +250 -0
  343. package/cli/migrate/report.js +238 -0
  344. package/cli/pods.js +56 -0
  345. package/cli/project.js +189 -0
  346. package/cli/screen/index.js +383 -0
  347. package/cli/screen/templates/compose.js +46 -0
  348. package/cli/screen/templates/native.js +40 -0
  349. package/cli/screen/templates/react.js +47 -0
  350. package/cli/screen/templates/swiftui.js +30 -0
  351. package/cli/screen/templates/uikit.js +48 -0
  352. package/cli/screen/templates/views.js +46 -0
  353. package/cli/setup/index.js +240 -0
  354. package/cli/setup/source.js +58 -0
  355. package/cli/setup/steps/app.js +76 -0
  356. package/cli/setup/steps/appDelegate.js +98 -0
  357. package/cli/setup/steps/entry.js +68 -0
  358. package/cli/setup/steps/env.js +245 -0
  359. package/cli/setup/steps/infoPlist.js +39 -0
  360. package/cli/setup/steps/mainActivity.js +60 -0
  361. package/cli/setup/steps/mainApplication.js +58 -0
  362. package/cli/setup/steps/manifest.js +38 -0
  363. package/cli/setup/steps/styles.js +29 -0
  364. package/cli/setup/steps/types.js +14 -0
  365. package/cli/splash/android.js +239 -0
  366. package/cli/splash/files.js +50 -0
  367. package/cli/splash/images.js +117 -0
  368. package/cli/splash/index.js +109 -0
  369. package/cli/splash/ios.js +349 -0
  370. package/cli/splash/settings.js +143 -0
  371. package/cli/typescript.js +473 -0
  372. package/cli/ui.js +268 -0
  373. package/cli/upgrade/changelog.js +45 -0
  374. package/cli/upgrade/index.js +347 -0
  375. package/cli/upgrade/versions.js +105 -0
  376. package/cli/workspace.js +60 -0
  377. package/cli/xcode/pbxproj.js +327 -0
  378. package/docs-md/architecture/errors-and-loading.md +138 -0
  379. package/docs-md/architecture/native-screens.md +290 -0
  380. package/docs-md/architecture/one-tree.md +164 -0
  381. package/docs-md/architecture/theme-and-context.md +368 -0
  382. package/docs-md/architecture/transitions.md +191 -0
  383. package/docs-md/containers/arrangement.md +320 -0
  384. package/docs-md/containers/modals.md +195 -0
  385. package/docs-md/containers/overlays.md +109 -0
  386. package/docs-md/containers/side-menu.md +138 -0
  387. package/docs-md/containers/split-view.md +155 -0
  388. package/docs-md/containers/stack.md +156 -0
  389. package/docs-md/containers/tabs.md +187 -0
  390. package/docs-md/flows/a-search-screen.md +311 -0
  391. package/docs-md/flows/an-app-with-tabs.md +380 -0
  392. package/docs-md/flows/bottom-sheets.md +326 -0
  393. package/docs-md/flows/forms-in-a-modal.md +420 -0
  394. package/docs-md/flows/list-and-details.md +428 -0
  395. package/docs-md/flows/onboarding.md +454 -0
  396. package/docs-md/flows/sign-in-and-sign-out.md +693 -0
  397. package/docs-md/fundamentals/lifecycle-and-events.md +224 -0
  398. package/docs-md/fundamentals/moving-between-screens.md +267 -0
  399. package/docs-md/fundamentals/screen-options.md +197 -0
  400. package/docs-md/fundamentals/screens-and-props.md +314 -0
  401. package/docs-md/fundamentals/starting-the-app.md +317 -0
  402. package/docs-md/fundamentals/switching-roots.md +166 -0
  403. package/docs-md/guides/analytics.md +377 -0
  404. package/docs-md/guides/app-context.md +554 -0
  405. package/docs-md/guides/building-a-screen.md +350 -0
  406. package/docs-md/guides/cli.md +421 -0
  407. package/docs-md/guides/data-fetching.md +492 -0
  408. package/docs-md/guides/deep-links.md +694 -0
  409. package/docs-md/guides/error-reporting.md +290 -0
  410. package/docs-md/guides/gestures-and-animations.md +381 -0
  411. package/docs-md/guides/notifications.md +548 -0
  412. package/docs-md/guides/overview.md +65 -0
  413. package/docs-md/guides/right-to-left.md +273 -0
  414. package/docs-md/guides/splash-screen.md +30 -0
  415. package/docs-md/guides/state-management.md +1050 -0
  416. package/docs-md/guides/testing.md +293 -0
  417. package/docs-md/help/glossary.md +433 -0
  418. package/docs-md/help/troubleshooting.md +709 -0
  419. package/docs-md/index.json +4205 -0
  420. package/docs-md/migration/from-expo-router.md +446 -0
  421. package/docs-md/migration/from-react-native-navigation.md +789 -0
  422. package/docs-md/migration/from-react-navigation.md +628 -0
  423. package/docs-md/screen-ui/back-and-gestures.md +178 -0
  424. package/docs-md/screen-ui/bar-buttons.md +312 -0
  425. package/docs-md/screen-ui/search.md +181 -0
  426. package/docs-md/screen-ui/system-ui.md +337 -0
  427. package/docs-md/screen-ui/toolbar-and-fab.md +146 -0
  428. package/docs-md/screen-ui/top-bar.md +247 -0
  429. package/docs-md/start/installation.md +233 -0
  430. package/docs-md/start/introduction.md +46 -0
  431. package/docs-md/start/quick-start.md +124 -0
  432. package/ios/Animations/ANNAnimationRules.h +72 -0
  433. package/ios/Animations/ANNAnimationRules.mm +122 -0
  434. package/ios/Animations/ANNFrameDriver.h +46 -0
  435. package/ios/Animations/ANNFrameDriver.mm +126 -0
  436. package/ios/Animations/ANNTransitionAnimator.h +34 -0
  437. package/ios/Animations/ANNTransitionAnimator.mm +293 -0
  438. package/ios/Animations/ANNTransitionPlan.h +115 -0
  439. package/ios/Animations/ANNTransitionPlan.mm +130 -0
  440. package/ios/Animations/ANNTransitionWait.h +29 -0
  441. package/ios/Animations/ANNTransitionWait.mm +135 -0
  442. package/ios/Animations/Elements/ANNElementFinder.h +26 -0
  443. package/ios/Animations/Elements/ANNElementFinder.mm +37 -0
  444. package/ios/Animations/Elements/ANNElementTransition.h +30 -0
  445. package/ios/Animations/Elements/ANNElementTransition.mm +75 -0
  446. package/ios/Animations/Elements/ANNSharedElementFlight.h +42 -0
  447. package/ios/Animations/Elements/ANNSharedElementFlight.mm +340 -0
  448. package/ios/Animations/Elements/ANNZoomAnchor.h +33 -0
  449. package/ios/Animations/Elements/ANNZoomAnchor.mm +133 -0
  450. package/ios/Animations/Interpolators/ANNCurve.h +61 -0
  451. package/ios/Animations/Interpolators/ANNCurve.mm +301 -0
  452. package/ios/Animations/Interpolators/ANNInterpolate.h +69 -0
  453. package/ios/Animations/Interpolators/ANNTrack.h +52 -0
  454. package/ios/Animations/Interpolators/ANNTrack.mm +77 -0
  455. package/ios/Animations/Interpolators/ANNViewTracks.h +57 -0
  456. package/ios/Animations/Interpolators/ANNViewTracks.mm +261 -0
  457. package/ios/ApexNavigation-prefix.h +6 -0
  458. package/ios/CLAUDE.md +151 -0
  459. package/ios/CORE.md +177 -0
  460. package/ios/Contract/ANNCommandAnswer.h +38 -0
  461. package/ios/Contract/ANNCommandAnswer.mm +99 -0
  462. package/ios/Contract/ANNCommandRunner.h +42 -0
  463. package/ios/Contract/ANNCommandRunner.mm +89 -0
  464. package/ios/Contract/ANNErrorTexts.h +86 -0
  465. package/ios/Contract/ANNErrorTexts.mm +230 -0
  466. package/ios/Contract/ANNLayoutNode.h +64 -0
  467. package/ios/Contract/ANNLayoutNode.mm +153 -0
  468. package/ios/Contract/ANNLayoutReader.h +34 -0
  469. package/ios/Contract/ANNLayoutReader.mm +282 -0
  470. package/ios/Contract/ANNLayoutRoot.h +26 -0
  471. package/ios/Contract/ANNLayoutRoot.mm +21 -0
  472. package/ios/Contract/ANNLayoutTreeOptions.h +22 -0
  473. package/ios/Contract/ANNLayoutTreeOptions.mm +32 -0
  474. package/ios/Contract/ANNLayoutType.h +44 -0
  475. package/ios/Contract/ANNLayoutValidator.h +23 -0
  476. package/ios/Contract/ANNLayoutValidator.mm +28 -0
  477. package/ios/Core/ANNAppDelegate.mm +122 -0
  478. package/ios/Core/ANNAppDirection.h +43 -0
  479. package/ios/Core/ANNAppDirection.mm +194 -0
  480. package/ios/Core/ANNAppearanceDispatcher.h +117 -0
  481. package/ios/Core/ANNAppearanceDispatcher.mm +433 -0
  482. package/ios/Core/ANNAssert.h +7 -0
  483. package/ios/Core/ANNDeepLinkQueue.h +35 -0
  484. package/ios/Core/ANNDeepLinkQueue.mm +136 -0
  485. package/ios/Core/ANNErrorHandler.h +17 -0
  486. package/ios/Core/ANNErrorHandler.mm +14 -0
  487. package/ios/Core/ANNEventEmitter.h +174 -0
  488. package/ios/Core/ANNEventEmitter.mm +337 -0
  489. package/ios/Core/ANNHinge.h +26 -0
  490. package/ios/Core/ANNHinge.mm +116 -0
  491. package/ios/Core/ANNKeyCommands.h +12 -0
  492. package/ios/Core/ANNKeyCommands.mm +74 -0
  493. package/ios/Core/ANNLayoutInfo.h +18 -0
  494. package/ios/Core/ANNLayoutInfo.mm +13 -0
  495. package/ios/Core/ANNLayoutProtocol.h +155 -0
  496. package/ios/Core/ANNNavigationState.h +38 -0
  497. package/ios/Core/ANNNavigationState.mm +127 -0
  498. package/ios/Core/ANNNodeHelper.h +114 -0
  499. package/ios/Core/ANNNodeHelper.mm +260 -0
  500. package/ios/Core/ANNNodePresenter.h +86 -0
  501. package/ios/Core/ANNNodePresenter.mm +92 -0
  502. package/ios/Core/ANNNodeRegistry.h +30 -0
  503. package/ios/Core/ANNNodeRegistry.mm +48 -0
  504. package/ios/Core/ANNOptionsRepaint.h +19 -0
  505. package/ios/Core/ANNOptionsRepaint.mm +59 -0
  506. package/ios/Core/ANNParking.h +34 -0
  507. package/ios/Core/ANNParking.mm +117 -0
  508. package/ios/Core/ANNPendingLayers.h +31 -0
  509. package/ios/Core/ANNPendingLayers.mm +57 -0
  510. package/ios/Core/ANNReloadCoordinator.h +26 -0
  511. package/ios/Core/ANNReloadCoordinator.mm +211 -0
  512. package/ios/Core/ANNRenderWait.h +105 -0
  513. package/ios/Core/ANNRenderWait.mm +496 -0
  514. package/ios/Core/ANNSceneDelegate.mm +92 -0
  515. package/ios/Core/ANNScreenAppearance+Internal.h +29 -0
  516. package/ios/Core/ANNScreenAppearance.h +60 -0
  517. package/ios/Core/ANNScreenAppearance.mm +44 -0
  518. package/ios/Core/ANNShownScreens.h +27 -0
  519. package/ios/Core/ANNShownScreens.mm +16 -0
  520. package/ios/Core/ANNSystemUI.h +95 -0
  521. package/ios/Core/ANNSystemUI.mm +401 -0
  522. package/ios/Core/ANNSystemUIRules.h +35 -0
  523. package/ios/Core/ANNSystemUIRules.mm +139 -0
  524. package/ios/Core/ANNUtils.h +35 -0
  525. package/ios/Core/ANNUtils.mm +111 -0
  526. package/ios/Core/ApexNavigation+Internal.h +26 -0
  527. package/ios/Core/ApexNavigation.mm +177 -0
  528. package/ios/Core/UIViewController+LayoutProtocol.h +102 -0
  529. package/ios/Core/UIViewController+LayoutProtocol.mm +253 -0
  530. package/ios/Layouts/Arrangement/ANNArrangementScreenDelegate.h +18 -0
  531. package/ios/Layouts/Arrangement/ANNArrangementState.h +30 -0
  532. package/ios/Layouts/Arrangement/ANNArrangementState.mm +53 -0
  533. package/ios/Layouts/Arrangement/ANNArrangementViewController.h +38 -0
  534. package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +573 -0
  535. package/ios/Layouts/External/ANNExternalViewController.h +28 -0
  536. package/ios/Layouts/External/ANNExternalViewController.mm +118 -0
  537. package/ios/Layouts/External/ANNNativeScreenCalls.h +27 -0
  538. package/ios/Layouts/External/ANNNativeScreenCalls.mm +77 -0
  539. package/ios/Layouts/Modal/ANNModal.h +121 -0
  540. package/ios/Layouts/Modal/ANNModal.mm +64 -0
  541. package/ios/Layouts/Modal/ANNModalCoordinator.h +99 -0
  542. package/ios/Layouts/Modal/ANNModalCoordinator.mm +1965 -0
  543. package/ios/Layouts/Modal/ANNModalHostViewComponentView.h +13 -0
  544. package/ios/Layouts/Modal/ANNModalHostViewComponentView.mm +24 -0
  545. package/ios/Layouts/Modal/ANNModalPresentation.h +73 -0
  546. package/ios/Layouts/Modal/ANNModalPresentation.mm +189 -0
  547. package/ios/Layouts/Modal/ANNModalSizePresenter.h +13 -0
  548. package/ios/Layouts/Modal/ANNModalSizePresenter.mm +65 -0
  549. package/ios/Layouts/Modal/ANNModalTransitions.h +29 -0
  550. package/ios/Layouts/Modal/ANNModalTransitions.mm +40 -0
  551. package/ios/Layouts/Modal/ANNPopoverPresenter.h +29 -0
  552. package/ios/Layouts/Modal/ANNPopoverPresenter.mm +158 -0
  553. package/ios/Layouts/Modal/ANNPresentationGate.h +52 -0
  554. package/ios/Layouts/Modal/ANNPresentationGate.mm +153 -0
  555. package/ios/Layouts/Modal/ANNSheetPresenter.h +31 -0
  556. package/ios/Layouts/Modal/ANNSheetPresenter.mm +247 -0
  557. package/ios/Layouts/Overlay/ANNOverlayCoordinator.h +66 -0
  558. package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +604 -0
  559. package/ios/Layouts/Overlay/ANNOverlayWindow.h +10 -0
  560. package/ios/Layouts/Overlay/ANNOverlayWindow.mm +71 -0
  561. package/ios/Layouts/Root/ANNLayoutFactory.h +31 -0
  562. package/ios/Layouts/Root/ANNLayoutFactory.mm +349 -0
  563. package/ios/Layouts/Root/ANNRootCoordinator.h +42 -0
  564. package/ios/Layouts/Root/ANNRootCoordinator.mm +847 -0
  565. package/ios/Layouts/Root/ANNSplashViewController.h +30 -0
  566. package/ios/Layouts/Root/ANNSplashViewController.mm +138 -0
  567. package/ios/Layouts/Screen/ANNComponentPresenter.h +32 -0
  568. package/ios/Layouts/Screen/ANNComponentPresenter.mm +136 -0
  569. package/ios/Layouts/Screen/ANNComponentViewController.h +100 -0
  570. package/ios/Layouts/Screen/ANNComponentViewController.mm +652 -0
  571. package/ios/Layouts/Screen/ANNNativeScreenContext+Internal.h +19 -0
  572. package/ios/Layouts/Screen/ANNNativeScreenContext.mm +84 -0
  573. package/ios/Layouts/Screen/ANNPreviewInteraction.h +38 -0
  574. package/ios/Layouts/Screen/ANNPreviewInteraction.mm +252 -0
  575. package/ios/Layouts/Screen/ANNScreenBars.h +29 -0
  576. package/ios/Layouts/Screen/ANNScreenBars.mm +47 -0
  577. package/ios/Layouts/Screen/ANNScreenInsets.h +30 -0
  578. package/ios/Layouts/Screen/ANNScreenInsets.mm +68 -0
  579. package/ios/Layouts/Screen/ANNScreenReadiness.h +92 -0
  580. package/ios/Layouts/Screen/ANNScreenReadiness.mm +186 -0
  581. package/ios/Layouts/Screen/ANNScreenRegions.h +33 -0
  582. package/ios/Layouts/Screen/ANNScreenRegions.mm +105 -0
  583. package/ios/Layouts/Screen/ANNScreenSafeArea.h +38 -0
  584. package/ios/Layouts/Screen/ANNScreenSafeArea.mm +58 -0
  585. package/ios/Layouts/SideMenu/ANNSideMenuChildViewController.h +41 -0
  586. package/ios/Layouts/SideMenu/ANNSideMenuChildViewController.mm +113 -0
  587. package/ios/Layouts/SideMenu/ANNSideMenuPresenter.h +28 -0
  588. package/ios/Layouts/SideMenu/ANNSideMenuPresenter.mm +260 -0
  589. package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +19 -0
  590. package/ios/Layouts/SideMenu/ANNSideMenuViewController.h +46 -0
  591. package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +891 -0
  592. package/ios/Layouts/SplitView/ANNSplitViewCommands.h +39 -0
  593. package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +612 -0
  594. package/ios/Layouts/SplitView/ANNSplitViewController.h +52 -0
  595. package/ios/Layouts/SplitView/ANNSplitViewController.mm +494 -0
  596. package/ios/Layouts/SplitView/ANNSplitViewPresenter.h +18 -0
  597. package/ios/Layouts/SplitView/ANNSplitViewPresenter.mm +181 -0
  598. package/ios/Layouts/SplitView/UISplitViewController+ANNOptions.h +32 -0
  599. package/ios/Layouts/SplitView/UISplitViewController+ANNOptions.mm +133 -0
  600. package/ios/Layouts/Stack/ANNPreviewPush.h +46 -0
  601. package/ios/Layouts/Stack/ANNPreviewPush.mm +298 -0
  602. package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +32 -0
  603. package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +92 -0
  604. package/ios/Layouts/Stack/ANNStackCommands.h +51 -0
  605. package/ios/Layouts/Stack/ANNStackCommands.mm +403 -0
  606. package/ios/Layouts/Stack/ANNStackController.h +161 -0
  607. package/ios/Layouts/Stack/ANNStackController.mm +1597 -0
  608. package/ios/Layouts/Stack/ANNStackPresenter.h +44 -0
  609. package/ios/Layouts/Stack/ANNStackPresenter.mm +181 -0
  610. package/ios/Layouts/Stack/ANNStackQueue.h +194 -0
  611. package/ios/Layouts/Stack/ANNStackQueue.mm +1300 -0
  612. package/ios/Layouts/Stack/InteractivePopGestureDelegate.h +53 -0
  613. package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +228 -0
  614. package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +19 -0
  615. package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +29 -0
  616. package/ios/Layouts/Tabs/ANNBottomTabCellView.h +33 -0
  617. package/ios/Layouts/Tabs/ANNBottomTabCellView.mm +100 -0
  618. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +49 -0
  619. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +153 -0
  620. package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.h +17 -0
  621. package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +56 -0
  622. package/ios/Layouts/Tabs/ANNBottomTabsController.h +121 -0
  623. package/ios/Layouts/Tabs/ANNBottomTabsController.mm +1404 -0
  624. package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.h +47 -0
  625. package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +280 -0
  626. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +81 -0
  627. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +1026 -0
  628. package/ios/Layouts/Tabs/ANNMoreNavigationDelegate.h +24 -0
  629. package/ios/Layouts/Tabs/ANNMoreNavigationDelegate.mm +58 -0
  630. package/ios/Layouts/Tabs/ANNScrollToTop.h +23 -0
  631. package/ios/Layouts/Tabs/ANNScrollToTop.mm +55 -0
  632. package/ios/Layouts/Tabs/ANNTabDotView.h +19 -0
  633. package/ios/Layouts/Tabs/ANNTabDotView.mm +46 -0
  634. package/ios/Layouts/Tabs/ANNTabLongPress.h +28 -0
  635. package/ios/Layouts/Tabs/ANNTabLongPress.mm +98 -0
  636. package/ios/Layouts/Tabs/ANNTabsDesign.h +26 -0
  637. package/ios/Layouts/Tabs/ANNTabsDesign.mm +34 -0
  638. package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +27 -0
  639. package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +55 -0
  640. package/ios/Layouts/Tabs/UITabBar+utils.h +24 -0
  641. package/ios/Layouts/Tabs/UITabBar+utils.mm +103 -0
  642. package/ios/Options/ANNAnimationOptions.h +22 -0
  643. package/ios/Options/ANNAnimationOptions.mm +16 -0
  644. package/ios/Options/ANNAnimationPropertyOptions.h +17 -0
  645. package/ios/Options/ANNAnimationPropertyOptions.mm +15 -0
  646. package/ios/Options/ANNBottomTabDotIndicatorOptions.h +14 -0
  647. package/ios/Options/ANNBottomTabDotIndicatorOptions.mm +13 -0
  648. package/ios/Options/ANNBottomTabOptions.h +51 -0
  649. package/ios/Options/ANNBottomTabOptions.mm +47 -0
  650. package/ios/Options/ANNBottomTabsAccessoryOptions.h +19 -0
  651. package/ios/Options/ANNBottomTabsAccessoryOptions.mm +25 -0
  652. package/ios/Options/ANNBottomTabsAnimationOptions.h +12 -0
  653. package/ios/Options/ANNBottomTabsAnimationOptions.mm +11 -0
  654. package/ios/Options/ANNBottomTabsCustomRowOptions.h +19 -0
  655. package/ios/Options/ANNBottomTabsCustomRowOptions.mm +17 -0
  656. package/ios/Options/ANNBottomTabsOptions.h +51 -0
  657. package/ios/Options/ANNBottomTabsOptions.mm +48 -0
  658. package/ios/Options/ANNBottomTabsShadowOptions.h +14 -0
  659. package/ios/Options/ANNBottomTabsShadowOptions.mm +13 -0
  660. package/ios/Options/ANNButtonComponentOptions.h +13 -0
  661. package/ios/Options/ANNButtonComponentOptions.mm +12 -0
  662. package/ios/Options/ANNButtonOptions.h +56 -0
  663. package/ios/Options/ANNButtonOptions.mm +53 -0
  664. package/ios/Options/ANNButtonsParser.h +13 -0
  665. package/ios/Options/ANNButtonsParser.mm +18 -0
  666. package/ios/Options/ANNComponentOptions.h +14 -0
  667. package/ios/Options/ANNComponentOptions.mm +12 -0
  668. package/ios/Options/ANNDefaultOptions.h +18 -0
  669. package/ios/Options/ANNDefaultOptions.mm +22 -0
  670. package/ios/Options/ANNElementAnimationOptions.h +18 -0
  671. package/ios/Options/ANNElementAnimationOptions.mm +15 -0
  672. package/ios/Options/ANNElementTransitionOptions.h +26 -0
  673. package/ios/Options/ANNElementTransitionOptions.mm +28 -0
  674. package/ios/Options/ANNEnterExitBottomTabsAnimationOptions.h +14 -0
  675. package/ios/Options/ANNEnterExitBottomTabsAnimationOptions.mm +12 -0
  676. package/ios/Options/ANNEnterExitScreenAnimationOptions.h +14 -0
  677. package/ios/Options/ANNEnterExitScreenAnimationOptions.mm +12 -0
  678. package/ios/Options/ANNEnterExitTopBarAnimationOptions.h +14 -0
  679. package/ios/Options/ANNEnterExitTopBarAnimationOptions.mm +12 -0
  680. package/ios/Options/ANNFabOptions.h +26 -0
  681. package/ios/Options/ANNFabOptions.mm +23 -0
  682. package/ios/Options/ANNFontOptions.h +24 -0
  683. package/ios/Options/ANNFontOptions.mm +65 -0
  684. package/ios/Options/ANNHardwareBackButtonOptions.h +15 -0
  685. package/ios/Options/ANNHardwareBackButtonOptions.mm +13 -0
  686. package/ios/Options/ANNIconBackgroundOptions.h +16 -0
  687. package/ios/Options/ANNIconBackgroundOptions.mm +15 -0
  688. package/ios/Options/ANNIconInsetsOptions.h +16 -0
  689. package/ios/Options/ANNIconInsetsOptions.mm +14 -0
  690. package/ios/Options/ANNInterpolationOptions.h +22 -0
  691. package/ios/Options/ANNInterpolationOptions.mm +22 -0
  692. package/ios/Options/ANNLayoutOptions.h +26 -0
  693. package/ios/Options/ANNLayoutOptions.mm +25 -0
  694. package/ios/Options/ANNMenuOptions.h +37 -0
  695. package/ios/Options/ANNMenuOptions.mm +136 -0
  696. package/ios/Options/ANNModalAnimationOptions.h +17 -0
  697. package/ios/Options/ANNModalAnimationOptions.mm +15 -0
  698. package/ios/Options/ANNModalContentSizeOptions.h +14 -0
  699. package/ios/Options/ANNModalContentSizeOptions.mm +15 -0
  700. package/ios/Options/ANNModalOptions.h +19 -0
  701. package/ios/Options/ANNModalOptions.mm +15 -0
  702. package/ios/Options/ANNNavigationBarOptions.h +14 -0
  703. package/ios/Options/ANNNavigationBarOptions.mm +13 -0
  704. package/ios/Options/ANNNavigationOptions.h +60 -0
  705. package/ios/Options/ANNNavigationOptions.mm +54 -0
  706. package/ios/Options/ANNOptionField.h +91 -0
  707. package/ios/Options/ANNOptionField.mm +173 -0
  708. package/ios/Options/ANNOptions.h +62 -0
  709. package/ios/Options/ANNOptions.mm +329 -0
  710. package/ios/Options/ANNOptionsCache.h +22 -0
  711. package/ios/Options/ANNOptionsCache.mm +17 -0
  712. package/ios/Options/ANNOptionsReader.h +33 -0
  713. package/ios/Options/ANNOptionsReader.mm +63 -0
  714. package/ios/Options/ANNOverlayOptions.h +14 -0
  715. package/ios/Options/ANNOverlayOptions.mm +12 -0
  716. package/ios/Options/ANNPopoverOptions.h +17 -0
  717. package/ios/Options/ANNPopoverOptions.mm +31 -0
  718. package/ios/Options/ANNPreviewOptions.h +17 -0
  719. package/ios/Options/ANNPreviewOptions.mm +15 -0
  720. package/ios/Options/ANNScreenAnimationOptions.h +13 -0
  721. package/ios/Options/ANNScreenAnimationOptions.mm +12 -0
  722. package/ios/Options/ANNScrollEdgeEffectOptions.h +20 -0
  723. package/ios/Options/ANNScrollEdgeEffectOptions.mm +16 -0
  724. package/ios/Options/ANNScrollEdgeOptions.h +14 -0
  725. package/ios/Options/ANNScrollEdgeOptions.mm +12 -0
  726. package/ios/Options/ANNSearchBarOptions.h +49 -0
  727. package/ios/Options/ANNSearchBarOptions.mm +41 -0
  728. package/ios/Options/ANNSearchScopeOptions.h +15 -0
  729. package/ios/Options/ANNSearchScopeOptions.mm +13 -0
  730. package/ios/Options/ANNSearchSuggestionOptions.h +19 -0
  731. package/ios/Options/ANNSearchSuggestionOptions.mm +16 -0
  732. package/ios/Options/ANNSearchTokenOptions.h +18 -0
  733. package/ios/Options/ANNSearchTokenOptions.mm +15 -0
  734. package/ios/Options/ANNSetStackRootAnimationOptions.h +12 -0
  735. package/ios/Options/ANNSetStackRootAnimationOptions.mm +11 -0
  736. package/ios/Options/ANNSharedElementTransitionOptions.h +17 -0
  737. package/ios/Options/ANNSharedElementTransitionOptions.mm +15 -0
  738. package/ios/Options/ANNSheetOptions.h +25 -0
  739. package/ios/Options/ANNSheetOptions.mm +41 -0
  740. package/ios/Options/ANNSideMenuOptions.h +19 -0
  741. package/ios/Options/ANNSideMenuOptions.mm +16 -0
  742. package/ios/Options/ANNSideMenuSideOptions.h +23 -0
  743. package/ios/Options/ANNSideMenuSideOptions.mm +20 -0
  744. package/ios/Options/ANNSplitViewColumnOptions.h +14 -0
  745. package/ios/Options/ANNSplitViewColumnOptions.mm +13 -0
  746. package/ios/Options/ANNSplitViewInspectorOptions.h +13 -0
  747. package/ios/Options/ANNSplitViewInspectorOptions.mm +9 -0
  748. package/ios/Options/ANNSplitViewOptions.h +29 -0
  749. package/ios/Options/ANNSplitViewOptions.mm +26 -0
  750. package/ios/Options/ANNStackAnimationOptions.h +23 -0
  751. package/ios/Options/ANNStackAnimationOptions.mm +20 -0
  752. package/ios/Options/ANNStackPushAnimationOptions.h +13 -0
  753. package/ios/Options/ANNStackPushAnimationOptions.mm +11 -0
  754. package/ios/Options/ANNStatusBarOptions.h +20 -0
  755. package/ios/Options/ANNStatusBarOptions.mm +18 -0
  756. package/ios/Options/ANNToolbarOptions.h +14 -0
  757. package/ios/Options/ANNToolbarOptions.mm +27 -0
  758. package/ios/Options/ANNTopBarAnimationOptions.h +12 -0
  759. package/ios/Options/ANNTopBarAnimationOptions.mm +11 -0
  760. package/ios/Options/ANNTopBarBackButtonOptions.h +31 -0
  761. package/ios/Options/ANNTopBarBackButtonOptions.mm +35 -0
  762. package/ios/Options/ANNTopBarBackgroundComponentOptions.h +13 -0
  763. package/ios/Options/ANNTopBarBackgroundComponentOptions.mm +11 -0
  764. package/ios/Options/ANNTopBarBackgroundOptions.h +17 -0
  765. package/ios/Options/ANNTopBarBackgroundOptions.mm +15 -0
  766. package/ios/Options/ANNTopBarLargeTitleOptions.h +19 -0
  767. package/ios/Options/ANNTopBarLargeTitleOptions.mm +15 -0
  768. package/ios/Options/ANNTopBarOptions.h +62 -0
  769. package/ios/Options/ANNTopBarOptions.mm +49 -0
  770. package/ios/Options/ANNTopBarScrollEdgeAppearanceBackgroundOptions.h +14 -0
  771. package/ios/Options/ANNTopBarScrollEdgeAppearanceBackgroundOptions.mm +12 -0
  772. package/ios/Options/ANNTopBarScrollEdgeAppearanceOptions.h +19 -0
  773. package/ios/Options/ANNTopBarScrollEdgeAppearanceOptions.mm +16 -0
  774. package/ios/Options/ANNTopBarScrollEdgeAppearanceTitleOptions.h +16 -0
  775. package/ios/Options/ANNTopBarScrollEdgeAppearanceTitleOptions.mm +12 -0
  776. package/ios/Options/ANNTopBarSubtitleOptions.h +18 -0
  777. package/ios/Options/ANNTopBarSubtitleOptions.mm +14 -0
  778. package/ios/Options/ANNTopBarTitleComponentOptions.h +15 -0
  779. package/ios/Options/ANNTopBarTitleComponentOptions.mm +12 -0
  780. package/ios/Options/ANNTopBarTitleDocumentOptions.h +12 -0
  781. package/ios/Options/ANNTopBarTitleDocumentOptions.mm +11 -0
  782. package/ios/Options/ANNTopBarTitleOptions.h +29 -0
  783. package/ios/Options/ANNTopBarTitleOptions.mm +21 -0
  784. package/ios/Options/ANNViewAnimationOptions.h +26 -0
  785. package/ios/Options/ANNViewAnimationOptions.mm +58 -0
  786. package/ios/Options/ANNWindowOptions.h +12 -0
  787. package/ios/Options/ANNWindowOptions.mm +9 -0
  788. package/ios/Options/ANNZoomTransitionOptions.h +13 -0
  789. package/ios/Options/ANNZoomTransitionOptions.mm +12 -0
  790. package/ios/Options/Params/ANNIntegerParam.h +14 -0
  791. package/ios/Options/Params/ANNIntegerParam.mm +13 -0
  792. package/ios/Options/Params/ANNParam.h +28 -0
  793. package/ios/Options/Params/ANNParam.mm +29 -0
  794. package/ios/Options/Params/Bool.h +17 -0
  795. package/ios/Options/Params/Bool.mm +17 -0
  796. package/ios/Options/Params/BoolParser.h +12 -0
  797. package/ios/Options/Params/BoolParser.mm +10 -0
  798. package/ios/Options/Params/Color.h +43 -0
  799. package/ios/Options/Params/Color.mm +65 -0
  800. package/ios/Options/Params/ColorParser.h +14 -0
  801. package/ios/Options/Params/ColorParser.mm +95 -0
  802. package/ios/Options/Params/Double.h +14 -0
  803. package/ios/Options/Params/Double.mm +13 -0
  804. package/ios/Options/Params/DoubleParser.h +16 -0
  805. package/ios/Options/Params/DoubleParser.mm +16 -0
  806. package/ios/Options/Params/Image.h +15 -0
  807. package/ios/Options/Params/Image.mm +13 -0
  808. package/ios/Options/Params/ImageParser.h +16 -0
  809. package/ios/Options/Params/ImageParser.mm +103 -0
  810. package/ios/Options/Params/Number.h +14 -0
  811. package/ios/Options/Params/Number.mm +13 -0
  812. package/ios/Options/Params/NumberParser.h +13 -0
  813. package/ios/Options/Params/NumberParser.mm +10 -0
  814. package/ios/Options/Params/Param.h +16 -0
  815. package/ios/Options/Params/Param.mm +13 -0
  816. package/ios/Options/Params/Text.h +17 -0
  817. package/ios/Options/Params/Text.mm +17 -0
  818. package/ios/Options/Params/TextParser.h +17 -0
  819. package/ios/Options/Params/TextParser.mm +17 -0
  820. package/ios/Package.swift +58 -0
  821. package/ios/Public/ApexNavigation/ANNAppDelegate.h +66 -0
  822. package/ios/Public/ApexNavigation/ANNSceneDelegate.h +19 -0
  823. package/ios/Public/ApexNavigation/ApexNavigation.h +92 -0
  824. package/ios/Public/module.modulemap +8 -0
  825. package/ios/RECIPES.md +41 -0
  826. package/ios/React/ANNComponentType.h +22 -0
  827. package/ios/React/ANNComponentViewCreator.h +18 -0
  828. package/ios/React/ANNReactComponentRegistry.h +53 -0
  829. package/ios/React/ANNReactComponentRegistry.mm +153 -0
  830. package/ios/React/ANNReactView.h +104 -0
  831. package/ios/React/ANNReactView.mm +374 -0
  832. package/ios/React/ANNReactViewCreator.h +20 -0
  833. package/ios/React/ANNReactViewCreator.mm +42 -0
  834. package/ios/React/ANNSafeAreaViewComponentView.h +13 -0
  835. package/ios/React/ANNSafeAreaViewComponentView.mm +153 -0
  836. package/ios/React/ANNSurfaceHostingView.h +17 -0
  837. package/ios/React/ANNSurfaceHostingView.mm +68 -0
  838. package/ios/React/Slots/ANNSlotComponentView.h +10 -0
  839. package/ios/React/Slots/ANNSlotComponentView.mm +122 -0
  840. package/ios/React/Slots/ANNSlotContainers.h +34 -0
  841. package/ios/React/Slots/ANNSlotContainers.mm +39 -0
  842. package/ios/React/Slots/ANNSlotContentView.h +12 -0
  843. package/ios/React/Slots/ANNSlotContentView.mm +18 -0
  844. package/ios/React/Slots/ANNSlotHost.h +29 -0
  845. package/ios/React/Slots/ANNSlotHost.mm +59 -0
  846. package/ios/React/Slots/ANNSlotScreenView.h +38 -0
  847. package/ios/React/Slots/ANNSlotScreenView.mm +254 -0
  848. package/ios/TopBar/ANNBackButtonPresenter.h +35 -0
  849. package/ios/TopBar/ANNBackButtonPresenter.mm +187 -0
  850. package/ios/TopBar/ANNBarAppearance.h +53 -0
  851. package/ios/TopBar/ANNBarAppearance.mm +278 -0
  852. package/ios/TopBar/ANNBarBackgroundComponent.h +46 -0
  853. package/ios/TopBar/ANNBarBackgroundComponent.mm +163 -0
  854. package/ios/TopBar/ANNBarButtonComponentView.h +30 -0
  855. package/ios/TopBar/ANNBarButtonComponentView.mm +110 -0
  856. package/ios/TopBar/ANNBarButtons.h +65 -0
  857. package/ios/TopBar/ANNBarButtons.mm +1125 -0
  858. package/ios/TopBar/ANNBarComponentsWait.h +37 -0
  859. package/ios/TopBar/ANNBarComponentsWait.mm +116 -0
  860. package/ios/TopBar/ANNIconButtonImage.h +25 -0
  861. package/ios/TopBar/ANNIconButtonImage.mm +94 -0
  862. package/ios/TopBar/ANNLargeTitlePresenter.h +117 -0
  863. package/ios/TopBar/ANNLargeTitlePresenter.mm +402 -0
  864. package/ios/TopBar/ANNMainList.h +28 -0
  865. package/ios/TopBar/ANNMainList.mm +72 -0
  866. package/ios/TopBar/ANNScrollEdgeEffects.h +29 -0
  867. package/ios/TopBar/ANNScrollEdgeEffects.mm +122 -0
  868. package/ios/TopBar/ANNSearchPresenter.h +29 -0
  869. package/ios/TopBar/ANNSearchPresenter.mm +637 -0
  870. package/ios/TopBar/ANNSearchResultsViewController.h +16 -0
  871. package/ios/TopBar/ANNSearchResultsViewController.mm +56 -0
  872. package/ios/TopBar/ANNShowTextButton.h +22 -0
  873. package/ios/TopBar/ANNShowTextButton.mm +63 -0
  874. package/ios/TopBar/ANNTitleComponentView.h +37 -0
  875. package/ios/TopBar/ANNTitleComponentView.mm +86 -0
  876. package/ios/TopBar/ANNTitleGlassView.h +33 -0
  877. package/ios/TopBar/ANNTitleGlassView.mm +126 -0
  878. package/ios/TopBar/ANNTitleView.h +18 -0
  879. package/ios/TopBar/ANNTitleView.mm +63 -0
  880. package/ios/TopBar/ANNToolbarPresenter.h +26 -0
  881. package/ios/TopBar/ANNToolbarPresenter.mm +24 -0
  882. package/ios/TopBar/ANNTopBarPresenter.h +120 -0
  883. package/ios/TopBar/ANNTopBarPresenter.mm +1252 -0
  884. package/ios/TopBar/ANNUIBarButtonItem.h +16 -0
  885. package/ios/TopBar/ANNUIBarButtonItem.mm +5 -0
  886. package/ios/TurboModules/ANNTurboEventEmitter.h +31 -0
  887. package/ios/TurboModules/ANNTurboEventEmitter.mm +129 -0
  888. package/ios/TurboModules/ANNTurboModule.h +11 -0
  889. package/ios/TurboModules/ANNTurboModule.mm +626 -0
  890. package/ios/Utils/UIColor+ANNLuminance.h +13 -0
  891. package/ios/Utils/UIColor+ANNLuminance.mm +32 -0
  892. package/ios/Utils/UIView+Utils.h +12 -0
  893. package/ios/Utils/UIView+Utils.mm +21 -0
  894. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSafeAreaViewComponentDescriptor.h +19 -0
  895. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSafeAreaViewShadowNode.h +60 -0
  896. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSafeAreaViewState.h +33 -0
  897. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotComponentDescriptor.h +22 -0
  898. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotShadowNode.h +87 -0
  899. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +101 -0
  900. package/lib/module/ARCHITECTURE.md +289 -0
  901. package/lib/module/adapters/NativeANNTurboEventEmitter.js +12 -0
  902. package/lib/module/adapters/NativeANNTurboEventEmitter.js.map +1 -0
  903. package/lib/module/adapters/NativeANNTurboModule.js +13 -0
  904. package/lib/module/adapters/NativeANNTurboModule.js.map +1 -0
  905. package/lib/module/api/app/AppRegistry.js +52 -0
  906. package/lib/module/api/app/AppRegistry.js.map +1 -0
  907. package/lib/module/api/app/activeApp.js +12 -0
  908. package/lib/module/api/app/activeApp.js.map +1 -0
  909. package/lib/module/api/app/createNavigation.js +365 -0
  910. package/lib/module/api/app/createNavigation.js.map +1 -0
  911. package/lib/module/api/app/roots.js +20 -0
  912. package/lib/module/api/app/roots.js.map +1 -0
  913. package/lib/module/api/app/splash.js +124 -0
  914. package/lib/module/api/app/splash.js.map +1 -0
  915. package/lib/module/api/app/startFailure.js +38 -0
  916. package/lib/module/api/app/startFailure.js.map +1 -0
  917. package/lib/module/api/arrangement/arrangementState.js +86 -0
  918. package/lib/module/api/arrangement/arrangementState.js.map +1 -0
  919. package/lib/module/api/commands/commands.js +375 -0
  920. package/lib/module/api/commands/commands.js.map +1 -0
  921. package/lib/module/api/commands/errors.js +94 -0
  922. package/lib/module/api/commands/errors.js.map +1 -0
  923. package/lib/module/api/commands/presentation.js +4 -0
  924. package/lib/module/api/commands/presentation.js.map +1 -0
  925. package/lib/module/api/commands/sideMenus.js +134 -0
  926. package/lib/module/api/commands/sideMenus.js.map +1 -0
  927. package/lib/module/api/commands/transitions.js +245 -0
  928. package/lib/module/api/commands/transitions.js.map +1 -0
  929. package/lib/module/api/context/appContext.js +22 -0
  930. package/lib/module/api/context/appContext.js.map +1 -0
  931. package/lib/module/api/events/navigationEvents.js +69 -0
  932. package/lib/module/api/events/navigationEvents.js.map +1 -0
  933. package/lib/module/api/events/screenLifecycle.js +30 -0
  934. package/lib/module/api/events/screenLifecycle.js.map +1 -0
  935. package/lib/module/api/events/tabPresses.js +32 -0
  936. package/lib/module/api/events/tabPresses.js.map +1 -0
  937. package/lib/module/api/hinge/hinge.js +73 -0
  938. package/lib/module/api/hinge/hinge.js.map +1 -0
  939. package/lib/module/api/hooks/appHooks.js +26 -0
  940. package/lib/module/api/hooks/appHooks.js.map +1 -0
  941. package/lib/module/api/hooks/screenHooks.js +250 -0
  942. package/lib/module/api/hooks/screenHooks.js.map +1 -0
  943. package/lib/module/api/hooks/useArrangement.js +24 -0
  944. package/lib/module/api/hooks/useArrangement.js.map +1 -0
  945. package/lib/module/api/hooks/useHinge.js +29 -0
  946. package/lib/module/api/hooks/useHinge.js.map +1 -0
  947. package/lib/module/api/hooks/useNavigation.js +117 -0
  948. package/lib/module/api/hooks/useNavigation.js.map +1 -0
  949. package/lib/module/api/hooks/usePendingLink.js +12 -0
  950. package/lib/module/api/hooks/usePendingLink.js.map +1 -0
  951. package/lib/module/api/hooks/usePreview.js +97 -0
  952. package/lib/module/api/hooks/usePreview.js.map +1 -0
  953. package/lib/module/api/hooks/useReservedRegions.js +24 -0
  954. package/lib/module/api/hooks/useReservedRegions.js.map +1 -0
  955. package/lib/module/api/hooks/useSafeAreaInsets.js +25 -0
  956. package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -0
  957. package/lib/module/api/index.js +26 -0
  958. package/lib/module/api/index.js.map +1 -0
  959. package/lib/module/api/layout/Root.js +121 -0
  960. package/lib/module/api/layout/Root.js.map +1 -0
  961. package/lib/module/api/layout/Screen.js +52 -0
  962. package/lib/module/api/layout/Screen.js.map +1 -0
  963. package/lib/module/api/layout/SideMenu.js +85 -0
  964. package/lib/module/api/layout/SideMenu.js.map +1 -0
  965. package/lib/module/api/layout/SplitView.js +137 -0
  966. package/lib/module/api/layout/SplitView.js.map +1 -0
  967. package/lib/module/api/layout/Stack.js +36 -0
  968. package/lib/module/api/layout/Stack.js.map +1 -0
  969. package/lib/module/api/layout/Tabs.js +326 -0
  970. package/lib/module/api/layout/Tabs.js.map +1 -0
  971. package/lib/module/api/layout/element.js +100 -0
  972. package/lib/module/api/layout/element.js.map +1 -0
  973. package/lib/module/api/linking/linkPaths.js +132 -0
  974. package/lib/module/api/linking/linkPaths.js.map +1 -0
  975. package/lib/module/api/linking/linking.js +244 -0
  976. package/lib/module/api/linking/linking.js.map +1 -0
  977. package/lib/module/api/linking/pendingLinks.js +34 -0
  978. package/lib/module/api/linking/pendingLinks.js.map +1 -0
  979. package/lib/module/api/linking/types.js +4 -0
  980. package/lib/module/api/linking/types.js.map +1 -0
  981. package/lib/module/api/navigation.js +105 -0
  982. package/lib/module/api/navigation.js.map +1 -0
  983. package/lib/module/api/options/OptionsChain.js +158 -0
  984. package/lib/module/api/options/OptionsChain.js.map +1 -0
  985. package/lib/module/api/options/ScreenOptions.js +83 -0
  986. package/lib/module/api/options/ScreenOptions.js.map +1 -0
  987. package/lib/module/api/options/buttons.js +4 -0
  988. package/lib/module/api/options/buttons.js.map +1 -0
  989. package/lib/module/api/safeArea/ANNSafeAreaViewNativeComponent.ts +28 -0
  990. package/lib/module/api/safeArea/screenInsets.js +86 -0
  991. package/lib/module/api/safeArea/screenInsets.js.map +1 -0
  992. package/lib/module/api/safeArea/screenRegions.js +84 -0
  993. package/lib/module/api/safeArea/screenRegions.js.map +1 -0
  994. package/lib/module/api/screens/ScreenBoundary.js +44 -0
  995. package/lib/module/api/screens/ScreenBoundary.js.map +1 -0
  996. package/lib/module/api/screens/arrangement.js +63 -0
  997. package/lib/module/api/screens/arrangement.js.map +1 -0
  998. package/lib/module/api/screens/defineScreen.js +29 -0
  999. package/lib/module/api/screens/defineScreen.js.map +1 -0
  1000. package/lib/module/api/screens/nativeScreenCalls.js +34 -0
  1001. package/lib/module/api/screens/nativeScreenCalls.js.map +1 -0
  1002. package/lib/module/api/screens/nativeScreens.js +43 -0
  1003. package/lib/module/api/screens/nativeScreens.js.map +1 -0
  1004. package/lib/module/api/screens/registerScreens.js +305 -0
  1005. package/lib/module/api/screens/registerScreens.js.map +1 -0
  1006. package/lib/module/api/slots/ANNSlotNativeComponent.ts +23 -0
  1007. package/lib/module/api/slots/SlotHost.js +92 -0
  1008. package/lib/module/api/slots/SlotHost.js.map +1 -0
  1009. package/lib/module/api/state/navigationState.js +98 -0
  1010. package/lib/module/api/state/navigationState.js.map +1 -0
  1011. package/lib/module/api/testIDs.js +14 -0
  1012. package/lib/module/api/testIDs.js.map +1 -0
  1013. package/lib/module/api/theme/theme.js +180 -0
  1014. package/lib/module/api/theme/theme.js.map +1 -0
  1015. package/lib/module/api/types.js +4 -0
  1016. package/lib/module/api/types.js.map +1 -0
  1017. package/lib/module/engine/backListeners.js +39 -0
  1018. package/lib/module/engine/backListeners.js.map +1 -0
  1019. package/lib/module/engine/buttons.js +105 -0
  1020. package/lib/module/engine/buttons.js.map +1 -0
  1021. package/lib/module/engine/commands.js +388 -0
  1022. package/lib/module/engine/commands.js.map +1 -0
  1023. package/lib/module/engine/events.js +30 -0
  1024. package/lib/module/engine/events.js.map +1 -0
  1025. package/lib/module/engine/ids.js +10 -0
  1026. package/lib/module/engine/ids.js.map +1 -0
  1027. package/lib/module/engine/launchState.js +34 -0
  1028. package/lib/module/engine/launchState.js.map +1 -0
  1029. package/lib/module/engine/layout.js +202 -0
  1030. package/lib/module/engine/layout.js.map +1 -0
  1031. package/lib/module/engine/mergeOptions.js +23 -0
  1032. package/lib/module/engine/mergeOptions.js.map +1 -0
  1033. package/lib/module/engine/native.js +45 -0
  1034. package/lib/module/engine/native.js.map +1 -0
  1035. package/lib/module/engine/nativeScreens.js +265 -0
  1036. package/lib/module/engine/nativeScreens.js.map +1 -0
  1037. package/lib/module/engine/options.js +170 -0
  1038. package/lib/module/engine/options.js.map +1 -0
  1039. package/lib/module/engine/places.js +178 -0
  1040. package/lib/module/engine/places.js.map +1 -0
  1041. package/lib/module/engine/props.js +44 -0
  1042. package/lib/module/engine/props.js.map +1 -0
  1043. package/lib/module/engine/reactMeasures.js +23 -0
  1044. package/lib/module/engine/reactMeasures.js.map +1 -0
  1045. package/lib/module/engine/rememberedOptions.js +118 -0
  1046. package/lib/module/engine/rememberedOptions.js.map +1 -0
  1047. package/lib/module/engine/screens.js +194 -0
  1048. package/lib/module/engine/screens.js.map +1 -0
  1049. package/lib/module/engine/slots.js +200 -0
  1050. package/lib/module/engine/slots.js.map +1 -0
  1051. package/lib/module/engine/tabs.js +79 -0
  1052. package/lib/module/engine/tabs.js.map +1 -0
  1053. package/lib/module/index.js +5 -0
  1054. package/lib/module/index.js.map +1 -0
  1055. package/lib/module/interfaces/ComponentEvents.js +2 -0
  1056. package/lib/module/interfaces/ComponentEvents.js.map +1 -0
  1057. package/lib/module/interfaces/Events.js +2 -0
  1058. package/lib/module/interfaces/Events.js.map +1 -0
  1059. package/lib/module/interfaces/Layout.js +4 -0
  1060. package/lib/module/interfaces/Layout.js.map +1 -0
  1061. package/lib/module/interfaces/Options.js +4 -0
  1062. package/lib/module/interfaces/Options.js.map +1 -0
  1063. package/lib/module/interfaces/options/animations.js +2 -0
  1064. package/lib/module/interfaces/options/animations.js.map +1 -0
  1065. package/lib/module/interfaces/options/bottomTabs.js +4 -0
  1066. package/lib/module/interfaces/options/bottomTabs.js.map +1 -0
  1067. package/lib/module/interfaces/options/buttons.js +4 -0
  1068. package/lib/module/interfaces/options/buttons.js.map +1 -0
  1069. package/lib/module/interfaces/options/common.js +4 -0
  1070. package/lib/module/interfaces/options/common.js.map +1 -0
  1071. package/lib/module/interfaces/options/modals.js +2 -0
  1072. package/lib/module/interfaces/options/modals.js.map +1 -0
  1073. package/lib/module/interfaces/options/preview.js +2 -0
  1074. package/lib/module/interfaces/options/preview.js.map +1 -0
  1075. package/lib/module/interfaces/options/sideMenu.js +2 -0
  1076. package/lib/module/interfaces/options/sideMenu.js.map +1 -0
  1077. package/lib/module/interfaces/options/splitView.js +2 -0
  1078. package/lib/module/interfaces/options/splitView.js.map +1 -0
  1079. package/lib/module/interfaces/options/stack.js +4 -0
  1080. package/lib/module/interfaces/options/stack.js.map +1 -0
  1081. package/lib/module/interfaces/options/system.js +4 -0
  1082. package/lib/module/interfaces/options/system.js.map +1 -0
  1083. package/lib/module/interfaces/options/toolbar.js +4 -0
  1084. package/lib/module/interfaces/options/toolbar.js.map +1 -0
  1085. package/lib/module/interfaces/options/topBar.js +4 -0
  1086. package/lib/module/interfaces/options/topBar.js.map +1 -0
  1087. package/lib/module/package.json +1 -0
  1088. package/lib/typescript/adapters/NativeANNTurboEventEmitter.d.ts +14 -0
  1089. package/lib/typescript/adapters/NativeANNTurboEventEmitter.d.ts.map +1 -0
  1090. package/lib/typescript/adapters/NativeANNTurboModule.d.ts +77 -0
  1091. package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -0
  1092. package/lib/typescript/api/app/AppRegistry.d.ts +14 -0
  1093. package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -0
  1094. package/lib/typescript/api/app/activeApp.d.ts +12 -0
  1095. package/lib/typescript/api/app/activeApp.d.ts.map +1 -0
  1096. package/lib/typescript/api/app/createNavigation.d.ts +182 -0
  1097. package/lib/typescript/api/app/createNavigation.d.ts.map +1 -0
  1098. package/lib/typescript/api/app/roots.d.ts +15 -0
  1099. package/lib/typescript/api/app/roots.d.ts.map +1 -0
  1100. package/lib/typescript/api/app/splash.d.ts +81 -0
  1101. package/lib/typescript/api/app/splash.d.ts.map +1 -0
  1102. package/lib/typescript/api/app/startFailure.d.ts +15 -0
  1103. package/lib/typescript/api/app/startFailure.d.ts.map +1 -0
  1104. package/lib/typescript/api/arrangement/arrangementState.d.ts +21 -0
  1105. package/lib/typescript/api/arrangement/arrangementState.d.ts.map +1 -0
  1106. package/lib/typescript/api/commands/commands.d.ts +57 -0
  1107. package/lib/typescript/api/commands/commands.d.ts.map +1 -0
  1108. package/lib/typescript/api/commands/errors.d.ts +24 -0
  1109. package/lib/typescript/api/commands/errors.d.ts.map +1 -0
  1110. package/lib/typescript/api/commands/presentation.d.ts +69 -0
  1111. package/lib/typescript/api/commands/presentation.d.ts.map +1 -0
  1112. package/lib/typescript/api/commands/sideMenus.d.ts +14 -0
  1113. package/lib/typescript/api/commands/sideMenus.d.ts.map +1 -0
  1114. package/lib/typescript/api/commands/transitions.d.ts +33 -0
  1115. package/lib/typescript/api/commands/transitions.d.ts.map +1 -0
  1116. package/lib/typescript/api/context/appContext.d.ts +4 -0
  1117. package/lib/typescript/api/context/appContext.d.ts.map +1 -0
  1118. package/lib/typescript/api/events/navigationEvents.d.ts +70 -0
  1119. package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -0
  1120. package/lib/typescript/api/events/screenLifecycle.d.ts +5 -0
  1121. package/lib/typescript/api/events/screenLifecycle.d.ts.map +1 -0
  1122. package/lib/typescript/api/events/tabPresses.d.ts +5 -0
  1123. package/lib/typescript/api/events/tabPresses.d.ts.map +1 -0
  1124. package/lib/typescript/api/hinge/hinge.d.ts +21 -0
  1125. package/lib/typescript/api/hinge/hinge.d.ts.map +1 -0
  1126. package/lib/typescript/api/hooks/appHooks.d.ts +15 -0
  1127. package/lib/typescript/api/hooks/appHooks.d.ts.map +1 -0
  1128. package/lib/typescript/api/hooks/screenHooks.d.ts +74 -0
  1129. package/lib/typescript/api/hooks/screenHooks.d.ts.map +1 -0
  1130. package/lib/typescript/api/hooks/useArrangement.d.ts +13 -0
  1131. package/lib/typescript/api/hooks/useArrangement.d.ts.map +1 -0
  1132. package/lib/typescript/api/hooks/useHinge.d.ts +16 -0
  1133. package/lib/typescript/api/hooks/useHinge.d.ts.map +1 -0
  1134. package/lib/typescript/api/hooks/useNavigation.d.ts +108 -0
  1135. package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -0
  1136. package/lib/typescript/api/hooks/usePendingLink.d.ts +7 -0
  1137. package/lib/typescript/api/hooks/usePendingLink.d.ts.map +1 -0
  1138. package/lib/typescript/api/hooks/usePreview.d.ts +29 -0
  1139. package/lib/typescript/api/hooks/usePreview.d.ts.map +1 -0
  1140. package/lib/typescript/api/hooks/useReservedRegions.d.ts +13 -0
  1141. package/lib/typescript/api/hooks/useReservedRegions.d.ts.map +1 -0
  1142. package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts +14 -0
  1143. package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -0
  1144. package/lib/typescript/api/index.d.ts +60 -0
  1145. package/lib/typescript/api/index.d.ts.map +1 -0
  1146. package/lib/typescript/api/layout/Root.d.ts +47 -0
  1147. package/lib/typescript/api/layout/Root.d.ts.map +1 -0
  1148. package/lib/typescript/api/layout/Screen.d.ts +32 -0
  1149. package/lib/typescript/api/layout/Screen.d.ts.map +1 -0
  1150. package/lib/typescript/api/layout/SideMenu.d.ts +33 -0
  1151. package/lib/typescript/api/layout/SideMenu.d.ts.map +1 -0
  1152. package/lib/typescript/api/layout/SplitView.d.ts +48 -0
  1153. package/lib/typescript/api/layout/SplitView.d.ts.map +1 -0
  1154. package/lib/typescript/api/layout/Stack.d.ts +21 -0
  1155. package/lib/typescript/api/layout/Stack.d.ts.map +1 -0
  1156. package/lib/typescript/api/layout/Tabs.d.ts +120 -0
  1157. package/lib/typescript/api/layout/Tabs.d.ts.map +1 -0
  1158. package/lib/typescript/api/layout/element.d.ts +52 -0
  1159. package/lib/typescript/api/layout/element.d.ts.map +1 -0
  1160. package/lib/typescript/api/linking/linkPaths.d.ts +31 -0
  1161. package/lib/typescript/api/linking/linkPaths.d.ts.map +1 -0
  1162. package/lib/typescript/api/linking/linking.d.ts +37 -0
  1163. package/lib/typescript/api/linking/linking.d.ts.map +1 -0
  1164. package/lib/typescript/api/linking/pendingLinks.d.ts +8 -0
  1165. package/lib/typescript/api/linking/pendingLinks.d.ts.map +1 -0
  1166. package/lib/typescript/api/linking/types.d.ts +105 -0
  1167. package/lib/typescript/api/linking/types.d.ts.map +1 -0
  1168. package/lib/typescript/api/navigation.d.ts +115 -0
  1169. package/lib/typescript/api/navigation.d.ts.map +1 -0
  1170. package/lib/typescript/api/options/OptionsChain.d.ts +47 -0
  1171. package/lib/typescript/api/options/OptionsChain.d.ts.map +1 -0
  1172. package/lib/typescript/api/options/ScreenOptions.d.ts +32 -0
  1173. package/lib/typescript/api/options/ScreenOptions.d.ts.map +1 -0
  1174. package/lib/typescript/api/options/buttons.d.ts +35 -0
  1175. package/lib/typescript/api/options/buttons.d.ts.map +1 -0
  1176. package/lib/typescript/api/safeArea/ANNSafeAreaViewNativeComponent.d.ts +20 -0
  1177. package/lib/typescript/api/safeArea/ANNSafeAreaViewNativeComponent.d.ts.map +1 -0
  1178. package/lib/typescript/api/safeArea/screenInsets.d.ts +20 -0
  1179. package/lib/typescript/api/safeArea/screenInsets.d.ts.map +1 -0
  1180. package/lib/typescript/api/safeArea/screenRegions.d.ts +24 -0
  1181. package/lib/typescript/api/safeArea/screenRegions.d.ts.map +1 -0
  1182. package/lib/typescript/api/screens/ScreenBoundary.d.ts +34 -0
  1183. package/lib/typescript/api/screens/ScreenBoundary.d.ts.map +1 -0
  1184. package/lib/typescript/api/screens/arrangement.d.ts +70 -0
  1185. package/lib/typescript/api/screens/arrangement.d.ts.map +1 -0
  1186. package/lib/typescript/api/screens/defineScreen.d.ts +41 -0
  1187. package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -0
  1188. package/lib/typescript/api/screens/nativeScreenCalls.d.ts +3 -0
  1189. package/lib/typescript/api/screens/nativeScreenCalls.d.ts.map +1 -0
  1190. package/lib/typescript/api/screens/nativeScreens.d.ts +47 -0
  1191. package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -0
  1192. package/lib/typescript/api/screens/registerScreens.d.ts +61 -0
  1193. package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -0
  1194. package/lib/typescript/api/slots/ANNSlotNativeComponent.d.ts +15 -0
  1195. package/lib/typescript/api/slots/ANNSlotNativeComponent.d.ts.map +1 -0
  1196. package/lib/typescript/api/slots/SlotHost.d.ts +8 -0
  1197. package/lib/typescript/api/slots/SlotHost.d.ts.map +1 -0
  1198. package/lib/typescript/api/state/navigationState.d.ts +26 -0
  1199. package/lib/typescript/api/state/navigationState.d.ts.map +1 -0
  1200. package/lib/typescript/api/testIDs.d.ts +12 -0
  1201. package/lib/typescript/api/testIDs.d.ts.map +1 -0
  1202. package/lib/typescript/api/theme/theme.d.ts +70 -0
  1203. package/lib/typescript/api/theme/theme.d.ts.map +1 -0
  1204. package/lib/typescript/api/types.d.ts +64 -0
  1205. package/lib/typescript/api/types.d.ts.map +1 -0
  1206. package/lib/typescript/engine/backListeners.d.ts +8 -0
  1207. package/lib/typescript/engine/backListeners.d.ts.map +1 -0
  1208. package/lib/typescript/engine/buttons.d.ts +11 -0
  1209. package/lib/typescript/engine/buttons.d.ts.map +1 -0
  1210. package/lib/typescript/engine/commands.d.ts +38 -0
  1211. package/lib/typescript/engine/commands.d.ts.map +1 -0
  1212. package/lib/typescript/engine/events.d.ts +17 -0
  1213. package/lib/typescript/engine/events.d.ts.map +1 -0
  1214. package/lib/typescript/engine/ids.d.ts +3 -0
  1215. package/lib/typescript/engine/ids.d.ts.map +1 -0
  1216. package/lib/typescript/engine/launchState.d.ts +25 -0
  1217. package/lib/typescript/engine/launchState.d.ts.map +1 -0
  1218. package/lib/typescript/engine/layout.d.ts +32 -0
  1219. package/lib/typescript/engine/layout.d.ts.map +1 -0
  1220. package/lib/typescript/engine/mergeOptions.d.ts +6 -0
  1221. package/lib/typescript/engine/mergeOptions.d.ts.map +1 -0
  1222. package/lib/typescript/engine/native.d.ts +22 -0
  1223. package/lib/typescript/engine/native.d.ts.map +1 -0
  1224. package/lib/typescript/engine/nativeScreens.d.ts +49 -0
  1225. package/lib/typescript/engine/nativeScreens.d.ts.map +1 -0
  1226. package/lib/typescript/engine/options.d.ts +12 -0
  1227. package/lib/typescript/engine/options.d.ts.map +1 -0
  1228. package/lib/typescript/engine/places.d.ts +57 -0
  1229. package/lib/typescript/engine/places.d.ts.map +1 -0
  1230. package/lib/typescript/engine/props.d.ts +10 -0
  1231. package/lib/typescript/engine/props.d.ts.map +1 -0
  1232. package/lib/typescript/engine/reactMeasures.d.ts +3 -0
  1233. package/lib/typescript/engine/reactMeasures.d.ts.map +1 -0
  1234. package/lib/typescript/engine/rememberedOptions.d.ts +28 -0
  1235. package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -0
  1236. package/lib/typescript/engine/screens.d.ts +90 -0
  1237. package/lib/typescript/engine/screens.d.ts.map +1 -0
  1238. package/lib/typescript/engine/slots.d.ts +71 -0
  1239. package/lib/typescript/engine/slots.d.ts.map +1 -0
  1240. package/lib/typescript/engine/tabs.d.ts +24 -0
  1241. package/lib/typescript/engine/tabs.d.ts.map +1 -0
  1242. package/lib/typescript/index.d.ts +3 -0
  1243. package/lib/typescript/index.d.ts.map +1 -0
  1244. package/lib/typescript/interfaces/ComponentEvents.d.ts +189 -0
  1245. package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -0
  1246. package/lib/typescript/interfaces/Events.d.ts +199 -0
  1247. package/lib/typescript/interfaces/Events.d.ts.map +1 -0
  1248. package/lib/typescript/interfaces/Layout.d.ts +150 -0
  1249. package/lib/typescript/interfaces/Layout.d.ts.map +1 -0
  1250. package/lib/typescript/interfaces/Options.d.ts +93 -0
  1251. package/lib/typescript/interfaces/Options.d.ts.map +1 -0
  1252. package/lib/typescript/interfaces/options/animations.d.ts +452 -0
  1253. package/lib/typescript/interfaces/options/animations.d.ts.map +1 -0
  1254. package/lib/typescript/interfaces/options/bottomTabs.d.ts +462 -0
  1255. package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -0
  1256. package/lib/typescript/interfaces/options/buttons.d.ts +331 -0
  1257. package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -0
  1258. package/lib/typescript/interfaces/options/common.d.ts +51 -0
  1259. package/lib/typescript/interfaces/options/common.d.ts.map +1 -0
  1260. package/lib/typescript/interfaces/options/modals.d.ts +202 -0
  1261. package/lib/typescript/interfaces/options/modals.d.ts.map +1 -0
  1262. package/lib/typescript/interfaces/options/preview.d.ts +40 -0
  1263. package/lib/typescript/interfaces/options/preview.d.ts.map +1 -0
  1264. package/lib/typescript/interfaces/options/sideMenu.d.ts +130 -0
  1265. package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -0
  1266. package/lib/typescript/interfaces/options/splitView.d.ts +118 -0
  1267. package/lib/typescript/interfaces/options/splitView.d.ts.map +1 -0
  1268. package/lib/typescript/interfaces/options/stack.d.ts +109 -0
  1269. package/lib/typescript/interfaces/options/stack.d.ts.map +1 -0
  1270. package/lib/typescript/interfaces/options/system.d.ts +238 -0
  1271. package/lib/typescript/interfaces/options/system.d.ts.map +1 -0
  1272. package/lib/typescript/interfaces/options/toolbar.d.ts +45 -0
  1273. package/lib/typescript/interfaces/options/toolbar.d.ts.map +1 -0
  1274. package/lib/typescript/interfaces/options/topBar.d.ts +804 -0
  1275. package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -0
  1276. package/lib/typescript/package.json +1 -0
  1277. package/package.json +166 -4
  1278. package/react-native.config.js +22 -0
  1279. package/src/ARCHITECTURE.md +289 -0
  1280. package/src/adapters/NativeANNTurboEventEmitter.ts +15 -0
  1281. package/src/adapters/NativeANNTurboModule.ts +100 -0
  1282. package/src/api/app/AppRegistry.ts +57 -0
  1283. package/src/api/app/activeApp.ts +20 -0
  1284. package/src/api/app/createNavigation.ts +566 -0
  1285. package/src/api/app/roots.ts +40 -0
  1286. package/src/api/app/splash.ts +154 -0
  1287. package/src/api/app/startFailure.tsx +39 -0
  1288. package/src/api/arrangement/arrangementState.ts +98 -0
  1289. package/src/api/commands/commands.ts +371 -0
  1290. package/src/api/commands/errors.ts +99 -0
  1291. package/src/api/commands/presentation.ts +78 -0
  1292. package/src/api/commands/sideMenus.ts +122 -0
  1293. package/src/api/commands/transitions.ts +133 -0
  1294. package/src/api/context/appContext.ts +23 -0
  1295. package/src/api/events/navigationEvents.ts +175 -0
  1296. package/src/api/events/screenLifecycle.ts +27 -0
  1297. package/src/api/events/tabPresses.ts +35 -0
  1298. package/src/api/hinge/hinge.ts +84 -0
  1299. package/src/api/hooks/appHooks.ts +37 -0
  1300. package/src/api/hooks/screenHooks.ts +272 -0
  1301. package/src/api/hooks/useArrangement.ts +26 -0
  1302. package/src/api/hooks/useHinge.ts +26 -0
  1303. package/src/api/hooks/useNavigation.ts +267 -0
  1304. package/src/api/hooks/usePendingLink.ts +11 -0
  1305. package/src/api/hooks/usePreview.ts +111 -0
  1306. package/src/api/hooks/useReservedRegions.ts +26 -0
  1307. package/src/api/hooks/useSafeAreaInsets.ts +23 -0
  1308. package/src/api/index.ts +139 -0
  1309. package/src/api/layout/Root.ts +113 -0
  1310. package/src/api/layout/Screen.ts +55 -0
  1311. package/src/api/layout/SideMenu.ts +87 -0
  1312. package/src/api/layout/SplitView.ts +146 -0
  1313. package/src/api/layout/Stack.ts +48 -0
  1314. package/src/api/layout/Tabs.ts +339 -0
  1315. package/src/api/layout/element.ts +114 -0
  1316. package/src/api/linking/linkPaths.ts +159 -0
  1317. package/src/api/linking/linking.ts +242 -0
  1318. package/src/api/linking/pendingLinks.ts +37 -0
  1319. package/src/api/linking/types.ts +130 -0
  1320. package/src/api/navigation.ts +269 -0
  1321. package/src/api/options/OptionsChain.ts +142 -0
  1322. package/src/api/options/ScreenOptions.ts +81 -0
  1323. package/src/api/options/buttons.ts +43 -0
  1324. package/src/api/safeArea/ANNSafeAreaViewNativeComponent.ts +28 -0
  1325. package/src/api/safeArea/screenInsets.ts +86 -0
  1326. package/src/api/safeArea/screenRegions.ts +99 -0
  1327. package/src/api/screens/ScreenBoundary.tsx +52 -0
  1328. package/src/api/screens/arrangement.ts +106 -0
  1329. package/src/api/screens/defineScreen.ts +57 -0
  1330. package/src/api/screens/nativeScreenCalls.ts +59 -0
  1331. package/src/api/screens/nativeScreens.ts +58 -0
  1332. package/src/api/screens/registerScreens.tsx +364 -0
  1333. package/src/api/slots/ANNSlotNativeComponent.ts +23 -0
  1334. package/src/api/slots/SlotHost.tsx +64 -0
  1335. package/src/api/state/navigationState.ts +95 -0
  1336. package/src/api/testIDs.ts +11 -0
  1337. package/src/api/theme/theme.ts +184 -0
  1338. package/src/api/types.ts +95 -0
  1339. package/src/engine/backListeners.ts +36 -0
  1340. package/src/engine/buttons.ts +91 -0
  1341. package/src/engine/commands.ts +469 -0
  1342. package/src/engine/events.ts +24 -0
  1343. package/src/engine/ids.ts +7 -0
  1344. package/src/engine/launchState.ts +35 -0
  1345. package/src/engine/layout.ts +247 -0
  1346. package/src/engine/mergeOptions.ts +20 -0
  1347. package/src/engine/native.ts +51 -0
  1348. package/src/engine/nativeScreens.ts +263 -0
  1349. package/src/engine/options.ts +165 -0
  1350. package/src/engine/places.ts +205 -0
  1351. package/src/engine/props.ts +45 -0
  1352. package/src/engine/reactMeasures.ts +24 -0
  1353. package/src/engine/rememberedOptions.ts +111 -0
  1354. package/src/engine/screens.tsx +239 -0
  1355. package/src/engine/slots.ts +191 -0
  1356. package/src/engine/tabs.ts +95 -0
  1357. package/src/index.ts +3 -0
  1358. package/src/interfaces/ComponentEvents.ts +214 -0
  1359. package/src/interfaces/Events.ts +227 -0
  1360. package/src/interfaces/Layout.ts +161 -0
  1361. package/src/interfaces/Options.ts +175 -0
  1362. package/src/interfaces/options/animations.ts +480 -0
  1363. package/src/interfaces/options/bottomTabs.ts +481 -0
  1364. package/src/interfaces/options/buttons.ts +364 -0
  1365. package/src/interfaces/options/common.ts +76 -0
  1366. package/src/interfaces/options/modals.ts +217 -0
  1367. package/src/interfaces/options/preview.ts +40 -0
  1368. package/src/interfaces/options/sideMenu.ts +132 -0
  1369. package/src/interfaces/options/splitView.ts +127 -0
  1370. package/src/interfaces/options/stack.ts +110 -0
  1371. package/src/interfaces/options/system.ts +252 -0
  1372. package/src/interfaces/options/toolbar.ts +47 -0
  1373. package/src/interfaces/options/topBar.ts +828 -0
@@ -0,0 +1,1274 @@
1
+ package dev.apexnative.navigation.viewcontrollers.stack
2
+
3
+ import dev.apexnative.navigation.options.BottomTabsEnterExitAnimationOptions
4
+ import dev.apexnative.navigation.options.DefaultOptions
5
+ import dev.apexnative.navigation.options.Options
6
+ import dev.apexnative.navigation.options.StackAnimationOptions
7
+ import dev.apexnative.navigation.options.TopBarEnterExitAnimationOptions
8
+ import dev.apexnative.navigation.react.CommandAnswer
9
+ import dev.apexnative.navigation.react.CommandListener
10
+ import dev.apexnative.navigation.react.ErrorTexts
11
+ import dev.apexnative.navigation.react.ReloadCoordinator
12
+ import dev.apexnative.navigation.react.events.AppearanceDispatcher
13
+ import dev.apexnative.navigation.viewcontrollers.bottomtabs.TabBarMotion
14
+ import dev.apexnative.navigation.viewcontrollers.component.Readiness
15
+ import dev.apexnative.navigation.viewcontrollers.component.RenderWait
16
+ import dev.apexnative.navigation.viewcontrollers.parent.OptionsScreen
17
+ import dev.apexnative.navigation.viewcontrollers.stack.StackDisplay.BarMotion
18
+ import dev.apexnative.navigation.viewcontrollers.stack.StackDisplay.BarVisibility
19
+ import dev.apexnative.navigation.viewcontrollers.stack.StackDisplay.Custom
20
+ import dev.apexnative.navigation.viewcontrollers.stack.StackDisplay.Elements
21
+ import dev.apexnative.navigation.viewcontrollers.stack.StackDisplay.Fade
22
+ import dev.apexnative.navigation.viewcontrollers.stack.StackDisplay.Motion
23
+ import dev.apexnative.navigation.viewcontrollers.viewcontroller.ViewController
24
+ import dev.apexnative.navigation.views.animations.AnimationRules
25
+ import java.util.WeakHashMap
26
+
27
+ private typealias Node = ViewController<*>
28
+
29
+ /**
30
+ * The one queue of a stack: every command of the stack, every back of the user and every return of its container goes
31
+ * through it, runs by one table and answers once. It knows no views: it drives a [StackDisplay], the readiness of the
32
+ * screens and a clock, so the unit tests run it with fakes. Main thread only.
33
+ *
34
+ * It keeps two lists, bottom to top. [entries] is the stack as JavaScript sees it: changed at once when an operation
35
+ * is accepted, and every check of a later command reads it. [shown] is what the container shows, changed as each
36
+ * operation runs; its last is the current child. The state is "rest", "waiting" (the newest started operation, a push
37
+ * or a `setStackRoot`, waits for its screen to render) or "transition" (transitions run; on Android they may overlap).
38
+ *
39
+ * The table, as the state reads it: a push waits behind a waiting push and completes a waiting `setStackRoot` at
40
+ * once; a cut (pop, `popTo`, `popToRoot`, a key that goes back, back of the user) and a replace (`setStackRoot`, the
41
+ * split view's `setRoot`) interrupt a waiting push and complete a waiting `setStackRoot` at once; a cut or a replace
42
+ * accepted while pushes are queued interrupts those it removes; a `none` (`popTo` of the top) waits behind a waiting
43
+ * operation. Otherwise everything runs at once: a transition that starts takes the screens it moves over from the
44
+ * transitions running, which stop them where they are, and each transition ends when the last screen it still owns
45
+ * comes to rest, reporting only what it still owns. A running push whose screens a cut takes over ends then; a pop
46
+ * never does; a replace accepted while a `setStackRoot` runs completes it at once, and the end of a replace stops only
47
+ * the screens it destroys. Off screen or without a view, every operation runs at once, without a wait or a transition.
48
+ * Each end: `ANN.ComponentWillAppear` at the start; at the end `DidDisappear`, `DidAppear`, the navigation state,
49
+ * `ANN.ScreenPopped` of each screen that left (top to bottom), their destroys, the answer, `ANN.CommandCompleted`
50
+ * (`AppearanceDispatcher.endTransition`).
51
+ *
52
+ * Its waits for a screen to render are the core's one wait ([RenderWait]), on the screen it pushes or sets as the top;
53
+ * the readiness signals reach it through [deliver] (the stack posts them to the next turn of the main loop: a signal
54
+ * that comes inside a layout pass or a view's attach moves no view of the container there). A push or a
55
+ * `setStackRoot` with elements waits for its targets after that, a wait like the others: a cut or a replace during it
56
+ * interrupts the push, which moves no view into a layer.
57
+ *
58
+ * The transition is the screens' own when the options say so (`AnimationRules.stackIsOwn`): the display plays each
59
+ * screen's side ([StackDisplay.animateCustom]) with the same owners as the default transitions; the bar's row then
60
+ * changes at once, and with elements the bars show or hide at once too.
61
+ */
62
+ internal class StackQueue(
63
+ display: StackDisplay,
64
+ private val readiness: Readiness,
65
+ private val scheduler: AppearanceDispatcher.Scheduler,
66
+ private val host: Host,
67
+ private val deliver: (() -> Unit) -> Unit = { it() },
68
+ ) {
69
+ /** What the queue tells the stack. */
70
+ interface Host {
71
+ /** The current child (the top of [shown]) changed: a transition started, or an operation ran at once. */
72
+ fun currentChildChanged()
73
+
74
+ /**
75
+ * The current child is about to change, right before [currentChildChanged]: [motion] is the default transition
76
+ * the bar's row goes with, none when the change comes at once or with an animation of its own; [visibility] is
77
+ * how the bar shows or hides when the new top wants it otherwise.
78
+ */
79
+ fun barTransition(motion: StackDisplay.BarMotion?, visibility: BarVisibility) = Unit
80
+
81
+ /**
82
+ * The current child is about to change, right before [barTransition]: [move] is how the transition goes, which
83
+ * the tab bar of tabs around the stack follows when the new top shows or hides it; [side] the transition's
84
+ * `bottomTabs` with [TabBarMotion.Move.Slide].
85
+ */
86
+ fun tabBarTransition(move: TabBarMotion.Move, side: BottomTabsEnterExitAnimationOptions?) = Unit
87
+
88
+ /** [node] was accepted to show as the top (a push, the new top of a replace). */
89
+ fun willShow(node: Node) = Unit
90
+
91
+ /**
92
+ * An operation ended or was rejected: what back does may have changed. [topSettled]: the screen on top came to
93
+ * rest — the queue is at rest, or the operation that ended brought the current child (the FAB follows it then).
94
+ */
95
+ fun operationEnded(topSettled: Boolean)
96
+
97
+ /**
98
+ * Whether [node] is a React screen with a root of its own, which a push prepares when its switch is on
99
+ * ([StackSwitches.preparesOwnRootPushes]).
100
+ */
101
+ fun isOwnRootScreen(node: Node): Boolean = false
102
+
103
+ /** One line for the log: a failure that has no command to answer. */
104
+ fun log(text: String) = Unit
105
+
106
+ /** The id the command of [kind] answers with for [entry] (`StackController.answerIdOf`). */
107
+ fun answerIdOf(entry: Node, kind: AnswerKind): String
108
+ }
109
+
110
+ /** The command an answer is for: what the stack answers with depends on it ([Host.answerIdOf]). */
111
+ enum class AnswerKind {
112
+ /** `push`. */
113
+ Push,
114
+
115
+ /** `setStackRoot`, and the split view's `showInColumn` through it. */
116
+ Replace,
117
+
118
+ /** `pop`, `popToRoot`, a key that goes back to its entry. */
119
+ Back,
120
+ }
121
+
122
+ /** What shows the stack; the unit tests may give another. */
123
+ var display: StackDisplay = display
124
+
125
+ private val entryList = ArrayList<Node>()
126
+ private val shownList = ArrayList<Node>()
127
+ // Screens that left [shownList] and are not destroyed yet: their transition still moves them.
128
+ private val leavingList = ArrayList<Node>()
129
+ private var waiting: Op? = null
130
+ private val queued = ArrayDeque<Op>()
131
+ private val running = ArrayList<Op>()
132
+ // Lower screens whose content isn't made yet, and those placed in the container until it is.
133
+ private val unrendered = LinkedHashSet<Node>()
134
+ private val lowerWaits = HashMap<Node, () -> Unit>()
135
+ // The operation, by its sequence, whose acceptance took each entry away.
136
+ private val removedAt = WeakHashMap<Node, Int>()
137
+ private var sequence = 0
138
+ private var draining = false
139
+ // Operations end because a newer one took over all they moved (finishTakenOver).
140
+ private var takenOver = false
141
+ private var destroyed = false
142
+
143
+ /** The stack as JavaScript sees it, bottom to top. */
144
+ val entries: List<Node>
145
+ get() = entryList
146
+
147
+ /** What the stack's container shows, bottom to top. */
148
+ val shown: List<Node>
149
+ get() = shownList
150
+
151
+ /** The top of [shown]: the screen the user sees; none before the first. */
152
+ val currentChild: Node?
153
+ get() = shownList.lastOrNull()
154
+
155
+ /** The screen of the operation that waits for it to render; none. */
156
+ val waitingScreen: Node?
157
+ get() = when (val op = waiting) {
158
+ is PushOp -> op.node
159
+ is ReplaceOp -> op.top
160
+ else -> null
161
+ }
162
+
163
+ /** Nothing runs, nothing waits, nothing is queued. */
164
+ val isAtRest: Boolean
165
+ get() = waiting == null && running.isEmpty() && queued.isEmpty()
166
+
167
+ /**
168
+ * Every node the stack holds, bottom first: [entries] first (the split view reads the first screen there), then
169
+ * what still shows or leaves, and the nodes of operations accepted and not run yet.
170
+ */
171
+ fun nodes(): List<Node> {
172
+ val nodes = LinkedHashSet<Node>(entryList)
173
+ nodes += shownList
174
+ nodes += leavingList
175
+ (waiting as? ReplaceOp)?.let { nodes += it.nodes }
176
+ queued.forEach { if (it is PushOp) nodes += it.node }
177
+ return nodes.toList()
178
+ }
179
+
180
+ /** The screens a stack is made with (a root, a tab, a modal): the last shows, the others render after it. */
181
+ fun setInitial(screens: List<Node>) {
182
+ entryList += screens
183
+ shownList += screens
184
+ unrendered += screens.dropLast(1)
185
+ }
186
+
187
+ // Acceptance: the lists JavaScript relies on change now; the operation runs in its turn.
188
+
189
+ /** `push` of [node], accepted: it is an entry now, and runs in its turn ([answer] with its id). */
190
+ fun push(node: Node, answer: CommandAnswer?, componentId: String, what: String, prepared: Boolean = false) {
191
+ if (destroyed) return refuse(answer, null, componentId, listOf(node))
192
+ entryList += node
193
+ host.willShow(node)
194
+ val op = PushOp(nextSequence(), answer, componentId, what, node, prepared)
195
+ // A push completes a waiting `setStackRoot` at once, whatever waits behind it.
196
+ (waiting as? ReplaceOp)?.let(::completeAtOnce)
197
+ enqueue(op)
198
+ }
199
+
200
+ /**
201
+ * A cut to [target], an entry that becomes the top: every entry above it leaves. [answer] gets [value]; a back of
202
+ * the user has none. [silent]: no animation and no appearance events (`popToRootOnBlur`).
203
+ */
204
+ fun cut(
205
+ target: Node,
206
+ answer: CommandAnswer?,
207
+ componentId: String,
208
+ what: String,
209
+ value: String?,
210
+ silent: Boolean = false,
211
+ ) {
212
+ val index = entryList.indexOf(target)
213
+ if (destroyed || index < 0) return refuse(answer, null, componentId, emptyList())
214
+ val removed = entryList.subList(index + 1, entryList.size).toList()
215
+ entryList.subList(index + 1, entryList.size).clear()
216
+ val seq = nextSequence()
217
+ removed.forEach { removedAt[it] = seq }
218
+ interruptPushesOf(removed)
219
+ (waiting as? ReplaceOp)?.let(::completeAtOnce)
220
+ val showsAbove = target in shownList && shownList.last() !== target
221
+ val op = if (showsAbove) {
222
+ CutOp(seq, answer, componentId, what, target, value, silent)
223
+ } else {
224
+ // A cut that moves nothing more: its answer at its turn.
225
+ NoneOp(seq, answer, null, componentId, what, value, null)
226
+ }
227
+ enqueue(op)
228
+ }
229
+
230
+ /**
231
+ * A replace of every entry by [nodes] (`setStackRoot`, the split view's `setRoot`): [animated] or not, [asPush]
232
+ * with the push transition; [waits] for its new top to render (not for the split view). [answer] or [listener] get
233
+ * the id of the new top.
234
+ */
235
+ fun replace(
236
+ nodes: List<Node>,
237
+ animated: Boolean,
238
+ asPush: Boolean,
239
+ answer: CommandAnswer?,
240
+ listener: CommandListener?,
241
+ componentId: String,
242
+ what: String,
243
+ waits: Boolean = true,
244
+ ) {
245
+ if (destroyed || nodes.isEmpty()) return refuse(answer, listener, componentId, nodes)
246
+ val old = entryList.toList()
247
+ entryList.clear()
248
+ entryList += nodes
249
+ host.willShow(nodes.last())
250
+ val seq = nextSequence()
251
+ old.forEach { if (it !in nodes) removedAt[it] = seq }
252
+ interruptPushesOf(old)
253
+ (waiting as? ReplaceOp)?.let(::completeAtOnce)
254
+ running.filterIsInstance<ReplaceOp>().forEach(::completeRunning)
255
+ enqueue(ReplaceOp(seq, answer, listener, componentId, what, nodes.toList(), animated, asPush, waits))
256
+ }
257
+
258
+ /**
259
+ * An operation that moves nothing (`popTo` of the top): [value] in its turn, decided at its acceptance (C6); it
260
+ * rejects only when an operation accepted before it took [target] away.
261
+ */
262
+ fun none(value: String, target: Node?, answer: CommandAnswer?, componentId: String, what: String) {
263
+ if (destroyed) return refuse(answer, null, componentId, emptyList())
264
+ enqueue(NoneOp(nextSequence(), answer, null, componentId, what, value, target))
265
+ }
266
+
267
+ // An operation that comes to a destroyed stack, or for a target that isn't an entry: it rejects, and what was made
268
+ // for it goes (nothing hangs).
269
+ private fun refuse(answer: CommandAnswer?, listener: CommandListener?, componentId: String, made: List<Node>) {
270
+ made.forEach { if (it !in entryList) it.destroy() }
271
+ val text = ErrorTexts.screenNotShown(componentId)
272
+ answer?.reject(text)
273
+ listener?.onError(text)
274
+ }
275
+
276
+ /**
277
+ * The stack went off screen (its tab unselected, a modal over it): what waits for its screen runs now as off
278
+ * screen, without a transition and without marking the content ready.
279
+ */
280
+ fun wentOffScreen() {
281
+ val op = waiting ?: return
282
+ stopWaiting(op)
283
+ guarded(op) {
284
+ when (op) {
285
+ is PushOp -> pushAtOnce(op)
286
+ is ReplaceOp -> beginReplace(op, atOnce = true)
287
+ else -> Unit
288
+ }
289
+ }
290
+ drain()
291
+ }
292
+
293
+ /**
294
+ * The lower screens make their content in the window: each is placed in the container under the top until its
295
+ * content is ready or [LOWER_SCREEN_MILLIS] passed. Only while the stack is on screen; the others wait for its next
296
+ * appearance.
297
+ */
298
+ fun renderLowerScreens() {
299
+ if (destroyed || !onScreen()) return
300
+ val top = currentChild
301
+ for (screen in unrendered.toList()) {
302
+ unrendered -= screen
303
+ if (screen === top || screen !in shownList || screen.isDestroyed) continue
304
+ protectLower(screen) { placeLower(screen) }
305
+ }
306
+ }
307
+
308
+ /**
309
+ * The stack is destroyed (a new root, its modal dismissed, its tab gone): what waits, what is queued and what
310
+ * runs rejects with `the screen '<id>' is not shown`, in the order they came; their animators stop (on a copy); a
311
+ * back of the user ends without a word. The nodes stay for the stack to destroy.
312
+ */
313
+ fun destroy() {
314
+ if (destroyed) return
315
+ destroyed = true
316
+ val ops = ArrayList<Op>()
317
+ waiting?.let {
318
+ stopWaiting(it)
319
+ ops += it
320
+ }
321
+ ops += queued
322
+ queued.clear()
323
+ val transitions = running.toList()
324
+ running.clear()
325
+ for (op in transitions) {
326
+ op.animating.toList().forEach(display::stop)
327
+ op.animating.clear()
328
+ op.owned.clear()
329
+ ops += op
330
+ }
331
+ lowerWaits.values.toList().forEach { it() }
332
+ lowerWaits.clear()
333
+ for (op in ops.sortedBy { it.seq }) {
334
+ op.cancelLimit?.invoke()
335
+ if (op.done) continue
336
+ op.done = true
337
+ reject(op, ErrorTexts.screenNotShown(op.componentId))
338
+ }
339
+ }
340
+
341
+ // The table.
342
+
343
+ private fun enqueue(op: Op) {
344
+ queued.addLast(op)
345
+ drain()
346
+ }
347
+
348
+ private fun drain() {
349
+ if (draining) return
350
+ draining = true
351
+ try {
352
+ while (!destroyed) {
353
+ val op = queued.firstOrNull() ?: break
354
+ val current = waiting
355
+ if (current != null) {
356
+ if (current is ReplaceOp && op !is NoneOp) {
357
+ completeAtOnce(current)
358
+ continue
359
+ }
360
+ if (current is PushOp && (op is CutOp || op is ReplaceOp) && current.node !in entryList) {
361
+ interrupt(current)
362
+ continue
363
+ }
364
+ break
365
+ }
366
+ queued.removeFirst()
367
+ start(op)
368
+ }
369
+ } finally {
370
+ draining = false
371
+ }
372
+ }
373
+
374
+ private fun start(op: Op) {
375
+ if (!op.isCurrent()) {
376
+ // The JavaScript of the command went: nothing moves, and the reset takes the stack.
377
+ op.done = true
378
+ return
379
+ }
380
+ guarded(op) {
381
+ when (op) {
382
+ is NoneOp -> runNone(op)
383
+ is PushOp -> startPush(op)
384
+ is CutOp -> startCut(op)
385
+ is ReplaceOp -> startReplace(op)
386
+ }
387
+ }
388
+ }
389
+
390
+ // None.
391
+
392
+ private fun runNone(op: NoneOp) {
393
+ op.done = true
394
+ val target = op.target
395
+ val removedBy = target?.let { removedAt[it] }
396
+ if (target != null && target !in entryList && removedBy != null && removedBy < op.seq) {
397
+ reject(op, ErrorTexts.screenNotShown(op.componentId))
398
+ } else {
399
+ op.value?.let { resolve(op, it) }
400
+ }
401
+ settled()
402
+ }
403
+
404
+ // Push.
405
+
406
+ private fun startPush(op: PushOp) {
407
+ // Its node went before its turn (a completed iOS swipe; here, the defense): it resolves as interrupted (C8).
408
+ if (op.node !in entryList) return interrupt(op)
409
+ if (!onScreen()) return pushAtOnce(op)
410
+ val node = op.node
411
+ val push = resolved(node).animations.push
412
+ op.awaitsTargets = awaitsTargets(push, !push.enabled.isFalse)
413
+ val wait = when {
414
+ op.prepared -> Wait.Prepared
415
+ push.waitForRender.isTrue -> Wait.Content
416
+ StackSwitches.preparesOwnRootPushes && host.isOwnRootScreen(node) -> Wait.Limited
417
+ else -> Wait.None
418
+ }
419
+ if (wait == Wait.None) return if (op.awaitsTargets) awaitTargets(op) else beginPush(op)
420
+ waiting = op
421
+ when (wait) {
422
+ Wait.Prepared -> awaitPrepared(op)
423
+ Wait.Content -> {
424
+ // Then the components of the bar drawn in advance, 0.5 s at most after the content (a title or a
425
+ // background with its own `waitForRender: false` not).
426
+ display.placeWaiting(node)
427
+ awaitContent(op, node, limit = null, bar = RenderWait.Bar.AfterContent)
428
+ }
429
+ else -> {
430
+ display.placeWaiting(node)
431
+ awaitContent(op, node, limit = OWN_ROOT_WAIT_MILLIS, bar = RenderWait.Bar.None)
432
+ }
433
+ }
434
+ }
435
+
436
+ private fun beginPush(op: PushOp) {
437
+ val node = op.node
438
+ val covered = shownList.lastOrNull()
439
+ // The views first: a failure here leaves the lists as they were.
440
+ display.raise(node)
441
+ shownList += node
442
+ unrendered -= node
443
+ op.covered = covered
444
+ val moved = listOfNotNull(covered, node)
445
+ val ended = takeOver(moved, op)
446
+ // The arriving screen's `animations.push`; Android has no zoom.
447
+ val push = resolved(node).animations.push
448
+ val animated = display.canAnimate && !push.enabled.isFalse
449
+ val own = animated && AnimationRules.stackIsOwn(push)
450
+ val elements = own && AnimationRules.hasElements(push)
451
+ // The bar's row goes with the default transition only; with an animation of its own it changes at once. The tab
452
+ // bar moves with its screens or by its own side.
453
+ tellBars(animated, own, elements, push, TabBarMotion.Move.WithPush, BarMotion.Push)
454
+ host.currentChildChanged()
455
+ finishTakenOver(ended)
456
+ running += op
457
+ AppearanceDispatcher.beginTransition(listOf(node))
458
+ op.owned += moved
459
+ // Without animation the screen shows at the moment the animated one would start: not a transition.
460
+ if (!animated) {
461
+ display.rest(node)
462
+ return finishPush(op)
463
+ }
464
+ if (own) {
465
+ op.keepsEnd = true
466
+ return animate(op, forwardMoves(node, covered, push, elements))
467
+ }
468
+ animate(op, listOfNotNull(Move(node, Motion.PushIn, false), covered?.let { Move(it, Motion.PushCover, true) }))
469
+ }
470
+
471
+ private fun finishPush(op: PushOp) {
472
+ op.done = true
473
+ running -= op
474
+ val node = op.node
475
+ val covered = op.covered
476
+ val hiding = ArrayList<Node>(1)
477
+ if (covered != null && covered in op.owned) {
478
+ hiding += covered
479
+ // The covered screen leaves the container now, not before; its React root lives.
480
+ if (covered !== currentChild && covered in shownList) display.detach(covered)
481
+ }
482
+ // The screen that came by its own `enter` stays at its end values.
483
+ if (node in op.owned && !op.keepsEnd) display.rest(node)
484
+ val showing = if (node === currentChild && onScreen()) listOf(node) else emptyList()
485
+ AppearanceDispatcher.endTransition(hiding, showing, null, op.answer, host.answerIdOf(node, AnswerKind.Push))
486
+ settled(node)
487
+ }
488
+
489
+ // Off screen or without a view: at once, without a transition; the top appears when the stack shows.
490
+ private fun pushAtOnce(op: PushOp) {
491
+ val node = op.node
492
+ val covered = shownList.lastOrNull()
493
+ if (display.hasView) {
494
+ display.raise(node)
495
+ display.rest(node)
496
+ }
497
+ shownList += node
498
+ unrendered -= node
499
+ val ended = takeOver(listOfNotNull(covered, node), op)
500
+ host.tabBarTransition(TabBarMotion.Move.AtOnce, null)
501
+ host.barTransition(null, BarVisibility.AT_ONCE)
502
+ host.currentChildChanged()
503
+ finishTakenOver(ended)
504
+ if (display.hasView && covered != null) display.detach(covered)
505
+ op.done = true
506
+ val value = host.answerIdOf(node, AnswerKind.Push)
507
+ AppearanceDispatcher.endTransition(listOfNotNull(covered), emptyList(), null, op.answer, value)
508
+ settled(node)
509
+ }
510
+
511
+ // A push whose screen never appeared ends: its wait ends, its screen goes without appearance events and without
512
+ // `ANN.ScreenPopped` (its destroy's own events go), it resolves with its id, and the screen under it is not
513
+ // touched. It runs outside any guard (the acceptance of a cut or a replace, the drain): a teardown that fails is
514
+ // logged, so the push still answers and the operation that took its screen is still queued.
515
+ private fun interrupt(op: PushOp) {
516
+ if (op.done) return
517
+ op.done = true
518
+ if (waiting === op) stopWaiting(op)
519
+ queued.remove(op)
520
+ val node = op.node
521
+ entryList.remove(node)
522
+ // The view and the node go each on their own: a view that fails to leave doesn't keep the screen alive.
523
+ try {
524
+ if (display.hasView) display.remove(node)
525
+ } catch (e: Throwable) {
526
+ val reason = ErrorTexts.couldNot("remove the view of the screen '${node.id}'", ErrorTexts.reasonOf(e))
527
+ host.log("[ApexNavigation] $reason")
528
+ }
529
+ try {
530
+ node.destroy()
531
+ } catch (e: Throwable) {
532
+ val reason = ErrorTexts.couldNot("destroy the screen '${node.id}'", ErrorTexts.reasonOf(e))
533
+ host.log("[ApexNavigation] $reason")
534
+ }
535
+ op.answer?.resolve(host.answerIdOf(node, AnswerKind.Push))
536
+ settled()
537
+ }
538
+
539
+ // Every push accepted or waiting whose screen [removed] takes away, oldest first.
540
+ private fun interruptPushesOf(removed: Collection<Node>) {
541
+ if (removed.isEmpty()) return
542
+ val pushes = ArrayList<PushOp>()
543
+ (waiting as? PushOp)?.let { if (it.node in removed) pushes += it }
544
+ queued.forEach { if (it is PushOp && it.node in removed) pushes += it }
545
+ pushes.sortedBy { it.seq }.forEach(::interrupt)
546
+ }
547
+
548
+ // Cut.
549
+
550
+ private fun startCut(op: CutOp) {
551
+ val target = op.target
552
+ if (target !in shownList) {
553
+ // Its target went before its turn: a command rejects, a back of the user ends.
554
+ op.done = true
555
+ reject(op, ErrorTexts.screenNotShown(op.componentId))
556
+ return settled()
557
+ }
558
+ val index = shownList.indexOf(target)
559
+ val leaving = shownList.subList(index + 1, shownList.size).asReversed().toList()
560
+ if (leaving.isEmpty()) {
561
+ op.done = true
562
+ op.value?.let { resolve(op, it) }
563
+ return settled()
564
+ }
565
+ val top = leaving.first()
566
+ val atOnce = !onScreen()
567
+ val moving = running.any { target in it.animating }
568
+ if (display.hasView) display.reveal(target, top)
569
+ // The screens that leave let go of the focus (`blurOnUnmount`).
570
+ leaving.forEach { it.onLeaveStarted() }
571
+ endLowerWaits(leaving + target)
572
+ shownList.subList(index + 1, shownList.size).clear()
573
+ leavingList += leaving
574
+ unrendered -= target
575
+ unrendered.removeAll(leaving.toSet())
576
+ op.leaving = leaving
577
+ val moved = leaving + target
578
+ val ended = takeOver(moved, op)
579
+ // The leaving top's `animations.pop` decides, `enabled` too.
580
+ val pop = resolved(top).animations.pop
581
+ val animated = !atOnce && !op.silent && display.canAnimate && !pop.enabled.isFalse
582
+ val own = animated && AnimationRules.stackIsOwn(pop)
583
+ val elements = own && AnimationRules.hasElements(pop)
584
+ tellBars(animated, own, elements, pop, TabBarMotion.Move.WithPop, BarMotion.Pop)
585
+ host.currentChildChanged()
586
+ finishTakenOver(ended)
587
+ if (display.hasView) target.onViewBroughtToFront()
588
+ op.owned += moved
589
+ if (atOnce) return finishCut(op)
590
+ running += op
591
+ if (!op.silent) AppearanceDispatcher.beginTransition(listOf(target))
592
+ // The screens between the top and the target leave without animation.
593
+ leaving.drop(1).forEach(display::hide)
594
+ if (!animated) return finishCut(op)
595
+ // Its own: no wait on a pop; the leaving screen starts from where it is.
596
+ if (own) return animate(op, backMoves(top, target, pop, elements, moving))
597
+ animate(op, listOf(Move(top, Motion.PopOut, true), Move(target, Motion.PopReveal, moving)))
598
+ }
599
+
600
+ private fun finishCut(op: CutOp) {
601
+ op.done = true
602
+ running -= op
603
+ val target = op.target
604
+ if (target in op.owned && display.hasView) display.rest(target)
605
+ val showing = if (target === currentChild && onScreen() && !op.silent) listOf(target) else emptyList()
606
+ val leaving = op.leaving
607
+ val events = { popAndDestroy(leaving, emptyList()) }
608
+ AppearanceDispatcher.endTransition(leaving, showing, events, op.answer, op.value)
609
+ settled(target)
610
+ }
611
+
612
+ // Replace.
613
+
614
+ private fun startReplace(op: ReplaceOp) {
615
+ if (!onScreen() || !op.waits) return beginReplace(op, atOnce = !onScreen())
616
+ val top = op.top
617
+ val setStackRoot = resolved(top).animations.setStackRoot
618
+ val waitForRender = setStackRoot.waitForRender
619
+ // `enabled: false`: the screens stand at once, without the wait (`animations.setStackRoot.enabled`).
620
+ if (waitForRender.isFalse || !op.animated) return beginReplace(op, atOnce = false)
621
+ // Elements play as at a push and wait the same way; with `asPush` the push plays without them.
622
+ op.awaitsTargets = !op.asPush && awaitsTargets(setStackRoot, true)
623
+ waiting = op
624
+ display.placeWaiting(top)
625
+ // The components of the bar drawn in advance join the wait: within the same 0.5 s without `waitForRender`;
626
+ // after the content, 0.5 s at most, with `true`. The targets take what is left of the 0.5 s without it.
627
+ if (waitForRender.isTrue) {
628
+ awaitContent(op, top, limit = null, bar = RenderWait.Bar.AfterContent)
629
+ } else {
630
+ op.cancelLimit = scheduler.schedule(SET_STACK_ROOT_WAIT_MILLIS) { op.overLimit = true }
631
+ awaitContent(op, top, limit = SET_STACK_ROOT_WAIT_MILLIS, bar = RenderWait.Bar.WithinLimit)
632
+ }
633
+ }
634
+
635
+ private fun beginReplace(op: ReplaceOp, atOnce: Boolean) {
636
+ op.cancelLimit?.invoke()
637
+ val top = op.top
638
+ val old = shownList.toList()
639
+ val placed = if (display.hasView) old.filter(display::isPlaced) else emptyList()
640
+ if (display.hasView) display.raise(top)
641
+ old.forEach { it.onLeaveStarted() }
642
+ endLowerWaits(old)
643
+ shownList.clear()
644
+ shownList += op.nodes
645
+ leavingList += old
646
+ unrendered.removeAll(old.toSet())
647
+ unrendered += op.nodes.dropLast(1)
648
+ op.old = old
649
+ val moved = old + top
650
+ val ended = takeOver(moved, op)
651
+ // The new top's `animations.setStackRoot`; with `asPush` its `animations.push` without elements, which wins
652
+ // over a `content` of its own.
653
+ val animations = resolved(top).animations
654
+ val played: StackAnimationOptions = if (op.asPush) animations.push else animations.setStackRoot
655
+ val animated = !atOnce && op.animated && display.canAnimate
656
+ val own = animated && if (op.asPush) AnimationRules.contentIsOwn(played) else AnimationRules.stackIsOwn(played)
657
+ val elements = own && !op.asPush && AnimationRules.hasElements(played)
658
+ val motion = if (op.asPush) BarMotion.Push else BarMotion.FadeThrough
659
+ val system = if (op.asPush) TabBarMotion.Move.WithPush else TabBarMotion.Move.Slide
660
+ tellBars(animated, own, elements, played, system, motion)
661
+ host.currentChildChanged()
662
+ finishTakenOver(ended)
663
+ op.owned += moved
664
+ if (atOnce) {
665
+ if (display.hasView) display.rest(top)
666
+ return finishReplace(op)
667
+ }
668
+ running += op
669
+ AppearanceDispatcher.beginTransition(listOf(top))
670
+ if (!op.animated || !display.canAnimate) {
671
+ display.rest(top)
672
+ return finishReplace(op)
673
+ }
674
+ // Its own: the new top's `content.enter` (and the old top's `content.exit`) instead of the fade through; the
675
+ // other old screens hide at once. The old title's picture goes only with the fade through.
676
+ if (own) {
677
+ op.keepsEnd = true
678
+ placed.dropLast(1).forEach(display::hide)
679
+ return animate(op, forwardMoves(top, placed.lastOrNull(), played, elements))
680
+ }
681
+ if (op.asPush) {
682
+ placed.dropLast(1).forEach(display::hide)
683
+ animate(op, listOfNotNull(Move(top, Motion.PushIn, false), placed.lastOrNull()?.let {
684
+ Move(it, Motion.PushCover, true)
685
+ }))
686
+ } else {
687
+ animate(op, listOf(Move(top, Motion.FadeIn, false)) + placed.map { Move(it, Motion.FadeOut, true) })
688
+ }
689
+ }
690
+
691
+ private fun finishReplace(op: ReplaceOp) {
692
+ op.done = true
693
+ running -= op
694
+ // Its end stops the animations of the screens it destroys only: a push started after it plays on.
695
+ finishAll(takeOver(op.old, op))
696
+ val top = op.top
697
+ if (top in op.owned && display.hasView && !op.keepsEnd) display.rest(top)
698
+ val showing = if (top === currentChild && onScreen()) listOf(top) else emptyList()
699
+ endReplace(op, showing)
700
+ renderLowerScreens()
701
+ }
702
+
703
+ // A waiting `setStackRoot` that a push, a cut or a replace completes at once: no transition, its new top lies under
704
+ // what comes next and appears when it is seen.
705
+ private fun completeAtOnce(op: ReplaceOp) {
706
+ if (op.done) return
707
+ stopWaiting(op)
708
+ op.cancelLimit?.invoke()
709
+ guarded(op) {
710
+ val top = op.top
711
+ val old = shownList.toList()
712
+ if (display.hasView) {
713
+ display.raise(top)
714
+ display.rest(top)
715
+ }
716
+ old.forEach { it.onLeaveStarted() }
717
+ endLowerWaits(old)
718
+ shownList.clear()
719
+ shownList += op.nodes
720
+ leavingList += old
721
+ unrendered.removeAll(old.toSet())
722
+ unrendered += op.nodes.dropLast(1)
723
+ op.old = old
724
+ val ended = takeOver(old + top, op)
725
+ host.tabBarTransition(TabBarMotion.Move.AtOnce, null)
726
+ host.barTransition(null, BarVisibility.AT_ONCE)
727
+ host.currentChildChanged()
728
+ finishTakenOver(ended)
729
+ op.done = true
730
+ endReplace(op, emptyList())
731
+ renderLowerScreens()
732
+ }
733
+ }
734
+
735
+ // A running `setStackRoot` that a newer replace completes at once.
736
+ private fun completeRunning(op: ReplaceOp) {
737
+ if (op.done) return
738
+ op.animating.toList().forEach(display::stop)
739
+ op.animating.clear()
740
+ guarded(op) { finishReplace(op) }
741
+ }
742
+
743
+ // The end of a replace: the old screens disappear, `ANN.ScreenPopped` for each whose id no new screen takes (top to
744
+ // bottom), the destroys, those with a reused id last; then the answer.
745
+ private fun endReplace(op: ReplaceOp, showing: List<Node>) {
746
+ val ids = op.nodes.mapTo(HashSet()) { it.id }
747
+ val old = op.old.asReversed()
748
+ val reused = old.filter { it.id in ids }
749
+ val popped = old.filter { it.id !in ids }
750
+ val value = host.answerIdOf(op.top, AnswerKind.Replace)
751
+ AppearanceDispatcher.endTransition(old, showing, { popAndDestroy(popped, reused) }, op.answer, value)
752
+ if (!op.told) op.listener?.onSuccess(value)
753
+ op.told = true
754
+ settled(op.top)
755
+ }
756
+
757
+ // `ANN.ScreenPopped` for each of [popped], then their destroys (the content stops only after all the events), then
758
+ // [after], destroyed without the event.
759
+ private fun popAndDestroy(popped: List<Node>, after: List<Node>) {
760
+ popped.forEach(AppearanceDispatcher::screenPopped)
761
+ for (node in popped + after) {
762
+ leavingList -= node
763
+ node.destroy()
764
+ if (display.hasView) display.remove(node)
765
+ }
766
+ }
767
+
768
+ // Waits.
769
+
770
+ // The one wait (RenderWait) for [screen], the node the operation brings: at [limit] the content not ready counts
771
+ // as mounted; without one, `waitForRender: true` waits as long as it takes, except for content the readiness store
772
+ // knows nothing of after 1 s, which counts as ready (the same rule as iOS).
773
+ private fun awaitContent(op: Op, screen: Node, limit: Long?, bar: RenderWait.Bar) {
774
+ val wait = RenderWait(
775
+ readiness = readiness,
776
+ scheduler = scheduler,
777
+ limitMillis = limit,
778
+ bar = bar,
779
+ countsUnknownContent = true,
780
+ deliver = deliver,
781
+ step = { work -> step(op) { work() } },
782
+ onEnd = { endWait(op) },
783
+ )
784
+ op.wait = wait
785
+ op.waitedNode = screen
786
+ // An entry that isn't a screen (a pair) waits for the screens it shows, as a root does.
787
+ wait.start(RenderWait.waitedScreens(screen))
788
+ }
789
+
790
+ /**
791
+ * The entry [node] (a pair) changed the screens it shows: the operation that waits for it to render waits for
792
+ * those it shows now, and no longer for one that left the window.
793
+ */
794
+ fun shownScreensChanged(node: Node) {
795
+ val op = waiting ?: return
796
+ if (op.waitedNode !== node) return
797
+ val wait = op.wait ?: return
798
+ step(op) { wait.retake(RenderWait.waitedScreens(node)) }
799
+ }
800
+
801
+ private fun awaitPrepared(op: PushOp) {
802
+ val token = Any()
803
+ op.waitToken = token
804
+ val node = op.node
805
+ display.awaitPrepared(
806
+ node,
807
+ waiting = { !destroyed && !op.done && op.waitToken === token && waiting === op && op.isCurrent() },
808
+ mounted = { step(op) { if (!readiness.isReady(node)) readiness.markReady(node) } },
809
+ start = { step(op) { if (waiting === op) endWait(op) } },
810
+ )
811
+ }
812
+
813
+ // The content is there: then the targets, when the transition has elements; else its transition.
814
+ private fun endWait(op: Op) {
815
+ stopWaiting(op)
816
+ when {
817
+ op.awaitsTargets && onScreen() -> return awaitTargets(op)
818
+ op is PushOp -> beginPush(op)
819
+ op is ReplaceOp -> beginReplace(op, atOnce = !onScreen())
820
+ }
821
+ drain()
822
+ }
823
+
824
+ // The wait for the targets of the transition's elements, behind the display: the new top renders in the container
825
+ // meanwhile; the screen on top now is where the elements come from.
826
+ private fun awaitTargets(op: Op) {
827
+ op.awaitsTargets = false
828
+ val (to, animation) = when (op) {
829
+ is PushOp -> op.node to resolved(op.node).animations.push
830
+ is ReplaceOp -> op.top to resolved(op.top).animations.setStackRoot
831
+ else -> return
832
+ }
833
+ waiting = op
834
+ if (!display.isPlaced(to)) display.placeWaiting(to)
835
+ val token = Any()
836
+ op.waitToken = token
837
+ val still = { !destroyed && !op.done && op.waitToken === token && waiting === op && op.isCurrent() }
838
+ // Without `waitForRender` a `setStackRoot`'s 0.5 s holds for its content and its targets together.
839
+ val from = currentChild
840
+ op.stopTargets = display.awaitTargets(animation, from, to, { still() && !op.overLimit }) {
841
+ step(op) { if (still()) endWait(op) }
842
+ }
843
+ }
844
+
845
+ private fun stopWaiting(op: Op) {
846
+ if (waiting === op) waiting = null
847
+ op.waitToken = null
848
+ op.wait?.cancel()
849
+ op.wait = null
850
+ op.stopTargets?.invoke()
851
+ op.stopTargets = null
852
+ }
853
+
854
+ // Lower screens.
855
+
856
+ private fun placeLower(screen: Node) {
857
+ display.placeLower(screen)
858
+ var ended = false
859
+ var cancelLimit: () -> Unit = {}
860
+ val end = {
861
+ if (!ended) {
862
+ ended = true
863
+ cancelLimit()
864
+ lowerWaits.remove(screen)
865
+ val moved = running.any { screen in it.owned }
866
+ if (!destroyed && screen !== currentChild && screen in shownList && !moved) {
867
+ protectLower(screen) { display.detach(screen) }
868
+ }
869
+ }
870
+ }
871
+ lowerWaits[screen] = {
872
+ ended = true
873
+ cancelLimit()
874
+ }
875
+ cancelLimit = scheduler.schedule(LOWER_SCREEN_MILLIS) { end() }
876
+ if (readiness.isReady(screen)) end() else readiness.whenReady(screen) { deliver { end() } }
877
+ }
878
+
879
+ // The steps of a lower screen come later than any command, under no runner: a failure is logged, the stack goes on.
880
+ private inline fun protectLower(screen: Node, work: () -> Unit) {
881
+ try {
882
+ work()
883
+ } catch (e: Throwable) {
884
+ val reason = ErrorTexts.couldNot("make the content of the screen '${screen.id}'", ErrorTexts.reasonOf(e))
885
+ host.log("[ApexNavigation] $reason")
886
+ }
887
+ }
888
+
889
+ // A cut or a replace reaches a lower screen still placed: its wait ends, and the operation moves its view.
890
+ private fun endLowerWaits(screens: List<Node>) {
891
+ for (screen in screens) lowerWaits.remove(screen)?.invoke()
892
+ }
893
+
894
+ // Transitions.
895
+
896
+ // The screens of [op]'s transition move; it ends with the last of them. All count before any starts, so one that
897
+ // ends at once doesn't end the transition early.
898
+ private fun animate(op: Op, moves: List<Move>) {
899
+ moves.forEach { op.animating += it.screen }
900
+ for (move in moves) {
901
+ if (op.done) return
902
+ val done = { step(op) { screenDone(op, move.screen) } }
903
+ val custom = move.custom
904
+ if (custom != null) {
905
+ display.animateCustom(move.screen, custom, done)
906
+ } else {
907
+ display.animate(move.screen, requireNotNull(move.motion), move.fromCurrent, done)
908
+ }
909
+ }
910
+ }
911
+
912
+ // One animator of [op] ended: the transition ends with its last (an animator cancelled counts as ended).
913
+ private fun screenDone(op: Op, screen: Node) {
914
+ if (!op.animating.remove(screen)) return
915
+ if (op.animating.isEmpty()) finish(op)
916
+ }
917
+
918
+ // [taker] takes [screens] over from the transitions running: they stop them where they are and own them no
919
+ // more. The transitions left with nothing moving end after the taker changed what shows.
920
+ private fun takeOver(screens: List<Node>, taker: Op): List<Op> {
921
+ val ended = ArrayList<Op>()
922
+ for (other in running.toList()) {
923
+ if (other === taker || other.done) continue
924
+ for (screen in screens) {
925
+ if (!other.owned.remove(screen)) continue
926
+ if (other.animating.remove(screen)) display.stop(screen)
927
+ if (other.animating.isEmpty() && other !in ended) ended += other
928
+ }
929
+ }
930
+ return ended
931
+ }
932
+
933
+ // The transitions a newer operation took everything from end now: the stack's top isn't settled by their end, the
934
+ // newer operation still moves it (its own end tells it, the bar's row stays with the newer one).
935
+ private fun finishTakenOver(ops: List<Op>) {
936
+ if (ops.isEmpty()) return
937
+ takenOver = true
938
+ try {
939
+ finishAll(ops)
940
+ } finally {
941
+ takenOver = false
942
+ }
943
+ }
944
+
945
+ private fun finishAll(ops: List<Op>) {
946
+ for (op in ops) {
947
+ if (!op.done) guarded(op) { finish(op) }
948
+ }
949
+ }
950
+
951
+ private fun finish(op: Op) {
952
+ when (op) {
953
+ is PushOp -> finishPush(op)
954
+ is CutOp -> finishCut(op)
955
+ is ReplaceOp -> finishReplace(op)
956
+ is NoneOp -> Unit
957
+ }
958
+ }
959
+
960
+ // Answers and protection.
961
+
962
+ private fun resolve(op: Op, value: String) {
963
+ op.answer?.resolve(value)
964
+ if (!op.told) op.listener?.onSuccess(value)
965
+ op.told = true
966
+ }
967
+
968
+ private fun reject(op: Op, text: String) {
969
+ op.answer?.reject(text)
970
+ if (!op.told) op.listener?.onError(text)
971
+ op.told = true
972
+ }
973
+
974
+ // An operation ended; [top] is the screen it brought, when it brought one.
975
+ private fun settled(top: Node? = null) {
976
+ if (destroyed) return
977
+ host.operationEnded(!takenOver && (isAtRest || (top != null && top === currentChild)))
978
+ }
979
+
980
+ // A step of [op] that comes later (a readiness, a limit, an animator's end): nothing once it is done, or once
981
+ // the JavaScript of its command went (a reload takes the stack).
982
+ private inline fun step(op: Op, crossinline work: () -> Unit) {
983
+ if (destroyed || op.done || !op.isCurrent()) return
984
+ guarded(op) { work() }
985
+ }
986
+
987
+ // The protection of the runner covers only a command's body: what runs later is protected here.
988
+ private inline fun guarded(op: Op, work: () -> Unit) {
989
+ try {
990
+ work()
991
+ } catch (e: Throwable) {
992
+ fail(op, e)
993
+ }
994
+ }
995
+
996
+ // A failure while [op] runs: it rejects with its error text, the nodes it made that never showed go silently, the
997
+ // entries are what still shows, and the queue goes on.
998
+ private fun fail(op: Op, e: Throwable) {
999
+ val text = ErrorTexts.couldNot(op.what, ErrorTexts.reasonOf(e))
1000
+ if (op.answer == null && op.listener == null) host.log("[ApexNavigation] $text")
1001
+ if (op.done) {
1002
+ // It failed at its end: an answer not given yet is a rejection; one given stays.
1003
+ destroyLeftBehind(op)
1004
+ if (op.answer?.isAnswered == false) op.answer.reject(text)
1005
+ if (!op.told) op.listener?.onError(text)
1006
+ op.told = true
1007
+ running.remove(op)
1008
+ settled()
1009
+ return drain()
1010
+ }
1011
+ op.done = true
1012
+ stopWaiting(op)
1013
+ op.cancelLimit?.invoke()
1014
+ queued.remove(op)
1015
+ running.remove(op)
1016
+ op.animating.toList().forEach { runCatching { display.stop(it) } }
1017
+ op.animating.clear()
1018
+ // The screens it moved that still show come to rest, as at an end: none stays faded out or moved aside.
1019
+ if (display.hasView) op.owned.filter { it in shownList }.forEach { runCatching { display.rest(it) } }
1020
+ op.owned.clear()
1021
+ val made = when (op) {
1022
+ is PushOp -> listOf(op.node)
1023
+ is ReplaceOp -> op.nodes
1024
+ else -> emptyList()
1025
+ }
1026
+ for (node in made) {
1027
+ if (node in shownList) continue
1028
+ entryList.remove(node)
1029
+ runCatching { if (display.hasView) display.remove(node) }
1030
+ runCatching { node.destroy() }
1031
+ }
1032
+ destroyLeftBehind(op)
1033
+ restoreEntries()
1034
+ reject(op, text)
1035
+ host.tabBarTransition(TabBarMotion.Move.AtOnce, null)
1036
+ host.barTransition(null, BarVisibility.AT_ONCE)
1037
+ host.currentChildChanged()
1038
+ settled()
1039
+ drain()
1040
+ }
1041
+
1042
+ // A cut or a replace that failed after it took screens off what shows leaves them in [leavingList] only, where
1043
+ // nothing would destroy them before the stack itself: those that are no entry, don't show and no transition moves
1044
+ // go now, silently, their views out of the container (as iOS).
1045
+ private fun destroyLeftBehind(op: Op) {
1046
+ val left = when (op) {
1047
+ is CutOp -> op.leaving
1048
+ is ReplaceOp -> op.old
1049
+ else -> return
1050
+ }
1051
+ for (node in left) {
1052
+ if (node !in leavingList || node in entryList || node in shownList) continue
1053
+ if (running.any { node in it.owned }) continue
1054
+ leavingList -= node
1055
+ runCatching { if (display.hasView) display.remove(node) }
1056
+ runCatching { node.destroy() }
1057
+ }
1058
+ }
1059
+
1060
+ // The entries after a failure: what shows, then the screens of the pushes still on their way.
1061
+ private fun restoreEntries() {
1062
+ val pending = ArrayList<Node>()
1063
+ (waiting as? PushOp)?.let { pending += it.node }
1064
+ queued.forEach { if (it is PushOp) pending += it.node }
1065
+ val restored = (shownList + pending.filter { it !in shownList }).distinct()
1066
+ entryList.clear()
1067
+ entryList += restored
1068
+ }
1069
+
1070
+ private fun onScreen(): Boolean = display.hasView && display.isOnScreen
1071
+
1072
+ // The options a screen shows with; a pair's are its options screen's.
1073
+ private fun resolved(node: Node): Options {
1074
+ val screen = (node as? OptionsScreen)?.optionsScreen ?: node
1075
+ return screen.resolveCurrentOptions(DefaultOptions.current)
1076
+ }
1077
+
1078
+ private fun nextSequence(): Int = ++sequence
1079
+
1080
+ // A push or a `setStackRoot` that will animate waits for its elements' targets, unless `waitForRender: false`.
1081
+ private fun awaitsTargets(animation: StackAnimationOptions, enabled: Boolean): Boolean = enabled &&
1082
+ display.canAnimate && !animation.waitForRender.isFalse && AnimationRules.hasElements(animation)
1083
+
1084
+ // The bars with a change of the current child. The row goes with the default transition only; the tab bar rides
1085
+ // with the system's [system] move, slides with an animation of its own or a side of its own, and is where the new
1086
+ // top wants it at once without animation; with elements every bar changes at once.
1087
+ private fun tellBars(
1088
+ animated: Boolean,
1089
+ own: Boolean,
1090
+ elements: Boolean,
1091
+ animation: StackAnimationOptions,
1092
+ system: TabBarMotion.Move,
1093
+ row: BarMotion,
1094
+ ) {
1095
+ val tabs = animation.bottomTabs
1096
+ val tabsSide = AnimationRules.barSideGiven(tabs.enter) || AnimationRules.barSideGiven(tabs.exit)
1097
+ val move = when {
1098
+ !animated || elements -> TabBarMotion.Move.AtOnce
1099
+ own || tabsSide -> TabBarMotion.Move.Slide
1100
+ else -> system
1101
+ }
1102
+ host.tabBarTransition(move, tabs.takeIf { move == TabBarMotion.Move.Slide })
1103
+ host.barTransition(if (animated && !own) row else null, barVisibility(animated && !elements, animation.topBar))
1104
+ }
1105
+
1106
+ private fun barVisibility(animated: Boolean, side: TopBarEnterExitAnimationOptions): BarVisibility =
1107
+ if (animated) BarVisibility(true, side) else BarVisibility.AT_ONCE
1108
+
1109
+ // Push and `setStackRoot` (forward): the arriving screen plays `enter` with its alpha before any hide, the one it
1110
+ // covers plays `exit`; a side that doesn't play leaves its screen as it is. With elements the arriving screen fades
1111
+ // in (by its `enter` only when that is a single `alpha`), the other stands, and the arriving screen's animator
1112
+ // carries the elements.
1113
+ private fun forwardMoves(arriving: Node, covered: Node?, animation: StackAnimationOptions, elements: Boolean) =
1114
+ listOfNotNull(
1115
+ Move(arriving, custom = if (elements) {
1116
+ val side = animation.content.enter.takeIf(AnimationRules::isSingleAlpha)
1117
+ val fade = if (side == null) Fade.In else Fade.None
1118
+ Custom(side, fade, ARRIVING_ALPHA, Elements(animation, covered, arriving))
1119
+ } else {
1120
+ Custom(animation.content.enter.takeIf(AnimationRules::sidePlays), alpha = ARRIVING_ALPHA)
1121
+ }),
1122
+ covered?.let {
1123
+ Move(it, custom = Custom(animation.content.exit.takeIf { !elements && AnimationRules.sidePlays(it) }))
1124
+ },
1125
+ )
1126
+
1127
+ // Pop: the leaving screen plays `exit` from where it is, the revealed one `enter` from its alpha at rest — a lower
1128
+ // screen still rendering under the others is transparent, one a running transition still moves starts where it is;
1129
+ // with elements the leaving one fades out (its `exit` only when a single `alpha`) and carries them, the revealed
1130
+ // one stands.
1131
+ private fun backMoves(
1132
+ leaving: Node,
1133
+ revealed: Node,
1134
+ animation: StackAnimationOptions,
1135
+ elements: Boolean,
1136
+ moving: Boolean,
1137
+ ) = listOf(
1138
+ Move(leaving, custom = if (elements) {
1139
+ val side = animation.content.exit.takeIf(AnimationRules::isSingleAlpha)
1140
+ Custom(side, if (side == null) Fade.Out else Fade.None, elements = Elements(animation, leaving, revealed))
1141
+ } else {
1142
+ Custom(animation.content.exit.takeIf(AnimationRules::sidePlays))
1143
+ }),
1144
+ Move(revealed, custom = Custom(
1145
+ animation.content.enter.takeIf { !elements && AnimationRules.sidePlays(it) },
1146
+ alpha = if (moving) null else ARRIVING_ALPHA,
1147
+ )),
1148
+ )
1149
+
1150
+ private enum class Wait { None, Content, Limited, Prepared }
1151
+
1152
+ // A screen a transition moves: by a default [motion] (from where it is when [fromCurrent]), or by an animation of
1153
+ // its own ([custom]).
1154
+ private class Move(
1155
+ val screen: Node,
1156
+ val motion: Motion? = null,
1157
+ val fromCurrent: Boolean = false,
1158
+ val custom: Custom? = null,
1159
+ )
1160
+
1161
+ private abstract class Op(
1162
+ val seq: Int,
1163
+ val answer: CommandAnswer?,
1164
+ val listener: CommandListener?,
1165
+ val componentId: String,
1166
+ val what: String,
1167
+ ) {
1168
+ // The JavaScript the operation came from: its later steps do nothing once it went.
1169
+ private val generation = ReloadCoordinator.generation
1170
+ var done = false
1171
+ // The screens its transition moves, and those whose animators still run.
1172
+ val owned = LinkedHashSet<Node>()
1173
+ val animating = LinkedHashSet<Node>()
1174
+ // Its wait for its screen to render; the token of a prepared push's or of the targets' wait.
1175
+ var wait: RenderWait? = null
1176
+ var waitToken: Any? = null
1177
+ // The node its content wait waits for.
1178
+ var waitedNode: Node? = null
1179
+ // It waits for its elements' targets after its content; what stops that wait.
1180
+ var awaitsTargets = false
1181
+ var stopTargets: (() -> Unit)? = null
1182
+ // The limit of a `setStackRoot` without `waitForRender` passed: its targets get nothing of it any more.
1183
+ var overLimit = false
1184
+ var cancelLimit: (() -> Unit)? = null
1185
+ // Its screen came by an animation of its own: it stays at that animation's end values.
1186
+ var keepsEnd = false
1187
+ // The listener of a module heard its answer: it hears one only.
1188
+ var told = false
1189
+
1190
+ fun isCurrent(): Boolean = ReloadCoordinator.isCurrent(generation)
1191
+ }
1192
+
1193
+ private class PushOp(
1194
+ seq: Int,
1195
+ answer: CommandAnswer?,
1196
+ componentId: String,
1197
+ what: String,
1198
+ val node: Node,
1199
+ val prepared: Boolean,
1200
+ ) : Op(seq, answer, null, componentId, what) {
1201
+ var covered: Node? = null
1202
+ }
1203
+
1204
+ private class CutOp(
1205
+ seq: Int,
1206
+ answer: CommandAnswer?,
1207
+ componentId: String,
1208
+ what: String,
1209
+ val target: Node,
1210
+ val value: String?,
1211
+ val silent: Boolean,
1212
+ ) : Op(seq, answer, null, componentId, what) {
1213
+ var leaving: List<Node> = emptyList()
1214
+ }
1215
+
1216
+ private class ReplaceOp(
1217
+ seq: Int,
1218
+ answer: CommandAnswer?,
1219
+ listener: CommandListener?,
1220
+ componentId: String,
1221
+ what: String,
1222
+ val nodes: List<Node>,
1223
+ val animated: Boolean,
1224
+ val asPush: Boolean,
1225
+ val waits: Boolean,
1226
+ ) : Op(seq, answer, listener, componentId, what) {
1227
+ val top: Node
1228
+ get() = nodes.last()
1229
+ var old: List<Node> = emptyList()
1230
+ }
1231
+
1232
+ private class NoneOp(
1233
+ seq: Int,
1234
+ answer: CommandAnswer?,
1235
+ listener: CommandListener?,
1236
+ componentId: String,
1237
+ what: String,
1238
+ val value: String?,
1239
+ val target: Node?,
1240
+ ) : Op(seq, answer, listener, componentId, what)
1241
+
1242
+ companion object {
1243
+ /** How long the new top of a `setStackRoot` waits for its content without `waitForRender`. */
1244
+ const val SET_STACK_ROOT_WAIT_MILLIS = 500L
1245
+
1246
+ /**
1247
+ * After how long, from the start of a `waitForRender: true` wait, a screen whose id no safe area view reported
1248
+ * yet counts as ready.
1249
+ */
1250
+ const val NULL_CONTENT_MILLIS = RenderWait.UNKNOWN_CONTENT_MILLIS
1251
+
1252
+ /** How long a wait goes on for the bar's components after the content, at most. */
1253
+ const val BAR_WAIT_MILLIS = RenderWait.BAR_PHASE_MILLIS
1254
+
1255
+ /** How long a lower screen stays placed in the container to make its content, at most. */
1256
+ const val LOWER_SCREEN_MILLIS = 500L
1257
+
1258
+ /** How long the push of a screen with its own root waits for its content, with the switch on. */
1259
+ const val OWN_ROOT_WAIT_MILLIS = 500L
1260
+
1261
+ // The alpha an arriving screen shows with: its own at rest, never the 0 of its wait.
1262
+ private const val ARRIVING_ALPHA = 1f
1263
+ }
1264
+ }
1265
+
1266
+ /**
1267
+ * The internal switches of the stack. [preparesOwnRootPushes]: the push of a React screen with a root of its own starts
1268
+ * its surface hidden in the stack at its size and insets, and starts its transition once the content rendered, 0.5 s at
1269
+ * most. Off by default («б»: the push starts at once); it is measured at the end on a phone.
1270
+ */
1271
+ internal object StackSwitches {
1272
+ @Volatile
1273
+ var preparesOwnRootPushes = false
1274
+ }