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

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 (1372) hide show
  1. package/ApexNavigation.podspec +42 -0
  2. package/LICENSE +21 -0
  3. package/README.md +76 -2
  4. package/android/CLAUDE.md +183 -0
  5. package/android/CORE.md +219 -0
  6. package/android/MATERIAL_SYMBOLS_LICENSE.txt +205 -0
  7. package/android/RECIPES.md +39 -0
  8. package/android/build.gradle +108 -0
  9. package/android/consumer-rules.pro +2 -0
  10. package/android/src/main/AndroidManifest.xml +9 -0
  11. package/android/src/main/java/dev/apexnative/navigation/EdgeToEdgeDecision.kt +25 -0
  12. package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +339 -0
  13. package/android/src/main/java/dev/apexnative/navigation/NavigationApplication.kt +90 -0
  14. package/android/src/main/java/dev/apexnative/navigation/NavigationPackage.kt +37 -0
  15. package/android/src/main/java/dev/apexnative/navigation/customrow/BottomTabsCustomRowOptions.kt +85 -0
  16. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutChecks.kt +51 -0
  17. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutException.kt +7 -0
  18. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutNode.kt +118 -0
  19. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutReader.kt +274 -0
  20. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutType.kt +35 -0
  21. package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenCalls.kt +61 -0
  22. package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenContext.kt +84 -0
  23. package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenCreator.kt +17 -0
  24. package/android/src/main/java/dev/apexnative/navigation/options/AnimationsOptions.kt +54 -0
  25. package/android/src/main/java/dev/apexnative/navigation/options/BottomTabOptions.kt +238 -0
  26. package/android/src/main/java/dev/apexnative/navigation/options/BottomTabsOptions.kt +244 -0
  27. package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +70 -0
  28. package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +296 -0
  29. package/android/src/main/java/dev/apexnative/navigation/options/ComponentOptions.kt +141 -0
  30. package/android/src/main/java/dev/apexnative/navigation/options/DefaultOptions.kt +21 -0
  31. package/android/src/main/java/dev/apexnative/navigation/options/FabOptions.kt +97 -0
  32. package/android/src/main/java/dev/apexnative/navigation/options/FontOptions.kt +47 -0
  33. package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +49 -0
  34. package/android/src/main/java/dev/apexnative/navigation/options/InterpolationOptions.kt +203 -0
  35. package/android/src/main/java/dev/apexnative/navigation/options/KeyCommandOptions.kt +49 -0
  36. package/android/src/main/java/dev/apexnative/navigation/options/LargeTitleOptions.kt +78 -0
  37. package/android/src/main/java/dev/apexnative/navigation/options/LayoutAnimation.kt +157 -0
  38. package/android/src/main/java/dev/apexnative/navigation/options/LayoutOptions.kt +94 -0
  39. package/android/src/main/java/dev/apexnative/navigation/options/ModalOptions.kt +87 -0
  40. package/android/src/main/java/dev/apexnative/navigation/options/ModalPlacementOptions.kt +90 -0
  41. package/android/src/main/java/dev/apexnative/navigation/options/NavigationBarOptions.kt +44 -0
  42. package/android/src/main/java/dev/apexnative/navigation/options/Options.kt +167 -0
  43. package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +21 -0
  44. package/android/src/main/java/dev/apexnative/navigation/options/OptionsReader.kt +133 -0
  45. package/android/src/main/java/dev/apexnative/navigation/options/PreviewOptions.kt +97 -0
  46. package/android/src/main/java/dev/apexnative/navigation/options/ReadableMaps.kt +70 -0
  47. package/android/src/main/java/dev/apexnative/navigation/options/ScrollEdgeEffectOptions.kt +98 -0
  48. package/android/src/main/java/dev/apexnative/navigation/options/SearchBarOptions.kt +151 -0
  49. package/android/src/main/java/dev/apexnative/navigation/options/SharedElementTransitionOptions.kt +57 -0
  50. package/android/src/main/java/dev/apexnative/navigation/options/SheetOptions.kt +108 -0
  51. package/android/src/main/java/dev/apexnative/navigation/options/SideMenuOptions.kt +130 -0
  52. package/android/src/main/java/dev/apexnative/navigation/options/SplitViewGroupOptions.kt +190 -0
  53. package/android/src/main/java/dev/apexnative/navigation/options/SplitViewOptions.kt +28 -0
  54. package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +270 -0
  55. package/android/src/main/java/dev/apexnative/navigation/options/StatusBarOptions.kt +75 -0
  56. package/android/src/main/java/dev/apexnative/navigation/options/TitleOptions.kt +167 -0
  57. package/android/src/main/java/dev/apexnative/navigation/options/ToolbarOptions.kt +60 -0
  58. package/android/src/main/java/dev/apexnative/navigation/options/TopBarAppearanceOptions.kt +223 -0
  59. package/android/src/main/java/dev/apexnative/navigation/options/TopBarOptions.kt +381 -0
  60. package/android/src/main/java/dev/apexnative/navigation/options/ViewAnimationOptions.kt +225 -0
  61. package/android/src/main/java/dev/apexnative/navigation/options/WindowOptions.kt +36 -0
  62. package/android/src/main/java/dev/apexnative/navigation/options/params/Bool.kt +23 -0
  63. package/android/src/main/java/dev/apexnative/navigation/options/params/Fraction.kt +12 -0
  64. package/android/src/main/java/dev/apexnative/navigation/options/params/LayoutDirection.kt +26 -0
  65. package/android/src/main/java/dev/apexnative/navigation/options/params/Param.kt +24 -0
  66. package/android/src/main/java/dev/apexnative/navigation/options/params/Text.kt +24 -0
  67. package/android/src/main/java/dev/apexnative/navigation/options/params/ThemeColour.kt +259 -0
  68. package/android/src/main/java/dev/apexnative/navigation/options/params/Variant.kt +36 -0
  69. package/android/src/main/java/dev/apexnative/navigation/options/parsers/BoolParser.kt +15 -0
  70. package/android/src/main/java/dev/apexnative/navigation/options/parsers/FontParser.kt +28 -0
  71. package/android/src/main/java/dev/apexnative/navigation/options/parsers/FractionParser.kt +24 -0
  72. package/android/src/main/java/dev/apexnative/navigation/options/parsers/IconParser.kt +48 -0
  73. package/android/src/main/java/dev/apexnative/navigation/options/parsers/StringListParser.kt +27 -0
  74. package/android/src/main/java/dev/apexnative/navigation/options/parsers/TextParser.kt +32 -0
  75. package/android/src/main/java/dev/apexnative/navigation/options/parsers/TypefaceLoader.kt +42 -0
  76. package/android/src/main/java/dev/apexnative/navigation/options/parsers/VariantParser.kt +34 -0
  77. package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +41 -0
  78. package/android/src/main/java/dev/apexnative/navigation/react/CommandAnswer.kt +111 -0
  79. package/android/src/main/java/dev/apexnative/navigation/react/CommandListener.kt +27 -0
  80. package/android/src/main/java/dev/apexnative/navigation/react/CommandRunner.kt +131 -0
  81. package/android/src/main/java/dev/apexnative/navigation/react/DeveloperReload.kt +69 -0
  82. package/android/src/main/java/dev/apexnative/navigation/react/ErrorTexts.kt +123 -0
  83. package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +154 -0
  84. package/android/src/main/java/dev/apexnative/navigation/react/LaunchLink.kt +37 -0
  85. package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +311 -0
  86. package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +89 -0
  87. package/android/src/main/java/dev/apexnative/navigation/react/ReactGateway.kt +67 -0
  88. package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +197 -0
  89. package/android/src/main/java/dev/apexnative/navigation/react/ReadableJson.kt +60 -0
  90. package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +130 -0
  91. package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +69 -0
  92. package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +87 -0
  93. package/android/src/main/java/dev/apexnative/navigation/react/ScrollEvents.kt +160 -0
  94. package/android/src/main/java/dev/apexnative/navigation/react/StartInfo.kt +44 -0
  95. package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +507 -0
  96. package/android/src/main/java/dev/apexnative/navigation/react/events/ComponentType.kt +13 -0
  97. package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +199 -0
  98. package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +62 -0
  99. package/android/src/main/java/dev/apexnative/navigation/react/events/ScreenAppearance.kt +87 -0
  100. package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +62 -0
  101. package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaReadyEvent.kt +16 -0
  102. package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +140 -0
  103. package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaViewManager.kt +45 -0
  104. package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +44 -0
  105. package/android/src/main/java/dev/apexnative/navigation/slots/SlotHost.kt +91 -0
  106. package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +158 -0
  107. package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +141 -0
  108. package/android/src/main/java/dev/apexnative/navigation/slots/SlotViewManager.kt +50 -0
  109. package/android/src/main/java/dev/apexnative/navigation/splash/SplashHold.kt +67 -0
  110. package/android/src/main/java/dev/apexnative/navigation/splash/SplashTheme.kt +81 -0
  111. package/android/src/main/java/dev/apexnative/navigation/splash/SplashView.kt +77 -0
  112. package/android/src/main/java/dev/apexnative/navigation/system/AppDirection.kt +92 -0
  113. package/android/src/main/java/dev/apexnative/navigation/system/SystemUiLayers.kt +126 -0
  114. package/android/src/main/java/dev/apexnative/navigation/system/SystemUiOwner.kt +229 -0
  115. package/android/src/main/java/dev/apexnative/navigation/system/SystemUiRules.kt +302 -0
  116. package/android/src/main/java/dev/apexnative/navigation/system/SystemUiState.kt +58 -0
  117. package/android/src/main/java/dev/apexnative/navigation/system/SystemUiWindow.kt +405 -0
  118. package/android/src/main/java/dev/apexnative/navigation/utils/ColorUtils.kt +22 -0
  119. package/android/src/main/java/dev/apexnative/navigation/utils/DevelopmentLog.kt +45 -0
  120. package/android/src/main/java/dev/apexnative/navigation/utils/DimensionExtensions.kt +16 -0
  121. package/android/src/main/java/dev/apexnative/navigation/utils/ImageLoader.kt +112 -0
  122. package/android/src/main/java/dev/apexnative/navigation/utils/MaterialTheme.kt +148 -0
  123. package/android/src/main/java/dev/apexnative/navigation/utils/NavigationLog.kt +6 -0
  124. package/android/src/main/java/dev/apexnative/navigation/utils/ScrollToTop.kt +33 -0
  125. package/android/src/main/java/dev/apexnative/navigation/utils/SystemUiUtils.kt +41 -0
  126. package/android/src/main/java/dev/apexnative/navigation/utils/TestIds.kt +89 -0
  127. package/android/src/main/java/dev/apexnative/navigation/utils/TextViewUtils.kt +10 -0
  128. package/android/src/main/java/dev/apexnative/navigation/utils/UiThread.kt +31 -0
  129. package/android/src/main/java/dev/apexnative/navigation/utils/UiUtils.kt +43 -0
  130. package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +124 -0
  131. package/android/src/main/java/dev/apexnative/navigation/utils/ViewExtensions.kt +41 -0
  132. package/android/src/main/java/dev/apexnative/navigation/utils/ViewUtils.kt +15 -0
  133. package/android/src/main/java/dev/apexnative/navigation/utils/WindowFolds.kt +107 -0
  134. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +258 -0
  135. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementDefinition.kt +57 -0
  136. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementLayout.kt +225 -0
  137. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementPlanner.kt +120 -0
  138. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/SecondaryScreenPresenter.kt +31 -0
  139. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +54 -0
  140. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +664 -0
  141. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +367 -0
  142. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +81 -0
  143. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +223 -0
  144. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabBarLook.kt +74 -0
  145. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabBarMotion.kt +83 -0
  146. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabCellState.kt +27 -0
  147. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabHistory.kt +38 -0
  148. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +172 -0
  149. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabSelection.kt +65 -0
  150. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsAttach.kt +42 -0
  151. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +72 -0
  152. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/child/ChildController.kt +45 -0
  153. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/child/ChildControllersRegistry.kt +29 -0
  154. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +90 -0
  155. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +254 -0
  156. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +65 -0
  157. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +231 -0
  158. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RestPlace.kt +28 -0
  159. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenContentFactory.kt +28 -0
  160. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFocus.kt +22 -0
  161. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +154 -0
  162. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +104 -0
  163. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +148 -0
  164. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentCreator.kt +18 -0
  165. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +187 -0
  166. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/NativeScreens.kt +25 -0
  167. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +40 -0
  168. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalContainer.kt +20 -0
  169. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +1269 -0
  170. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +186 -0
  171. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +342 -0
  172. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +398 -0
  173. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetContainer.kt +67 -0
  174. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +78 -0
  175. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/FirstRootDraw.kt +58 -0
  176. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/LayoutFactory.kt +203 -0
  177. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +562 -0
  178. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigators.kt +53 -0
  179. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +514 -0
  180. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/WaitingLayer.kt +18 -0
  181. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayContainer.kt +33 -0
  182. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +383 -0
  183. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayTouches.kt +44 -0
  184. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayViews.kt +117 -0
  185. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +62 -0
  186. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +43 -0
  187. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +218 -0
  188. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ShownChildren.kt +82 -0
  189. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +283 -0
  190. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +276 -0
  191. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +92 -0
  192. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +107 -0
  193. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +59 -0
  194. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +509 -0
  195. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewLayout.kt +61 -0
  196. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewPresenter.kt +25 -0
  197. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +19 -0
  198. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedPushes.kt +114 -0
  199. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +387 -0
  200. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +635 -0
  201. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +167 -0
  202. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackPresenter.kt +24 -0
  203. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +1274 -0
  204. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +82 -0
  205. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +222 -0
  206. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPlacement.kt +47 -0
  207. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPlan.kt +44 -0
  208. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +279 -0
  209. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +450 -0
  210. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/SearchPanel.kt +176 -0
  211. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +243 -0
  212. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +211 -0
  213. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarRowTransition.kt +122 -0
  214. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonCells.kt +30 -0
  215. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +65 -0
  216. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/LargeTitleCollapse.kt +71 -0
  217. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +72 -0
  218. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarCollapseBehavior.kt +104 -0
  219. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +1085 -0
  220. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarRoom.kt +95 -0
  221. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +122 -0
  222. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/IReactView.kt +89 -0
  223. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/Presenter.kt +51 -0
  224. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +194 -0
  225. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +320 -0
  226. package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationRules.kt +141 -0
  227. package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +193 -0
  228. package/android/src/main/java/dev/apexnative/navigation/views/animations/FadeThrough.kt +57 -0
  229. package/android/src/main/java/dev/apexnative/navigation/views/animations/SideAnimator.kt +143 -0
  230. package/android/src/main/java/dev/apexnative/navigation/views/animations/SystemTransition.kt +26 -0
  231. package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +93 -0
  232. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabItem.kt +13 -0
  233. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +550 -0
  234. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsContainer.kt +135 -0
  235. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +89 -0
  236. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +91 -0
  237. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +165 -0
  238. package/android/src/main/java/dev/apexnative/navigation/views/component/ComponentLayout.kt +89 -0
  239. package/android/src/main/java/dev/apexnative/navigation/views/component/Renderable.kt +6 -0
  240. package/android/src/main/java/dev/apexnative/navigation/views/element/DrawOrder.kt +44 -0
  241. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +31 -0
  242. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +281 -0
  243. package/android/src/main/java/dev/apexnative/navigation/views/element/ImageLoads.kt +103 -0
  244. package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +112 -0
  245. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +152 -0
  246. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +53 -0
  247. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +46 -0
  248. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +53 -0
  249. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +138 -0
  250. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +88 -0
  251. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +33 -0
  252. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +66 -0
  253. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +70 -0
  254. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +179 -0
  255. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +139 -0
  256. package/android/src/main/java/dev/apexnative/navigation/views/externalcomponent/ExternalComponentLayout.kt +44 -0
  257. package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +183 -0
  258. package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +137 -0
  259. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +125 -0
  260. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabAnimator.kt +8 -0
  261. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCollapseBehaviour.kt +34 -0
  262. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +133 -0
  263. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/LargeTitleView.kt +45 -0
  264. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +211 -0
  265. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +407 -0
  266. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBarDefaults.kt +35 -0
  267. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/ScopeRow.kt +82 -0
  268. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/SearchField.kt +130 -0
  269. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/SearchStyle.kt +29 -0
  270. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/SuggestionList.kt +77 -0
  271. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +80 -0
  272. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +334 -0
  273. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +106 -0
  274. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/IconBackgroundDrawable.kt +93 -0
  275. package/android/src/main/jni/ApexNavigationSpec.h +18 -0
  276. package/android/src/main/jni/CMakeLists.txt +33 -0
  277. package/android/src/main/res/color/apex_navigation_highlight_inverse.xml +5 -0
  278. package/android/src/main/res/color/apex_navigation_text_primary.xml +6 -0
  279. package/android/src/main/res/color/apex_navigation_text_primary_inverse.xml +6 -0
  280. package/android/src/main/res/color/apex_navigation_text_secondary.xml +6 -0
  281. package/android/src/main/res/color/apex_navigation_text_secondary_inverse.xml +6 -0
  282. package/android/src/main/res/drawable/apex_navigation_ic_arrow_back.xml +13 -0
  283. package/android/src/main/res/drawable/apex_navigation_ic_close.xml +12 -0
  284. package/android/src/main/res/drawable/ic_fab_add_24dp.xml +12 -0
  285. package/android/src/main/res/values/attrs.xml +13 -0
  286. package/android/src/main/res/values/dimens.xml +5 -0
  287. package/android/src/main/res/values/dimens_splash.xml +9 -0
  288. package/android/src/main/res/values/ids.xml +12 -0
  289. package/android/src/main/res/values/styles.xml +18 -0
  290. package/android/src/main/res/values/themes.xml +75 -0
  291. package/android/src/main/res/values-night/styles.xml +6 -0
  292. package/android/src/main/res/values-night/themes.xml +67 -0
  293. package/cli/app.js +113 -0
  294. package/cli/changes.js +235 -0
  295. package/cli/codegen/commands.js +356 -0
  296. package/cli/codegen/index.js +211 -0
  297. package/cli/codegen/kotlin.js +396 -0
  298. package/cli/codegen/names.js +99 -0
  299. package/cli/codegen/read.js +602 -0
  300. package/cli/codegen/swift.js +342 -0
  301. package/cli/config.js +78 -0
  302. package/cli/diff.js +139 -0
  303. package/cli/doctor/checks/android.js +217 -0
  304. package/cli/doctor/checks/app.js +305 -0
  305. package/cli/doctor/checks/conflicts.js +42 -0
  306. package/cli/doctor/checks/devices.js +98 -0
  307. package/cli/doctor/checks/icons.js +69 -0
  308. package/cli/doctor/checks/ios.js +187 -0
  309. package/cli/doctor/checks/navigation.js +285 -0
  310. package/cli/doctor/checks/splash.js +102 -0
  311. package/cli/doctor/fix.js +66 -0
  312. package/cli/doctor/index.js +136 -0
  313. package/cli/doctor/types.js +30 -0
  314. package/cli/exec.js +34 -0
  315. package/cli/gradle.js +142 -0
  316. package/cli/icons/android.js +173 -0
  317. package/cli/icons/images.js +202 -0
  318. package/cli/icons/index.js +97 -0
  319. package/cli/icons/ios.js +113 -0
  320. package/cli/icons/settings.js +116 -0
  321. package/cli/images.js +67 -0
  322. package/cli/index.js +307 -0
  323. package/cli/info/index.js +290 -0
  324. package/cli/init/index.js +426 -0
  325. package/cli/init/packageManager.js +48 -0
  326. package/cli/init/starter.js +440 -0
  327. package/cli/links/files.js +109 -0
  328. package/cli/links/identity.js +75 -0
  329. package/cli/links/index.js +532 -0
  330. package/cli/links/native.js +396 -0
  331. package/cli/links/open.js +120 -0
  332. package/cli/links/prefixes.js +89 -0
  333. package/cli/mcp/appMap.js +128 -0
  334. package/cli/mcp/docs.js +175 -0
  335. package/cli/mcp/index.js +153 -0
  336. package/cli/mcp/markdown.js +210 -0
  337. package/cli/mcp/protocol.js +151 -0
  338. package/cli/mcp/tools.js +389 -0
  339. package/cli/migrate/entry.js +451 -0
  340. package/cli/migrate/index.js +305 -0
  341. package/cli/migrate/native.js +250 -0
  342. package/cli/migrate/report.js +238 -0
  343. package/cli/pods.js +56 -0
  344. package/cli/project.js +189 -0
  345. package/cli/screen/index.js +383 -0
  346. package/cli/screen/templates/compose.js +46 -0
  347. package/cli/screen/templates/native.js +40 -0
  348. package/cli/screen/templates/react.js +47 -0
  349. package/cli/screen/templates/swiftui.js +30 -0
  350. package/cli/screen/templates/uikit.js +48 -0
  351. package/cli/screen/templates/views.js +46 -0
  352. package/cli/setup/index.js +240 -0
  353. package/cli/setup/source.js +58 -0
  354. package/cli/setup/steps/app.js +76 -0
  355. package/cli/setup/steps/appDelegate.js +98 -0
  356. package/cli/setup/steps/entry.js +68 -0
  357. package/cli/setup/steps/env.js +245 -0
  358. package/cli/setup/steps/infoPlist.js +39 -0
  359. package/cli/setup/steps/mainActivity.js +60 -0
  360. package/cli/setup/steps/mainApplication.js +58 -0
  361. package/cli/setup/steps/manifest.js +38 -0
  362. package/cli/setup/steps/styles.js +29 -0
  363. package/cli/setup/steps/types.js +14 -0
  364. package/cli/splash/android.js +239 -0
  365. package/cli/splash/files.js +50 -0
  366. package/cli/splash/images.js +117 -0
  367. package/cli/splash/index.js +109 -0
  368. package/cli/splash/ios.js +349 -0
  369. package/cli/splash/settings.js +143 -0
  370. package/cli/typescript.js +473 -0
  371. package/cli/ui.js +268 -0
  372. package/cli/upgrade/changelog.js +45 -0
  373. package/cli/upgrade/index.js +347 -0
  374. package/cli/upgrade/versions.js +105 -0
  375. package/cli/workspace.js +60 -0
  376. package/cli/xcode/pbxproj.js +327 -0
  377. package/docs-md/architecture/errors-and-loading.md +138 -0
  378. package/docs-md/architecture/native-screens.md +290 -0
  379. package/docs-md/architecture/one-tree.md +164 -0
  380. package/docs-md/architecture/theme-and-context.md +368 -0
  381. package/docs-md/architecture/transitions.md +191 -0
  382. package/docs-md/containers/arrangement.md +320 -0
  383. package/docs-md/containers/modals.md +195 -0
  384. package/docs-md/containers/overlays.md +109 -0
  385. package/docs-md/containers/side-menu.md +138 -0
  386. package/docs-md/containers/split-view.md +155 -0
  387. package/docs-md/containers/stack.md +156 -0
  388. package/docs-md/containers/tabs.md +187 -0
  389. package/docs-md/flows/a-search-screen.md +311 -0
  390. package/docs-md/flows/an-app-with-tabs.md +380 -0
  391. package/docs-md/flows/bottom-sheets.md +326 -0
  392. package/docs-md/flows/forms-in-a-modal.md +420 -0
  393. package/docs-md/flows/list-and-details.md +428 -0
  394. package/docs-md/flows/onboarding.md +454 -0
  395. package/docs-md/flows/sign-in-and-sign-out.md +693 -0
  396. package/docs-md/fundamentals/lifecycle-and-events.md +224 -0
  397. package/docs-md/fundamentals/moving-between-screens.md +267 -0
  398. package/docs-md/fundamentals/screen-options.md +197 -0
  399. package/docs-md/fundamentals/screens-and-props.md +314 -0
  400. package/docs-md/fundamentals/starting-the-app.md +317 -0
  401. package/docs-md/fundamentals/switching-roots.md +166 -0
  402. package/docs-md/guides/analytics.md +377 -0
  403. package/docs-md/guides/app-context.md +554 -0
  404. package/docs-md/guides/building-a-screen.md +350 -0
  405. package/docs-md/guides/cli.md +421 -0
  406. package/docs-md/guides/data-fetching.md +492 -0
  407. package/docs-md/guides/deep-links.md +694 -0
  408. package/docs-md/guides/error-reporting.md +290 -0
  409. package/docs-md/guides/gestures-and-animations.md +381 -0
  410. package/docs-md/guides/notifications.md +548 -0
  411. package/docs-md/guides/overview.md +65 -0
  412. package/docs-md/guides/right-to-left.md +273 -0
  413. package/docs-md/guides/splash-screen.md +30 -0
  414. package/docs-md/guides/state-management.md +1050 -0
  415. package/docs-md/guides/testing.md +293 -0
  416. package/docs-md/help/glossary.md +433 -0
  417. package/docs-md/help/troubleshooting.md +709 -0
  418. package/docs-md/index.json +4205 -0
  419. package/docs-md/migration/from-expo-router.md +446 -0
  420. package/docs-md/migration/from-react-native-navigation.md +789 -0
  421. package/docs-md/migration/from-react-navigation.md +628 -0
  422. package/docs-md/screen-ui/back-and-gestures.md +178 -0
  423. package/docs-md/screen-ui/bar-buttons.md +312 -0
  424. package/docs-md/screen-ui/search.md +181 -0
  425. package/docs-md/screen-ui/system-ui.md +337 -0
  426. package/docs-md/screen-ui/toolbar-and-fab.md +146 -0
  427. package/docs-md/screen-ui/top-bar.md +247 -0
  428. package/docs-md/start/installation.md +233 -0
  429. package/docs-md/start/introduction.md +46 -0
  430. package/docs-md/start/quick-start.md +124 -0
  431. package/ios/Animations/ANNAnimationRules.h +72 -0
  432. package/ios/Animations/ANNAnimationRules.mm +122 -0
  433. package/ios/Animations/ANNFrameDriver.h +46 -0
  434. package/ios/Animations/ANNFrameDriver.mm +126 -0
  435. package/ios/Animations/ANNTransitionAnimator.h +34 -0
  436. package/ios/Animations/ANNTransitionAnimator.mm +293 -0
  437. package/ios/Animations/ANNTransitionPlan.h +115 -0
  438. package/ios/Animations/ANNTransitionPlan.mm +130 -0
  439. package/ios/Animations/ANNTransitionWait.h +29 -0
  440. package/ios/Animations/ANNTransitionWait.mm +135 -0
  441. package/ios/Animations/Elements/ANNElementFinder.h +26 -0
  442. package/ios/Animations/Elements/ANNElementFinder.mm +37 -0
  443. package/ios/Animations/Elements/ANNElementTransition.h +30 -0
  444. package/ios/Animations/Elements/ANNElementTransition.mm +75 -0
  445. package/ios/Animations/Elements/ANNSharedElementFlight.h +42 -0
  446. package/ios/Animations/Elements/ANNSharedElementFlight.mm +340 -0
  447. package/ios/Animations/Elements/ANNZoomAnchor.h +33 -0
  448. package/ios/Animations/Elements/ANNZoomAnchor.mm +133 -0
  449. package/ios/Animations/Interpolators/ANNCurve.h +61 -0
  450. package/ios/Animations/Interpolators/ANNCurve.mm +301 -0
  451. package/ios/Animations/Interpolators/ANNInterpolate.h +69 -0
  452. package/ios/Animations/Interpolators/ANNTrack.h +52 -0
  453. package/ios/Animations/Interpolators/ANNTrack.mm +77 -0
  454. package/ios/Animations/Interpolators/ANNViewTracks.h +57 -0
  455. package/ios/Animations/Interpolators/ANNViewTracks.mm +261 -0
  456. package/ios/ApexNavigation-prefix.h +6 -0
  457. package/ios/CLAUDE.md +151 -0
  458. package/ios/CORE.md +177 -0
  459. package/ios/Contract/ANNCommandAnswer.h +38 -0
  460. package/ios/Contract/ANNCommandAnswer.mm +99 -0
  461. package/ios/Contract/ANNCommandRunner.h +42 -0
  462. package/ios/Contract/ANNCommandRunner.mm +89 -0
  463. package/ios/Contract/ANNErrorTexts.h +86 -0
  464. package/ios/Contract/ANNErrorTexts.mm +230 -0
  465. package/ios/Contract/ANNLayoutNode.h +64 -0
  466. package/ios/Contract/ANNLayoutNode.mm +153 -0
  467. package/ios/Contract/ANNLayoutReader.h +34 -0
  468. package/ios/Contract/ANNLayoutReader.mm +282 -0
  469. package/ios/Contract/ANNLayoutRoot.h +26 -0
  470. package/ios/Contract/ANNLayoutRoot.mm +21 -0
  471. package/ios/Contract/ANNLayoutTreeOptions.h +22 -0
  472. package/ios/Contract/ANNLayoutTreeOptions.mm +32 -0
  473. package/ios/Contract/ANNLayoutType.h +44 -0
  474. package/ios/Contract/ANNLayoutValidator.h +23 -0
  475. package/ios/Contract/ANNLayoutValidator.mm +28 -0
  476. package/ios/Core/ANNAppDelegate.mm +122 -0
  477. package/ios/Core/ANNAppDirection.h +43 -0
  478. package/ios/Core/ANNAppDirection.mm +194 -0
  479. package/ios/Core/ANNAppearanceDispatcher.h +117 -0
  480. package/ios/Core/ANNAppearanceDispatcher.mm +433 -0
  481. package/ios/Core/ANNAssert.h +7 -0
  482. package/ios/Core/ANNDeepLinkQueue.h +35 -0
  483. package/ios/Core/ANNDeepLinkQueue.mm +136 -0
  484. package/ios/Core/ANNErrorHandler.h +17 -0
  485. package/ios/Core/ANNErrorHandler.mm +14 -0
  486. package/ios/Core/ANNEventEmitter.h +174 -0
  487. package/ios/Core/ANNEventEmitter.mm +337 -0
  488. package/ios/Core/ANNHinge.h +26 -0
  489. package/ios/Core/ANNHinge.mm +116 -0
  490. package/ios/Core/ANNKeyCommands.h +12 -0
  491. package/ios/Core/ANNKeyCommands.mm +74 -0
  492. package/ios/Core/ANNLayoutInfo.h +18 -0
  493. package/ios/Core/ANNLayoutInfo.mm +13 -0
  494. package/ios/Core/ANNLayoutProtocol.h +155 -0
  495. package/ios/Core/ANNNavigationState.h +38 -0
  496. package/ios/Core/ANNNavigationState.mm +127 -0
  497. package/ios/Core/ANNNodeHelper.h +114 -0
  498. package/ios/Core/ANNNodeHelper.mm +260 -0
  499. package/ios/Core/ANNNodePresenter.h +86 -0
  500. package/ios/Core/ANNNodePresenter.mm +92 -0
  501. package/ios/Core/ANNNodeRegistry.h +30 -0
  502. package/ios/Core/ANNNodeRegistry.mm +48 -0
  503. package/ios/Core/ANNOptionsRepaint.h +19 -0
  504. package/ios/Core/ANNOptionsRepaint.mm +59 -0
  505. package/ios/Core/ANNParking.h +34 -0
  506. package/ios/Core/ANNParking.mm +117 -0
  507. package/ios/Core/ANNPendingLayers.h +31 -0
  508. package/ios/Core/ANNPendingLayers.mm +57 -0
  509. package/ios/Core/ANNReloadCoordinator.h +26 -0
  510. package/ios/Core/ANNReloadCoordinator.mm +211 -0
  511. package/ios/Core/ANNRenderWait.h +105 -0
  512. package/ios/Core/ANNRenderWait.mm +496 -0
  513. package/ios/Core/ANNSceneDelegate.mm +92 -0
  514. package/ios/Core/ANNScreenAppearance+Internal.h +29 -0
  515. package/ios/Core/ANNScreenAppearance.h +60 -0
  516. package/ios/Core/ANNScreenAppearance.mm +44 -0
  517. package/ios/Core/ANNShownScreens.h +27 -0
  518. package/ios/Core/ANNShownScreens.mm +16 -0
  519. package/ios/Core/ANNSystemUI.h +95 -0
  520. package/ios/Core/ANNSystemUI.mm +401 -0
  521. package/ios/Core/ANNSystemUIRules.h +35 -0
  522. package/ios/Core/ANNSystemUIRules.mm +139 -0
  523. package/ios/Core/ANNUtils.h +35 -0
  524. package/ios/Core/ANNUtils.mm +111 -0
  525. package/ios/Core/ApexNavigation+Internal.h +26 -0
  526. package/ios/Core/ApexNavigation.mm +177 -0
  527. package/ios/Core/UIViewController+LayoutProtocol.h +102 -0
  528. package/ios/Core/UIViewController+LayoutProtocol.mm +253 -0
  529. package/ios/Layouts/Arrangement/ANNArrangementScreenDelegate.h +18 -0
  530. package/ios/Layouts/Arrangement/ANNArrangementState.h +30 -0
  531. package/ios/Layouts/Arrangement/ANNArrangementState.mm +53 -0
  532. package/ios/Layouts/Arrangement/ANNArrangementViewController.h +38 -0
  533. package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +573 -0
  534. package/ios/Layouts/External/ANNExternalViewController.h +28 -0
  535. package/ios/Layouts/External/ANNExternalViewController.mm +118 -0
  536. package/ios/Layouts/External/ANNNativeScreenCalls.h +27 -0
  537. package/ios/Layouts/External/ANNNativeScreenCalls.mm +77 -0
  538. package/ios/Layouts/Modal/ANNModal.h +121 -0
  539. package/ios/Layouts/Modal/ANNModal.mm +64 -0
  540. package/ios/Layouts/Modal/ANNModalCoordinator.h +99 -0
  541. package/ios/Layouts/Modal/ANNModalCoordinator.mm +1965 -0
  542. package/ios/Layouts/Modal/ANNModalHostViewComponentView.h +13 -0
  543. package/ios/Layouts/Modal/ANNModalHostViewComponentView.mm +24 -0
  544. package/ios/Layouts/Modal/ANNModalPresentation.h +73 -0
  545. package/ios/Layouts/Modal/ANNModalPresentation.mm +189 -0
  546. package/ios/Layouts/Modal/ANNModalSizePresenter.h +13 -0
  547. package/ios/Layouts/Modal/ANNModalSizePresenter.mm +65 -0
  548. package/ios/Layouts/Modal/ANNModalTransitions.h +29 -0
  549. package/ios/Layouts/Modal/ANNModalTransitions.mm +40 -0
  550. package/ios/Layouts/Modal/ANNPopoverPresenter.h +29 -0
  551. package/ios/Layouts/Modal/ANNPopoverPresenter.mm +158 -0
  552. package/ios/Layouts/Modal/ANNPresentationGate.h +52 -0
  553. package/ios/Layouts/Modal/ANNPresentationGate.mm +153 -0
  554. package/ios/Layouts/Modal/ANNSheetPresenter.h +31 -0
  555. package/ios/Layouts/Modal/ANNSheetPresenter.mm +247 -0
  556. package/ios/Layouts/Overlay/ANNOverlayCoordinator.h +66 -0
  557. package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +604 -0
  558. package/ios/Layouts/Overlay/ANNOverlayWindow.h +10 -0
  559. package/ios/Layouts/Overlay/ANNOverlayWindow.mm +71 -0
  560. package/ios/Layouts/Root/ANNLayoutFactory.h +31 -0
  561. package/ios/Layouts/Root/ANNLayoutFactory.mm +349 -0
  562. package/ios/Layouts/Root/ANNRootCoordinator.h +42 -0
  563. package/ios/Layouts/Root/ANNRootCoordinator.mm +847 -0
  564. package/ios/Layouts/Root/ANNSplashViewController.h +30 -0
  565. package/ios/Layouts/Root/ANNSplashViewController.mm +138 -0
  566. package/ios/Layouts/Screen/ANNComponentPresenter.h +32 -0
  567. package/ios/Layouts/Screen/ANNComponentPresenter.mm +136 -0
  568. package/ios/Layouts/Screen/ANNComponentViewController.h +100 -0
  569. package/ios/Layouts/Screen/ANNComponentViewController.mm +652 -0
  570. package/ios/Layouts/Screen/ANNNativeScreenContext+Internal.h +19 -0
  571. package/ios/Layouts/Screen/ANNNativeScreenContext.mm +84 -0
  572. package/ios/Layouts/Screen/ANNPreviewInteraction.h +38 -0
  573. package/ios/Layouts/Screen/ANNPreviewInteraction.mm +252 -0
  574. package/ios/Layouts/Screen/ANNScreenBars.h +29 -0
  575. package/ios/Layouts/Screen/ANNScreenBars.mm +47 -0
  576. package/ios/Layouts/Screen/ANNScreenInsets.h +30 -0
  577. package/ios/Layouts/Screen/ANNScreenInsets.mm +68 -0
  578. package/ios/Layouts/Screen/ANNScreenReadiness.h +92 -0
  579. package/ios/Layouts/Screen/ANNScreenReadiness.mm +186 -0
  580. package/ios/Layouts/Screen/ANNScreenRegions.h +33 -0
  581. package/ios/Layouts/Screen/ANNScreenRegions.mm +105 -0
  582. package/ios/Layouts/Screen/ANNScreenSafeArea.h +38 -0
  583. package/ios/Layouts/Screen/ANNScreenSafeArea.mm +58 -0
  584. package/ios/Layouts/SideMenu/ANNSideMenuChildViewController.h +41 -0
  585. package/ios/Layouts/SideMenu/ANNSideMenuChildViewController.mm +113 -0
  586. package/ios/Layouts/SideMenu/ANNSideMenuPresenter.h +28 -0
  587. package/ios/Layouts/SideMenu/ANNSideMenuPresenter.mm +260 -0
  588. package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +19 -0
  589. package/ios/Layouts/SideMenu/ANNSideMenuViewController.h +46 -0
  590. package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +891 -0
  591. package/ios/Layouts/SplitView/ANNSplitViewCommands.h +39 -0
  592. package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +612 -0
  593. package/ios/Layouts/SplitView/ANNSplitViewController.h +52 -0
  594. package/ios/Layouts/SplitView/ANNSplitViewController.mm +494 -0
  595. package/ios/Layouts/SplitView/ANNSplitViewPresenter.h +18 -0
  596. package/ios/Layouts/SplitView/ANNSplitViewPresenter.mm +181 -0
  597. package/ios/Layouts/SplitView/UISplitViewController+ANNOptions.h +32 -0
  598. package/ios/Layouts/SplitView/UISplitViewController+ANNOptions.mm +133 -0
  599. package/ios/Layouts/Stack/ANNPreviewPush.h +46 -0
  600. package/ios/Layouts/Stack/ANNPreviewPush.mm +298 -0
  601. package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +32 -0
  602. package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +92 -0
  603. package/ios/Layouts/Stack/ANNStackCommands.h +51 -0
  604. package/ios/Layouts/Stack/ANNStackCommands.mm +403 -0
  605. package/ios/Layouts/Stack/ANNStackController.h +161 -0
  606. package/ios/Layouts/Stack/ANNStackController.mm +1597 -0
  607. package/ios/Layouts/Stack/ANNStackPresenter.h +44 -0
  608. package/ios/Layouts/Stack/ANNStackPresenter.mm +181 -0
  609. package/ios/Layouts/Stack/ANNStackQueue.h +194 -0
  610. package/ios/Layouts/Stack/ANNStackQueue.mm +1300 -0
  611. package/ios/Layouts/Stack/InteractivePopGestureDelegate.h +53 -0
  612. package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +228 -0
  613. package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +19 -0
  614. package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +29 -0
  615. package/ios/Layouts/Tabs/ANNBottomTabCellView.h +33 -0
  616. package/ios/Layouts/Tabs/ANNBottomTabCellView.mm +100 -0
  617. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +49 -0
  618. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +153 -0
  619. package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.h +17 -0
  620. package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +56 -0
  621. package/ios/Layouts/Tabs/ANNBottomTabsController.h +121 -0
  622. package/ios/Layouts/Tabs/ANNBottomTabsController.mm +1404 -0
  623. package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.h +47 -0
  624. package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +280 -0
  625. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +81 -0
  626. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +1026 -0
  627. package/ios/Layouts/Tabs/ANNMoreNavigationDelegate.h +24 -0
  628. package/ios/Layouts/Tabs/ANNMoreNavigationDelegate.mm +58 -0
  629. package/ios/Layouts/Tabs/ANNScrollToTop.h +23 -0
  630. package/ios/Layouts/Tabs/ANNScrollToTop.mm +55 -0
  631. package/ios/Layouts/Tabs/ANNTabDotView.h +19 -0
  632. package/ios/Layouts/Tabs/ANNTabDotView.mm +46 -0
  633. package/ios/Layouts/Tabs/ANNTabLongPress.h +28 -0
  634. package/ios/Layouts/Tabs/ANNTabLongPress.mm +98 -0
  635. package/ios/Layouts/Tabs/ANNTabsDesign.h +26 -0
  636. package/ios/Layouts/Tabs/ANNTabsDesign.mm +34 -0
  637. package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +27 -0
  638. package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +55 -0
  639. package/ios/Layouts/Tabs/UITabBar+utils.h +24 -0
  640. package/ios/Layouts/Tabs/UITabBar+utils.mm +103 -0
  641. package/ios/Options/ANNAnimationOptions.h +22 -0
  642. package/ios/Options/ANNAnimationOptions.mm +16 -0
  643. package/ios/Options/ANNAnimationPropertyOptions.h +17 -0
  644. package/ios/Options/ANNAnimationPropertyOptions.mm +15 -0
  645. package/ios/Options/ANNBottomTabDotIndicatorOptions.h +14 -0
  646. package/ios/Options/ANNBottomTabDotIndicatorOptions.mm +13 -0
  647. package/ios/Options/ANNBottomTabOptions.h +51 -0
  648. package/ios/Options/ANNBottomTabOptions.mm +47 -0
  649. package/ios/Options/ANNBottomTabsAccessoryOptions.h +19 -0
  650. package/ios/Options/ANNBottomTabsAccessoryOptions.mm +25 -0
  651. package/ios/Options/ANNBottomTabsAnimationOptions.h +12 -0
  652. package/ios/Options/ANNBottomTabsAnimationOptions.mm +11 -0
  653. package/ios/Options/ANNBottomTabsCustomRowOptions.h +19 -0
  654. package/ios/Options/ANNBottomTabsCustomRowOptions.mm +17 -0
  655. package/ios/Options/ANNBottomTabsOptions.h +51 -0
  656. package/ios/Options/ANNBottomTabsOptions.mm +48 -0
  657. package/ios/Options/ANNBottomTabsShadowOptions.h +14 -0
  658. package/ios/Options/ANNBottomTabsShadowOptions.mm +13 -0
  659. package/ios/Options/ANNButtonComponentOptions.h +13 -0
  660. package/ios/Options/ANNButtonComponentOptions.mm +12 -0
  661. package/ios/Options/ANNButtonOptions.h +56 -0
  662. package/ios/Options/ANNButtonOptions.mm +53 -0
  663. package/ios/Options/ANNButtonsParser.h +13 -0
  664. package/ios/Options/ANNButtonsParser.mm +18 -0
  665. package/ios/Options/ANNComponentOptions.h +14 -0
  666. package/ios/Options/ANNComponentOptions.mm +12 -0
  667. package/ios/Options/ANNDefaultOptions.h +18 -0
  668. package/ios/Options/ANNDefaultOptions.mm +22 -0
  669. package/ios/Options/ANNElementAnimationOptions.h +18 -0
  670. package/ios/Options/ANNElementAnimationOptions.mm +15 -0
  671. package/ios/Options/ANNElementTransitionOptions.h +26 -0
  672. package/ios/Options/ANNElementTransitionOptions.mm +28 -0
  673. package/ios/Options/ANNEnterExitBottomTabsAnimationOptions.h +14 -0
  674. package/ios/Options/ANNEnterExitBottomTabsAnimationOptions.mm +12 -0
  675. package/ios/Options/ANNEnterExitScreenAnimationOptions.h +14 -0
  676. package/ios/Options/ANNEnterExitScreenAnimationOptions.mm +12 -0
  677. package/ios/Options/ANNEnterExitTopBarAnimationOptions.h +14 -0
  678. package/ios/Options/ANNEnterExitTopBarAnimationOptions.mm +12 -0
  679. package/ios/Options/ANNFabOptions.h +26 -0
  680. package/ios/Options/ANNFabOptions.mm +23 -0
  681. package/ios/Options/ANNFontOptions.h +24 -0
  682. package/ios/Options/ANNFontOptions.mm +65 -0
  683. package/ios/Options/ANNHardwareBackButtonOptions.h +15 -0
  684. package/ios/Options/ANNHardwareBackButtonOptions.mm +13 -0
  685. package/ios/Options/ANNIconBackgroundOptions.h +16 -0
  686. package/ios/Options/ANNIconBackgroundOptions.mm +15 -0
  687. package/ios/Options/ANNIconInsetsOptions.h +16 -0
  688. package/ios/Options/ANNIconInsetsOptions.mm +14 -0
  689. package/ios/Options/ANNInterpolationOptions.h +22 -0
  690. package/ios/Options/ANNInterpolationOptions.mm +22 -0
  691. package/ios/Options/ANNLayoutOptions.h +26 -0
  692. package/ios/Options/ANNLayoutOptions.mm +25 -0
  693. package/ios/Options/ANNMenuOptions.h +37 -0
  694. package/ios/Options/ANNMenuOptions.mm +136 -0
  695. package/ios/Options/ANNModalAnimationOptions.h +17 -0
  696. package/ios/Options/ANNModalAnimationOptions.mm +15 -0
  697. package/ios/Options/ANNModalContentSizeOptions.h +14 -0
  698. package/ios/Options/ANNModalContentSizeOptions.mm +15 -0
  699. package/ios/Options/ANNModalOptions.h +19 -0
  700. package/ios/Options/ANNModalOptions.mm +15 -0
  701. package/ios/Options/ANNNavigationBarOptions.h +14 -0
  702. package/ios/Options/ANNNavigationBarOptions.mm +13 -0
  703. package/ios/Options/ANNNavigationOptions.h +60 -0
  704. package/ios/Options/ANNNavigationOptions.mm +54 -0
  705. package/ios/Options/ANNOptionField.h +91 -0
  706. package/ios/Options/ANNOptionField.mm +173 -0
  707. package/ios/Options/ANNOptions.h +62 -0
  708. package/ios/Options/ANNOptions.mm +329 -0
  709. package/ios/Options/ANNOptionsCache.h +22 -0
  710. package/ios/Options/ANNOptionsCache.mm +17 -0
  711. package/ios/Options/ANNOptionsReader.h +33 -0
  712. package/ios/Options/ANNOptionsReader.mm +63 -0
  713. package/ios/Options/ANNOverlayOptions.h +14 -0
  714. package/ios/Options/ANNOverlayOptions.mm +12 -0
  715. package/ios/Options/ANNPopoverOptions.h +17 -0
  716. package/ios/Options/ANNPopoverOptions.mm +31 -0
  717. package/ios/Options/ANNPreviewOptions.h +17 -0
  718. package/ios/Options/ANNPreviewOptions.mm +15 -0
  719. package/ios/Options/ANNScreenAnimationOptions.h +13 -0
  720. package/ios/Options/ANNScreenAnimationOptions.mm +12 -0
  721. package/ios/Options/ANNScrollEdgeEffectOptions.h +20 -0
  722. package/ios/Options/ANNScrollEdgeEffectOptions.mm +16 -0
  723. package/ios/Options/ANNScrollEdgeOptions.h +14 -0
  724. package/ios/Options/ANNScrollEdgeOptions.mm +12 -0
  725. package/ios/Options/ANNSearchBarOptions.h +49 -0
  726. package/ios/Options/ANNSearchBarOptions.mm +41 -0
  727. package/ios/Options/ANNSearchScopeOptions.h +15 -0
  728. package/ios/Options/ANNSearchScopeOptions.mm +13 -0
  729. package/ios/Options/ANNSearchSuggestionOptions.h +19 -0
  730. package/ios/Options/ANNSearchSuggestionOptions.mm +16 -0
  731. package/ios/Options/ANNSearchTokenOptions.h +18 -0
  732. package/ios/Options/ANNSearchTokenOptions.mm +15 -0
  733. package/ios/Options/ANNSetStackRootAnimationOptions.h +12 -0
  734. package/ios/Options/ANNSetStackRootAnimationOptions.mm +11 -0
  735. package/ios/Options/ANNSharedElementTransitionOptions.h +17 -0
  736. package/ios/Options/ANNSharedElementTransitionOptions.mm +15 -0
  737. package/ios/Options/ANNSheetOptions.h +25 -0
  738. package/ios/Options/ANNSheetOptions.mm +41 -0
  739. package/ios/Options/ANNSideMenuOptions.h +19 -0
  740. package/ios/Options/ANNSideMenuOptions.mm +16 -0
  741. package/ios/Options/ANNSideMenuSideOptions.h +23 -0
  742. package/ios/Options/ANNSideMenuSideOptions.mm +20 -0
  743. package/ios/Options/ANNSplitViewColumnOptions.h +14 -0
  744. package/ios/Options/ANNSplitViewColumnOptions.mm +13 -0
  745. package/ios/Options/ANNSplitViewInspectorOptions.h +13 -0
  746. package/ios/Options/ANNSplitViewInspectorOptions.mm +9 -0
  747. package/ios/Options/ANNSplitViewOptions.h +29 -0
  748. package/ios/Options/ANNSplitViewOptions.mm +26 -0
  749. package/ios/Options/ANNStackAnimationOptions.h +23 -0
  750. package/ios/Options/ANNStackAnimationOptions.mm +20 -0
  751. package/ios/Options/ANNStackPushAnimationOptions.h +13 -0
  752. package/ios/Options/ANNStackPushAnimationOptions.mm +11 -0
  753. package/ios/Options/ANNStatusBarOptions.h +20 -0
  754. package/ios/Options/ANNStatusBarOptions.mm +18 -0
  755. package/ios/Options/ANNToolbarOptions.h +14 -0
  756. package/ios/Options/ANNToolbarOptions.mm +27 -0
  757. package/ios/Options/ANNTopBarAnimationOptions.h +12 -0
  758. package/ios/Options/ANNTopBarAnimationOptions.mm +11 -0
  759. package/ios/Options/ANNTopBarBackButtonOptions.h +31 -0
  760. package/ios/Options/ANNTopBarBackButtonOptions.mm +35 -0
  761. package/ios/Options/ANNTopBarBackgroundComponentOptions.h +13 -0
  762. package/ios/Options/ANNTopBarBackgroundComponentOptions.mm +11 -0
  763. package/ios/Options/ANNTopBarBackgroundOptions.h +17 -0
  764. package/ios/Options/ANNTopBarBackgroundOptions.mm +15 -0
  765. package/ios/Options/ANNTopBarLargeTitleOptions.h +19 -0
  766. package/ios/Options/ANNTopBarLargeTitleOptions.mm +15 -0
  767. package/ios/Options/ANNTopBarOptions.h +62 -0
  768. package/ios/Options/ANNTopBarOptions.mm +49 -0
  769. package/ios/Options/ANNTopBarScrollEdgeAppearanceBackgroundOptions.h +14 -0
  770. package/ios/Options/ANNTopBarScrollEdgeAppearanceBackgroundOptions.mm +12 -0
  771. package/ios/Options/ANNTopBarScrollEdgeAppearanceOptions.h +19 -0
  772. package/ios/Options/ANNTopBarScrollEdgeAppearanceOptions.mm +16 -0
  773. package/ios/Options/ANNTopBarScrollEdgeAppearanceTitleOptions.h +16 -0
  774. package/ios/Options/ANNTopBarScrollEdgeAppearanceTitleOptions.mm +12 -0
  775. package/ios/Options/ANNTopBarSubtitleOptions.h +18 -0
  776. package/ios/Options/ANNTopBarSubtitleOptions.mm +14 -0
  777. package/ios/Options/ANNTopBarTitleComponentOptions.h +15 -0
  778. package/ios/Options/ANNTopBarTitleComponentOptions.mm +12 -0
  779. package/ios/Options/ANNTopBarTitleDocumentOptions.h +12 -0
  780. package/ios/Options/ANNTopBarTitleDocumentOptions.mm +11 -0
  781. package/ios/Options/ANNTopBarTitleOptions.h +29 -0
  782. package/ios/Options/ANNTopBarTitleOptions.mm +21 -0
  783. package/ios/Options/ANNViewAnimationOptions.h +26 -0
  784. package/ios/Options/ANNViewAnimationOptions.mm +58 -0
  785. package/ios/Options/ANNWindowOptions.h +12 -0
  786. package/ios/Options/ANNWindowOptions.mm +9 -0
  787. package/ios/Options/ANNZoomTransitionOptions.h +13 -0
  788. package/ios/Options/ANNZoomTransitionOptions.mm +12 -0
  789. package/ios/Options/Params/ANNIntegerParam.h +14 -0
  790. package/ios/Options/Params/ANNIntegerParam.mm +13 -0
  791. package/ios/Options/Params/ANNParam.h +28 -0
  792. package/ios/Options/Params/ANNParam.mm +29 -0
  793. package/ios/Options/Params/Bool.h +17 -0
  794. package/ios/Options/Params/Bool.mm +17 -0
  795. package/ios/Options/Params/BoolParser.h +12 -0
  796. package/ios/Options/Params/BoolParser.mm +10 -0
  797. package/ios/Options/Params/Color.h +43 -0
  798. package/ios/Options/Params/Color.mm +65 -0
  799. package/ios/Options/Params/ColorParser.h +14 -0
  800. package/ios/Options/Params/ColorParser.mm +95 -0
  801. package/ios/Options/Params/Double.h +14 -0
  802. package/ios/Options/Params/Double.mm +13 -0
  803. package/ios/Options/Params/DoubleParser.h +16 -0
  804. package/ios/Options/Params/DoubleParser.mm +16 -0
  805. package/ios/Options/Params/Image.h +15 -0
  806. package/ios/Options/Params/Image.mm +13 -0
  807. package/ios/Options/Params/ImageParser.h +16 -0
  808. package/ios/Options/Params/ImageParser.mm +103 -0
  809. package/ios/Options/Params/Number.h +14 -0
  810. package/ios/Options/Params/Number.mm +13 -0
  811. package/ios/Options/Params/NumberParser.h +13 -0
  812. package/ios/Options/Params/NumberParser.mm +10 -0
  813. package/ios/Options/Params/Param.h +16 -0
  814. package/ios/Options/Params/Param.mm +13 -0
  815. package/ios/Options/Params/Text.h +17 -0
  816. package/ios/Options/Params/Text.mm +17 -0
  817. package/ios/Options/Params/TextParser.h +17 -0
  818. package/ios/Options/Params/TextParser.mm +17 -0
  819. package/ios/Package.swift +58 -0
  820. package/ios/Public/ApexNavigation/ANNAppDelegate.h +66 -0
  821. package/ios/Public/ApexNavigation/ANNSceneDelegate.h +19 -0
  822. package/ios/Public/ApexNavigation/ApexNavigation.h +92 -0
  823. package/ios/Public/module.modulemap +8 -0
  824. package/ios/RECIPES.md +41 -0
  825. package/ios/React/ANNComponentType.h +22 -0
  826. package/ios/React/ANNComponentViewCreator.h +18 -0
  827. package/ios/React/ANNReactComponentRegistry.h +53 -0
  828. package/ios/React/ANNReactComponentRegistry.mm +153 -0
  829. package/ios/React/ANNReactView.h +104 -0
  830. package/ios/React/ANNReactView.mm +374 -0
  831. package/ios/React/ANNReactViewCreator.h +20 -0
  832. package/ios/React/ANNReactViewCreator.mm +42 -0
  833. package/ios/React/ANNSafeAreaViewComponentView.h +13 -0
  834. package/ios/React/ANNSafeAreaViewComponentView.mm +153 -0
  835. package/ios/React/ANNSurfaceHostingView.h +17 -0
  836. package/ios/React/ANNSurfaceHostingView.mm +68 -0
  837. package/ios/React/Slots/ANNSlotComponentView.h +10 -0
  838. package/ios/React/Slots/ANNSlotComponentView.mm +122 -0
  839. package/ios/React/Slots/ANNSlotContainers.h +34 -0
  840. package/ios/React/Slots/ANNSlotContainers.mm +39 -0
  841. package/ios/React/Slots/ANNSlotContentView.h +12 -0
  842. package/ios/React/Slots/ANNSlotContentView.mm +18 -0
  843. package/ios/React/Slots/ANNSlotHost.h +29 -0
  844. package/ios/React/Slots/ANNSlotHost.mm +59 -0
  845. package/ios/React/Slots/ANNSlotScreenView.h +38 -0
  846. package/ios/React/Slots/ANNSlotScreenView.mm +254 -0
  847. package/ios/TopBar/ANNBackButtonPresenter.h +35 -0
  848. package/ios/TopBar/ANNBackButtonPresenter.mm +187 -0
  849. package/ios/TopBar/ANNBarAppearance.h +53 -0
  850. package/ios/TopBar/ANNBarAppearance.mm +278 -0
  851. package/ios/TopBar/ANNBarBackgroundComponent.h +46 -0
  852. package/ios/TopBar/ANNBarBackgroundComponent.mm +163 -0
  853. package/ios/TopBar/ANNBarButtonComponentView.h +30 -0
  854. package/ios/TopBar/ANNBarButtonComponentView.mm +110 -0
  855. package/ios/TopBar/ANNBarButtons.h +65 -0
  856. package/ios/TopBar/ANNBarButtons.mm +1125 -0
  857. package/ios/TopBar/ANNBarComponentsWait.h +37 -0
  858. package/ios/TopBar/ANNBarComponentsWait.mm +116 -0
  859. package/ios/TopBar/ANNIconButtonImage.h +25 -0
  860. package/ios/TopBar/ANNIconButtonImage.mm +94 -0
  861. package/ios/TopBar/ANNLargeTitlePresenter.h +117 -0
  862. package/ios/TopBar/ANNLargeTitlePresenter.mm +402 -0
  863. package/ios/TopBar/ANNMainList.h +28 -0
  864. package/ios/TopBar/ANNMainList.mm +72 -0
  865. package/ios/TopBar/ANNScrollEdgeEffects.h +29 -0
  866. package/ios/TopBar/ANNScrollEdgeEffects.mm +122 -0
  867. package/ios/TopBar/ANNSearchPresenter.h +29 -0
  868. package/ios/TopBar/ANNSearchPresenter.mm +637 -0
  869. package/ios/TopBar/ANNSearchResultsViewController.h +16 -0
  870. package/ios/TopBar/ANNSearchResultsViewController.mm +56 -0
  871. package/ios/TopBar/ANNShowTextButton.h +22 -0
  872. package/ios/TopBar/ANNShowTextButton.mm +63 -0
  873. package/ios/TopBar/ANNTitleComponentView.h +37 -0
  874. package/ios/TopBar/ANNTitleComponentView.mm +86 -0
  875. package/ios/TopBar/ANNTitleGlassView.h +33 -0
  876. package/ios/TopBar/ANNTitleGlassView.mm +126 -0
  877. package/ios/TopBar/ANNTitleView.h +18 -0
  878. package/ios/TopBar/ANNTitleView.mm +63 -0
  879. package/ios/TopBar/ANNToolbarPresenter.h +26 -0
  880. package/ios/TopBar/ANNToolbarPresenter.mm +24 -0
  881. package/ios/TopBar/ANNTopBarPresenter.h +120 -0
  882. package/ios/TopBar/ANNTopBarPresenter.mm +1252 -0
  883. package/ios/TopBar/ANNUIBarButtonItem.h +16 -0
  884. package/ios/TopBar/ANNUIBarButtonItem.mm +5 -0
  885. package/ios/TurboModules/ANNTurboEventEmitter.h +31 -0
  886. package/ios/TurboModules/ANNTurboEventEmitter.mm +129 -0
  887. package/ios/TurboModules/ANNTurboModule.h +11 -0
  888. package/ios/TurboModules/ANNTurboModule.mm +626 -0
  889. package/ios/Utils/UIColor+ANNLuminance.h +13 -0
  890. package/ios/Utils/UIColor+ANNLuminance.mm +32 -0
  891. package/ios/Utils/UIView+Utils.h +12 -0
  892. package/ios/Utils/UIView+Utils.mm +21 -0
  893. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSafeAreaViewComponentDescriptor.h +19 -0
  894. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSafeAreaViewShadowNode.h +60 -0
  895. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSafeAreaViewState.h +33 -0
  896. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotComponentDescriptor.h +22 -0
  897. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotShadowNode.h +87 -0
  898. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +101 -0
  899. package/lib/module/ARCHITECTURE.md +289 -0
  900. package/lib/module/adapters/NativeANNTurboEventEmitter.js +12 -0
  901. package/lib/module/adapters/NativeANNTurboEventEmitter.js.map +1 -0
  902. package/lib/module/adapters/NativeANNTurboModule.js +13 -0
  903. package/lib/module/adapters/NativeANNTurboModule.js.map +1 -0
  904. package/lib/module/api/app/AppRegistry.js +52 -0
  905. package/lib/module/api/app/AppRegistry.js.map +1 -0
  906. package/lib/module/api/app/activeApp.js +12 -0
  907. package/lib/module/api/app/activeApp.js.map +1 -0
  908. package/lib/module/api/app/createNavigation.js +365 -0
  909. package/lib/module/api/app/createNavigation.js.map +1 -0
  910. package/lib/module/api/app/roots.js +20 -0
  911. package/lib/module/api/app/roots.js.map +1 -0
  912. package/lib/module/api/app/splash.js +124 -0
  913. package/lib/module/api/app/splash.js.map +1 -0
  914. package/lib/module/api/app/startFailure.js +38 -0
  915. package/lib/module/api/app/startFailure.js.map +1 -0
  916. package/lib/module/api/arrangement/arrangementState.js +86 -0
  917. package/lib/module/api/arrangement/arrangementState.js.map +1 -0
  918. package/lib/module/api/commands/commands.js +375 -0
  919. package/lib/module/api/commands/commands.js.map +1 -0
  920. package/lib/module/api/commands/errors.js +94 -0
  921. package/lib/module/api/commands/errors.js.map +1 -0
  922. package/lib/module/api/commands/presentation.js +4 -0
  923. package/lib/module/api/commands/presentation.js.map +1 -0
  924. package/lib/module/api/commands/sideMenus.js +134 -0
  925. package/lib/module/api/commands/sideMenus.js.map +1 -0
  926. package/lib/module/api/commands/transitions.js +245 -0
  927. package/lib/module/api/commands/transitions.js.map +1 -0
  928. package/lib/module/api/context/appContext.js +22 -0
  929. package/lib/module/api/context/appContext.js.map +1 -0
  930. package/lib/module/api/events/navigationEvents.js +69 -0
  931. package/lib/module/api/events/navigationEvents.js.map +1 -0
  932. package/lib/module/api/events/screenLifecycle.js +30 -0
  933. package/lib/module/api/events/screenLifecycle.js.map +1 -0
  934. package/lib/module/api/events/tabPresses.js +32 -0
  935. package/lib/module/api/events/tabPresses.js.map +1 -0
  936. package/lib/module/api/hinge/hinge.js +73 -0
  937. package/lib/module/api/hinge/hinge.js.map +1 -0
  938. package/lib/module/api/hooks/appHooks.js +26 -0
  939. package/lib/module/api/hooks/appHooks.js.map +1 -0
  940. package/lib/module/api/hooks/screenHooks.js +250 -0
  941. package/lib/module/api/hooks/screenHooks.js.map +1 -0
  942. package/lib/module/api/hooks/useArrangement.js +24 -0
  943. package/lib/module/api/hooks/useArrangement.js.map +1 -0
  944. package/lib/module/api/hooks/useHinge.js +29 -0
  945. package/lib/module/api/hooks/useHinge.js.map +1 -0
  946. package/lib/module/api/hooks/useNavigation.js +117 -0
  947. package/lib/module/api/hooks/useNavigation.js.map +1 -0
  948. package/lib/module/api/hooks/usePendingLink.js +12 -0
  949. package/lib/module/api/hooks/usePendingLink.js.map +1 -0
  950. package/lib/module/api/hooks/usePreview.js +97 -0
  951. package/lib/module/api/hooks/usePreview.js.map +1 -0
  952. package/lib/module/api/hooks/useReservedRegions.js +24 -0
  953. package/lib/module/api/hooks/useReservedRegions.js.map +1 -0
  954. package/lib/module/api/hooks/useSafeAreaInsets.js +25 -0
  955. package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -0
  956. package/lib/module/api/index.js +26 -0
  957. package/lib/module/api/index.js.map +1 -0
  958. package/lib/module/api/layout/Root.js +121 -0
  959. package/lib/module/api/layout/Root.js.map +1 -0
  960. package/lib/module/api/layout/Screen.js +52 -0
  961. package/lib/module/api/layout/Screen.js.map +1 -0
  962. package/lib/module/api/layout/SideMenu.js +85 -0
  963. package/lib/module/api/layout/SideMenu.js.map +1 -0
  964. package/lib/module/api/layout/SplitView.js +137 -0
  965. package/lib/module/api/layout/SplitView.js.map +1 -0
  966. package/lib/module/api/layout/Stack.js +36 -0
  967. package/lib/module/api/layout/Stack.js.map +1 -0
  968. package/lib/module/api/layout/Tabs.js +326 -0
  969. package/lib/module/api/layout/Tabs.js.map +1 -0
  970. package/lib/module/api/layout/element.js +100 -0
  971. package/lib/module/api/layout/element.js.map +1 -0
  972. package/lib/module/api/linking/linkPaths.js +132 -0
  973. package/lib/module/api/linking/linkPaths.js.map +1 -0
  974. package/lib/module/api/linking/linking.js +244 -0
  975. package/lib/module/api/linking/linking.js.map +1 -0
  976. package/lib/module/api/linking/pendingLinks.js +34 -0
  977. package/lib/module/api/linking/pendingLinks.js.map +1 -0
  978. package/lib/module/api/linking/types.js +4 -0
  979. package/lib/module/api/linking/types.js.map +1 -0
  980. package/lib/module/api/navigation.js +105 -0
  981. package/lib/module/api/navigation.js.map +1 -0
  982. package/lib/module/api/options/OptionsChain.js +158 -0
  983. package/lib/module/api/options/OptionsChain.js.map +1 -0
  984. package/lib/module/api/options/ScreenOptions.js +83 -0
  985. package/lib/module/api/options/ScreenOptions.js.map +1 -0
  986. package/lib/module/api/options/buttons.js +4 -0
  987. package/lib/module/api/options/buttons.js.map +1 -0
  988. package/lib/module/api/safeArea/ANNSafeAreaViewNativeComponent.ts +28 -0
  989. package/lib/module/api/safeArea/screenInsets.js +86 -0
  990. package/lib/module/api/safeArea/screenInsets.js.map +1 -0
  991. package/lib/module/api/safeArea/screenRegions.js +84 -0
  992. package/lib/module/api/safeArea/screenRegions.js.map +1 -0
  993. package/lib/module/api/screens/ScreenBoundary.js +44 -0
  994. package/lib/module/api/screens/ScreenBoundary.js.map +1 -0
  995. package/lib/module/api/screens/arrangement.js +63 -0
  996. package/lib/module/api/screens/arrangement.js.map +1 -0
  997. package/lib/module/api/screens/defineScreen.js +29 -0
  998. package/lib/module/api/screens/defineScreen.js.map +1 -0
  999. package/lib/module/api/screens/nativeScreenCalls.js +34 -0
  1000. package/lib/module/api/screens/nativeScreenCalls.js.map +1 -0
  1001. package/lib/module/api/screens/nativeScreens.js +43 -0
  1002. package/lib/module/api/screens/nativeScreens.js.map +1 -0
  1003. package/lib/module/api/screens/registerScreens.js +305 -0
  1004. package/lib/module/api/screens/registerScreens.js.map +1 -0
  1005. package/lib/module/api/slots/ANNSlotNativeComponent.ts +23 -0
  1006. package/lib/module/api/slots/SlotHost.js +92 -0
  1007. package/lib/module/api/slots/SlotHost.js.map +1 -0
  1008. package/lib/module/api/state/navigationState.js +98 -0
  1009. package/lib/module/api/state/navigationState.js.map +1 -0
  1010. package/lib/module/api/testIDs.js +14 -0
  1011. package/lib/module/api/testIDs.js.map +1 -0
  1012. package/lib/module/api/theme/theme.js +180 -0
  1013. package/lib/module/api/theme/theme.js.map +1 -0
  1014. package/lib/module/api/types.js +4 -0
  1015. package/lib/module/api/types.js.map +1 -0
  1016. package/lib/module/engine/backListeners.js +39 -0
  1017. package/lib/module/engine/backListeners.js.map +1 -0
  1018. package/lib/module/engine/buttons.js +105 -0
  1019. package/lib/module/engine/buttons.js.map +1 -0
  1020. package/lib/module/engine/commands.js +388 -0
  1021. package/lib/module/engine/commands.js.map +1 -0
  1022. package/lib/module/engine/events.js +30 -0
  1023. package/lib/module/engine/events.js.map +1 -0
  1024. package/lib/module/engine/ids.js +10 -0
  1025. package/lib/module/engine/ids.js.map +1 -0
  1026. package/lib/module/engine/launchState.js +34 -0
  1027. package/lib/module/engine/launchState.js.map +1 -0
  1028. package/lib/module/engine/layout.js +202 -0
  1029. package/lib/module/engine/layout.js.map +1 -0
  1030. package/lib/module/engine/mergeOptions.js +23 -0
  1031. package/lib/module/engine/mergeOptions.js.map +1 -0
  1032. package/lib/module/engine/native.js +45 -0
  1033. package/lib/module/engine/native.js.map +1 -0
  1034. package/lib/module/engine/nativeScreens.js +265 -0
  1035. package/lib/module/engine/nativeScreens.js.map +1 -0
  1036. package/lib/module/engine/options.js +170 -0
  1037. package/lib/module/engine/options.js.map +1 -0
  1038. package/lib/module/engine/places.js +178 -0
  1039. package/lib/module/engine/places.js.map +1 -0
  1040. package/lib/module/engine/props.js +44 -0
  1041. package/lib/module/engine/props.js.map +1 -0
  1042. package/lib/module/engine/reactMeasures.js +23 -0
  1043. package/lib/module/engine/reactMeasures.js.map +1 -0
  1044. package/lib/module/engine/rememberedOptions.js +118 -0
  1045. package/lib/module/engine/rememberedOptions.js.map +1 -0
  1046. package/lib/module/engine/screens.js +194 -0
  1047. package/lib/module/engine/screens.js.map +1 -0
  1048. package/lib/module/engine/slots.js +200 -0
  1049. package/lib/module/engine/slots.js.map +1 -0
  1050. package/lib/module/engine/tabs.js +79 -0
  1051. package/lib/module/engine/tabs.js.map +1 -0
  1052. package/lib/module/index.js +5 -0
  1053. package/lib/module/index.js.map +1 -0
  1054. package/lib/module/interfaces/ComponentEvents.js +2 -0
  1055. package/lib/module/interfaces/ComponentEvents.js.map +1 -0
  1056. package/lib/module/interfaces/Events.js +2 -0
  1057. package/lib/module/interfaces/Events.js.map +1 -0
  1058. package/lib/module/interfaces/Layout.js +4 -0
  1059. package/lib/module/interfaces/Layout.js.map +1 -0
  1060. package/lib/module/interfaces/Options.js +4 -0
  1061. package/lib/module/interfaces/Options.js.map +1 -0
  1062. package/lib/module/interfaces/options/animations.js +2 -0
  1063. package/lib/module/interfaces/options/animations.js.map +1 -0
  1064. package/lib/module/interfaces/options/bottomTabs.js +4 -0
  1065. package/lib/module/interfaces/options/bottomTabs.js.map +1 -0
  1066. package/lib/module/interfaces/options/buttons.js +4 -0
  1067. package/lib/module/interfaces/options/buttons.js.map +1 -0
  1068. package/lib/module/interfaces/options/common.js +4 -0
  1069. package/lib/module/interfaces/options/common.js.map +1 -0
  1070. package/lib/module/interfaces/options/modals.js +2 -0
  1071. package/lib/module/interfaces/options/modals.js.map +1 -0
  1072. package/lib/module/interfaces/options/preview.js +2 -0
  1073. package/lib/module/interfaces/options/preview.js.map +1 -0
  1074. package/lib/module/interfaces/options/sideMenu.js +2 -0
  1075. package/lib/module/interfaces/options/sideMenu.js.map +1 -0
  1076. package/lib/module/interfaces/options/splitView.js +2 -0
  1077. package/lib/module/interfaces/options/splitView.js.map +1 -0
  1078. package/lib/module/interfaces/options/stack.js +4 -0
  1079. package/lib/module/interfaces/options/stack.js.map +1 -0
  1080. package/lib/module/interfaces/options/system.js +4 -0
  1081. package/lib/module/interfaces/options/system.js.map +1 -0
  1082. package/lib/module/interfaces/options/toolbar.js +4 -0
  1083. package/lib/module/interfaces/options/toolbar.js.map +1 -0
  1084. package/lib/module/interfaces/options/topBar.js +4 -0
  1085. package/lib/module/interfaces/options/topBar.js.map +1 -0
  1086. package/lib/module/package.json +1 -0
  1087. package/lib/typescript/adapters/NativeANNTurboEventEmitter.d.ts +14 -0
  1088. package/lib/typescript/adapters/NativeANNTurboEventEmitter.d.ts.map +1 -0
  1089. package/lib/typescript/adapters/NativeANNTurboModule.d.ts +77 -0
  1090. package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -0
  1091. package/lib/typescript/api/app/AppRegistry.d.ts +14 -0
  1092. package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -0
  1093. package/lib/typescript/api/app/activeApp.d.ts +12 -0
  1094. package/lib/typescript/api/app/activeApp.d.ts.map +1 -0
  1095. package/lib/typescript/api/app/createNavigation.d.ts +182 -0
  1096. package/lib/typescript/api/app/createNavigation.d.ts.map +1 -0
  1097. package/lib/typescript/api/app/roots.d.ts +15 -0
  1098. package/lib/typescript/api/app/roots.d.ts.map +1 -0
  1099. package/lib/typescript/api/app/splash.d.ts +81 -0
  1100. package/lib/typescript/api/app/splash.d.ts.map +1 -0
  1101. package/lib/typescript/api/app/startFailure.d.ts +15 -0
  1102. package/lib/typescript/api/app/startFailure.d.ts.map +1 -0
  1103. package/lib/typescript/api/arrangement/arrangementState.d.ts +21 -0
  1104. package/lib/typescript/api/arrangement/arrangementState.d.ts.map +1 -0
  1105. package/lib/typescript/api/commands/commands.d.ts +57 -0
  1106. package/lib/typescript/api/commands/commands.d.ts.map +1 -0
  1107. package/lib/typescript/api/commands/errors.d.ts +24 -0
  1108. package/lib/typescript/api/commands/errors.d.ts.map +1 -0
  1109. package/lib/typescript/api/commands/presentation.d.ts +69 -0
  1110. package/lib/typescript/api/commands/presentation.d.ts.map +1 -0
  1111. package/lib/typescript/api/commands/sideMenus.d.ts +14 -0
  1112. package/lib/typescript/api/commands/sideMenus.d.ts.map +1 -0
  1113. package/lib/typescript/api/commands/transitions.d.ts +33 -0
  1114. package/lib/typescript/api/commands/transitions.d.ts.map +1 -0
  1115. package/lib/typescript/api/context/appContext.d.ts +4 -0
  1116. package/lib/typescript/api/context/appContext.d.ts.map +1 -0
  1117. package/lib/typescript/api/events/navigationEvents.d.ts +70 -0
  1118. package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -0
  1119. package/lib/typescript/api/events/screenLifecycle.d.ts +5 -0
  1120. package/lib/typescript/api/events/screenLifecycle.d.ts.map +1 -0
  1121. package/lib/typescript/api/events/tabPresses.d.ts +5 -0
  1122. package/lib/typescript/api/events/tabPresses.d.ts.map +1 -0
  1123. package/lib/typescript/api/hinge/hinge.d.ts +21 -0
  1124. package/lib/typescript/api/hinge/hinge.d.ts.map +1 -0
  1125. package/lib/typescript/api/hooks/appHooks.d.ts +15 -0
  1126. package/lib/typescript/api/hooks/appHooks.d.ts.map +1 -0
  1127. package/lib/typescript/api/hooks/screenHooks.d.ts +74 -0
  1128. package/lib/typescript/api/hooks/screenHooks.d.ts.map +1 -0
  1129. package/lib/typescript/api/hooks/useArrangement.d.ts +13 -0
  1130. package/lib/typescript/api/hooks/useArrangement.d.ts.map +1 -0
  1131. package/lib/typescript/api/hooks/useHinge.d.ts +16 -0
  1132. package/lib/typescript/api/hooks/useHinge.d.ts.map +1 -0
  1133. package/lib/typescript/api/hooks/useNavigation.d.ts +108 -0
  1134. package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -0
  1135. package/lib/typescript/api/hooks/usePendingLink.d.ts +7 -0
  1136. package/lib/typescript/api/hooks/usePendingLink.d.ts.map +1 -0
  1137. package/lib/typescript/api/hooks/usePreview.d.ts +29 -0
  1138. package/lib/typescript/api/hooks/usePreview.d.ts.map +1 -0
  1139. package/lib/typescript/api/hooks/useReservedRegions.d.ts +13 -0
  1140. package/lib/typescript/api/hooks/useReservedRegions.d.ts.map +1 -0
  1141. package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts +14 -0
  1142. package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -0
  1143. package/lib/typescript/api/index.d.ts +60 -0
  1144. package/lib/typescript/api/index.d.ts.map +1 -0
  1145. package/lib/typescript/api/layout/Root.d.ts +47 -0
  1146. package/lib/typescript/api/layout/Root.d.ts.map +1 -0
  1147. package/lib/typescript/api/layout/Screen.d.ts +32 -0
  1148. package/lib/typescript/api/layout/Screen.d.ts.map +1 -0
  1149. package/lib/typescript/api/layout/SideMenu.d.ts +33 -0
  1150. package/lib/typescript/api/layout/SideMenu.d.ts.map +1 -0
  1151. package/lib/typescript/api/layout/SplitView.d.ts +48 -0
  1152. package/lib/typescript/api/layout/SplitView.d.ts.map +1 -0
  1153. package/lib/typescript/api/layout/Stack.d.ts +21 -0
  1154. package/lib/typescript/api/layout/Stack.d.ts.map +1 -0
  1155. package/lib/typescript/api/layout/Tabs.d.ts +120 -0
  1156. package/lib/typescript/api/layout/Tabs.d.ts.map +1 -0
  1157. package/lib/typescript/api/layout/element.d.ts +52 -0
  1158. package/lib/typescript/api/layout/element.d.ts.map +1 -0
  1159. package/lib/typescript/api/linking/linkPaths.d.ts +31 -0
  1160. package/lib/typescript/api/linking/linkPaths.d.ts.map +1 -0
  1161. package/lib/typescript/api/linking/linking.d.ts +37 -0
  1162. package/lib/typescript/api/linking/linking.d.ts.map +1 -0
  1163. package/lib/typescript/api/linking/pendingLinks.d.ts +8 -0
  1164. package/lib/typescript/api/linking/pendingLinks.d.ts.map +1 -0
  1165. package/lib/typescript/api/linking/types.d.ts +105 -0
  1166. package/lib/typescript/api/linking/types.d.ts.map +1 -0
  1167. package/lib/typescript/api/navigation.d.ts +115 -0
  1168. package/lib/typescript/api/navigation.d.ts.map +1 -0
  1169. package/lib/typescript/api/options/OptionsChain.d.ts +47 -0
  1170. package/lib/typescript/api/options/OptionsChain.d.ts.map +1 -0
  1171. package/lib/typescript/api/options/ScreenOptions.d.ts +32 -0
  1172. package/lib/typescript/api/options/ScreenOptions.d.ts.map +1 -0
  1173. package/lib/typescript/api/options/buttons.d.ts +35 -0
  1174. package/lib/typescript/api/options/buttons.d.ts.map +1 -0
  1175. package/lib/typescript/api/safeArea/ANNSafeAreaViewNativeComponent.d.ts +20 -0
  1176. package/lib/typescript/api/safeArea/ANNSafeAreaViewNativeComponent.d.ts.map +1 -0
  1177. package/lib/typescript/api/safeArea/screenInsets.d.ts +20 -0
  1178. package/lib/typescript/api/safeArea/screenInsets.d.ts.map +1 -0
  1179. package/lib/typescript/api/safeArea/screenRegions.d.ts +24 -0
  1180. package/lib/typescript/api/safeArea/screenRegions.d.ts.map +1 -0
  1181. package/lib/typescript/api/screens/ScreenBoundary.d.ts +34 -0
  1182. package/lib/typescript/api/screens/ScreenBoundary.d.ts.map +1 -0
  1183. package/lib/typescript/api/screens/arrangement.d.ts +70 -0
  1184. package/lib/typescript/api/screens/arrangement.d.ts.map +1 -0
  1185. package/lib/typescript/api/screens/defineScreen.d.ts +41 -0
  1186. package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -0
  1187. package/lib/typescript/api/screens/nativeScreenCalls.d.ts +3 -0
  1188. package/lib/typescript/api/screens/nativeScreenCalls.d.ts.map +1 -0
  1189. package/lib/typescript/api/screens/nativeScreens.d.ts +47 -0
  1190. package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -0
  1191. package/lib/typescript/api/screens/registerScreens.d.ts +61 -0
  1192. package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -0
  1193. package/lib/typescript/api/slots/ANNSlotNativeComponent.d.ts +15 -0
  1194. package/lib/typescript/api/slots/ANNSlotNativeComponent.d.ts.map +1 -0
  1195. package/lib/typescript/api/slots/SlotHost.d.ts +8 -0
  1196. package/lib/typescript/api/slots/SlotHost.d.ts.map +1 -0
  1197. package/lib/typescript/api/state/navigationState.d.ts +26 -0
  1198. package/lib/typescript/api/state/navigationState.d.ts.map +1 -0
  1199. package/lib/typescript/api/testIDs.d.ts +12 -0
  1200. package/lib/typescript/api/testIDs.d.ts.map +1 -0
  1201. package/lib/typescript/api/theme/theme.d.ts +70 -0
  1202. package/lib/typescript/api/theme/theme.d.ts.map +1 -0
  1203. package/lib/typescript/api/types.d.ts +64 -0
  1204. package/lib/typescript/api/types.d.ts.map +1 -0
  1205. package/lib/typescript/engine/backListeners.d.ts +8 -0
  1206. package/lib/typescript/engine/backListeners.d.ts.map +1 -0
  1207. package/lib/typescript/engine/buttons.d.ts +11 -0
  1208. package/lib/typescript/engine/buttons.d.ts.map +1 -0
  1209. package/lib/typescript/engine/commands.d.ts +38 -0
  1210. package/lib/typescript/engine/commands.d.ts.map +1 -0
  1211. package/lib/typescript/engine/events.d.ts +17 -0
  1212. package/lib/typescript/engine/events.d.ts.map +1 -0
  1213. package/lib/typescript/engine/ids.d.ts +3 -0
  1214. package/lib/typescript/engine/ids.d.ts.map +1 -0
  1215. package/lib/typescript/engine/launchState.d.ts +25 -0
  1216. package/lib/typescript/engine/launchState.d.ts.map +1 -0
  1217. package/lib/typescript/engine/layout.d.ts +32 -0
  1218. package/lib/typescript/engine/layout.d.ts.map +1 -0
  1219. package/lib/typescript/engine/mergeOptions.d.ts +6 -0
  1220. package/lib/typescript/engine/mergeOptions.d.ts.map +1 -0
  1221. package/lib/typescript/engine/native.d.ts +22 -0
  1222. package/lib/typescript/engine/native.d.ts.map +1 -0
  1223. package/lib/typescript/engine/nativeScreens.d.ts +49 -0
  1224. package/lib/typescript/engine/nativeScreens.d.ts.map +1 -0
  1225. package/lib/typescript/engine/options.d.ts +12 -0
  1226. package/lib/typescript/engine/options.d.ts.map +1 -0
  1227. package/lib/typescript/engine/places.d.ts +57 -0
  1228. package/lib/typescript/engine/places.d.ts.map +1 -0
  1229. package/lib/typescript/engine/props.d.ts +10 -0
  1230. package/lib/typescript/engine/props.d.ts.map +1 -0
  1231. package/lib/typescript/engine/reactMeasures.d.ts +3 -0
  1232. package/lib/typescript/engine/reactMeasures.d.ts.map +1 -0
  1233. package/lib/typescript/engine/rememberedOptions.d.ts +28 -0
  1234. package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -0
  1235. package/lib/typescript/engine/screens.d.ts +90 -0
  1236. package/lib/typescript/engine/screens.d.ts.map +1 -0
  1237. package/lib/typescript/engine/slots.d.ts +71 -0
  1238. package/lib/typescript/engine/slots.d.ts.map +1 -0
  1239. package/lib/typescript/engine/tabs.d.ts +24 -0
  1240. package/lib/typescript/engine/tabs.d.ts.map +1 -0
  1241. package/lib/typescript/index.d.ts +3 -0
  1242. package/lib/typescript/index.d.ts.map +1 -0
  1243. package/lib/typescript/interfaces/ComponentEvents.d.ts +189 -0
  1244. package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -0
  1245. package/lib/typescript/interfaces/Events.d.ts +199 -0
  1246. package/lib/typescript/interfaces/Events.d.ts.map +1 -0
  1247. package/lib/typescript/interfaces/Layout.d.ts +150 -0
  1248. package/lib/typescript/interfaces/Layout.d.ts.map +1 -0
  1249. package/lib/typescript/interfaces/Options.d.ts +93 -0
  1250. package/lib/typescript/interfaces/Options.d.ts.map +1 -0
  1251. package/lib/typescript/interfaces/options/animations.d.ts +452 -0
  1252. package/lib/typescript/interfaces/options/animations.d.ts.map +1 -0
  1253. package/lib/typescript/interfaces/options/bottomTabs.d.ts +462 -0
  1254. package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -0
  1255. package/lib/typescript/interfaces/options/buttons.d.ts +331 -0
  1256. package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -0
  1257. package/lib/typescript/interfaces/options/common.d.ts +51 -0
  1258. package/lib/typescript/interfaces/options/common.d.ts.map +1 -0
  1259. package/lib/typescript/interfaces/options/modals.d.ts +202 -0
  1260. package/lib/typescript/interfaces/options/modals.d.ts.map +1 -0
  1261. package/lib/typescript/interfaces/options/preview.d.ts +40 -0
  1262. package/lib/typescript/interfaces/options/preview.d.ts.map +1 -0
  1263. package/lib/typescript/interfaces/options/sideMenu.d.ts +130 -0
  1264. package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -0
  1265. package/lib/typescript/interfaces/options/splitView.d.ts +118 -0
  1266. package/lib/typescript/interfaces/options/splitView.d.ts.map +1 -0
  1267. package/lib/typescript/interfaces/options/stack.d.ts +109 -0
  1268. package/lib/typescript/interfaces/options/stack.d.ts.map +1 -0
  1269. package/lib/typescript/interfaces/options/system.d.ts +238 -0
  1270. package/lib/typescript/interfaces/options/system.d.ts.map +1 -0
  1271. package/lib/typescript/interfaces/options/toolbar.d.ts +45 -0
  1272. package/lib/typescript/interfaces/options/toolbar.d.ts.map +1 -0
  1273. package/lib/typescript/interfaces/options/topBar.d.ts +804 -0
  1274. package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -0
  1275. package/lib/typescript/package.json +1 -0
  1276. package/package.json +189 -4
  1277. package/react-native.config.js +22 -0
  1278. package/src/ARCHITECTURE.md +289 -0
  1279. package/src/adapters/NativeANNTurboEventEmitter.ts +15 -0
  1280. package/src/adapters/NativeANNTurboModule.ts +100 -0
  1281. package/src/api/app/AppRegistry.ts +57 -0
  1282. package/src/api/app/activeApp.ts +20 -0
  1283. package/src/api/app/createNavigation.ts +566 -0
  1284. package/src/api/app/roots.ts +40 -0
  1285. package/src/api/app/splash.ts +154 -0
  1286. package/src/api/app/startFailure.tsx +39 -0
  1287. package/src/api/arrangement/arrangementState.ts +98 -0
  1288. package/src/api/commands/commands.ts +371 -0
  1289. package/src/api/commands/errors.ts +99 -0
  1290. package/src/api/commands/presentation.ts +78 -0
  1291. package/src/api/commands/sideMenus.ts +122 -0
  1292. package/src/api/commands/transitions.ts +133 -0
  1293. package/src/api/context/appContext.ts +23 -0
  1294. package/src/api/events/navigationEvents.ts +175 -0
  1295. package/src/api/events/screenLifecycle.ts +27 -0
  1296. package/src/api/events/tabPresses.ts +35 -0
  1297. package/src/api/hinge/hinge.ts +84 -0
  1298. package/src/api/hooks/appHooks.ts +37 -0
  1299. package/src/api/hooks/screenHooks.ts +272 -0
  1300. package/src/api/hooks/useArrangement.ts +26 -0
  1301. package/src/api/hooks/useHinge.ts +26 -0
  1302. package/src/api/hooks/useNavigation.ts +267 -0
  1303. package/src/api/hooks/usePendingLink.ts +11 -0
  1304. package/src/api/hooks/usePreview.ts +111 -0
  1305. package/src/api/hooks/useReservedRegions.ts +26 -0
  1306. package/src/api/hooks/useSafeAreaInsets.ts +23 -0
  1307. package/src/api/index.ts +139 -0
  1308. package/src/api/layout/Root.ts +113 -0
  1309. package/src/api/layout/Screen.ts +55 -0
  1310. package/src/api/layout/SideMenu.ts +87 -0
  1311. package/src/api/layout/SplitView.ts +146 -0
  1312. package/src/api/layout/Stack.ts +48 -0
  1313. package/src/api/layout/Tabs.ts +339 -0
  1314. package/src/api/layout/element.ts +114 -0
  1315. package/src/api/linking/linkPaths.ts +159 -0
  1316. package/src/api/linking/linking.ts +242 -0
  1317. package/src/api/linking/pendingLinks.ts +37 -0
  1318. package/src/api/linking/types.ts +130 -0
  1319. package/src/api/navigation.ts +269 -0
  1320. package/src/api/options/OptionsChain.ts +142 -0
  1321. package/src/api/options/ScreenOptions.ts +81 -0
  1322. package/src/api/options/buttons.ts +43 -0
  1323. package/src/api/safeArea/ANNSafeAreaViewNativeComponent.ts +28 -0
  1324. package/src/api/safeArea/screenInsets.ts +86 -0
  1325. package/src/api/safeArea/screenRegions.ts +99 -0
  1326. package/src/api/screens/ScreenBoundary.tsx +52 -0
  1327. package/src/api/screens/arrangement.ts +106 -0
  1328. package/src/api/screens/defineScreen.ts +57 -0
  1329. package/src/api/screens/nativeScreenCalls.ts +59 -0
  1330. package/src/api/screens/nativeScreens.ts +58 -0
  1331. package/src/api/screens/registerScreens.tsx +364 -0
  1332. package/src/api/slots/ANNSlotNativeComponent.ts +23 -0
  1333. package/src/api/slots/SlotHost.tsx +64 -0
  1334. package/src/api/state/navigationState.ts +95 -0
  1335. package/src/api/testIDs.ts +11 -0
  1336. package/src/api/theme/theme.ts +184 -0
  1337. package/src/api/types.ts +95 -0
  1338. package/src/engine/backListeners.ts +36 -0
  1339. package/src/engine/buttons.ts +91 -0
  1340. package/src/engine/commands.ts +469 -0
  1341. package/src/engine/events.ts +24 -0
  1342. package/src/engine/ids.ts +7 -0
  1343. package/src/engine/launchState.ts +35 -0
  1344. package/src/engine/layout.ts +247 -0
  1345. package/src/engine/mergeOptions.ts +20 -0
  1346. package/src/engine/native.ts +51 -0
  1347. package/src/engine/nativeScreens.ts +263 -0
  1348. package/src/engine/options.ts +165 -0
  1349. package/src/engine/places.ts +205 -0
  1350. package/src/engine/props.ts +45 -0
  1351. package/src/engine/reactMeasures.ts +24 -0
  1352. package/src/engine/rememberedOptions.ts +111 -0
  1353. package/src/engine/screens.tsx +239 -0
  1354. package/src/engine/slots.ts +191 -0
  1355. package/src/engine/tabs.ts +95 -0
  1356. package/src/index.ts +3 -0
  1357. package/src/interfaces/ComponentEvents.ts +214 -0
  1358. package/src/interfaces/Events.ts +227 -0
  1359. package/src/interfaces/Layout.ts +161 -0
  1360. package/src/interfaces/Options.ts +175 -0
  1361. package/src/interfaces/options/animations.ts +480 -0
  1362. package/src/interfaces/options/bottomTabs.ts +481 -0
  1363. package/src/interfaces/options/buttons.ts +364 -0
  1364. package/src/interfaces/options/common.ts +76 -0
  1365. package/src/interfaces/options/modals.ts +217 -0
  1366. package/src/interfaces/options/preview.ts +40 -0
  1367. package/src/interfaces/options/sideMenu.ts +132 -0
  1368. package/src/interfaces/options/splitView.ts +127 -0
  1369. package/src/interfaces/options/stack.ts +110 -0
  1370. package/src/interfaces/options/system.ts +252 -0
  1371. package/src/interfaces/options/toolbar.ts +47 -0
  1372. package/src/interfaces/options/topBar.ts +828 -0
@@ -0,0 +1,1269 @@
1
+ package dev.apexnative.navigation.viewcontrollers.modal
2
+
3
+ import dev.apexnative.navigation.options.DefaultOptions
4
+ import dev.apexnative.navigation.options.LayoutAnimation
5
+ import dev.apexnative.navigation.options.ModalAnimationOptions
6
+ import dev.apexnative.navigation.options.Options
7
+ import dev.apexnative.navigation.options.SheetDetent
8
+ import dev.apexnative.navigation.options.ViewAnimationOptions
9
+ import dev.apexnative.navigation.react.CommandAnswer
10
+ import dev.apexnative.navigation.react.CommandListener
11
+ import dev.apexnative.navigation.react.ErrorTexts
12
+ import dev.apexnative.navigation.react.events.AppearanceDispatcher
13
+ import dev.apexnative.navigation.viewcontrollers.component.Readiness
14
+ import dev.apexnative.navigation.viewcontrollers.component.RenderWait
15
+ import dev.apexnative.navigation.viewcontrollers.modal.ModalRecord.Dismissal
16
+ import dev.apexnative.navigation.viewcontrollers.modal.ModalRecord.State
17
+ import dev.apexnative.navigation.viewcontrollers.navigator.RootCoordinator
18
+ import dev.apexnative.navigation.viewcontrollers.navigator.WaitingLayer
19
+ import dev.apexnative.navigation.viewcontrollers.stack.StackController
20
+ import dev.apexnative.navigation.viewcontrollers.viewcontroller.ViewController
21
+ import dev.apexnative.navigation.views.animations.AnimationRules
22
+
23
+ /**
24
+ * The modals of one activity: one [ModalRecord] per modal, in the order of their shows, the newest last. Every rule
25
+ * about modals is a move of one record, applied when the step runs;
26
+ * nothing else keeps a list of modals: the navigator, the navigation state, back and the reload ask here.
27
+ *
28
+ * A modal is made, joins the modals layer at the top, unseen, and waits for its screens with the core's one wait
29
+ * ([RenderWait], `animations.showModal.enter.waitForRender` unset — the content and the bars' components at most
30
+ * [WAIT_LIMIT_MILLIS] together; `true` — as long as it takes, the bars 0.5 s after; `false` — not at all). Then it
31
+ * shows, once every older waiting modal showed or went (N1): `ComponentWillAppear` of its screens, its slide up (or the
32
+ * Material sheet's motion), then the layer under it leaves its layer when the modal covers it, and the end steps of a
33
+ * transition. Android has no gate: transitions overlap.
34
+ *
35
+ * The views, the readiness of the screens and the clock are given ([Views], [Readiness], the scheduler), so the table
36
+ * runs in unit tests. Main thread only.
37
+ *
38
+ * The steps that come later (the wait's timers and readiness signals, the end of the targets' wait, an animator's end,
39
+ * the sheet's callbacks, back of the user) run under no runner: each goes through one guard ([guarded]), and a
40
+ * failure there ends the record it concerns by its own failure path, rejects what waits for it with its error text and
41
+ * lets the modals that wait go on (ARCHITECTURE.md section 5).
42
+ */
43
+ internal class ModalCoordinator(
44
+ private val views: Views,
45
+ private val readiness: Readiness,
46
+ private val scheduler: AppearanceDispatcher.Scheduler,
47
+ private val host: Host,
48
+ ) : RootCoordinator.ModalsOverRoot {
49
+ /** What the modals ask of their activity's navigation. */
50
+ interface Host {
51
+ /** The root the modals lie over; none before the first `setRoot` (the splash is under them then). */
52
+ val root: ViewController<*>?
53
+
54
+ /** The node with [id] in the activity's registry; none. */
55
+ fun find(id: String): ViewController<*>?
56
+
57
+ /** Whether the activity can be seen (at least started): animations play only then, as frames come only then. */
58
+ fun isSeen(): Boolean
59
+
60
+ /** [layer] waits to show from now on (`Navigator.addWaitingLayer`). */
61
+ fun addWaitingLayer(layer: WaitingLayer)
62
+
63
+ /** [layer] no longer waits to show. */
64
+ fun removeWaitingLayer(layer: WaitingLayer)
65
+
66
+ /** What back does may have changed (`BackCallbackState.update`). */
67
+ fun backChanged()
68
+
69
+ /** Writes [text] to the log. */
70
+ fun log(text: String)
71
+ }
72
+
73
+ /** The views of the modals layer and of the root layer under it. Main thread only. */
74
+ interface Views {
75
+ /**
76
+ * The record's container joins the modals layer at the top, waiting: transparent, without touches, unseen by
77
+ * accessibility, with its root's view in it (a sheet's at the sheet's full height). It may throw: nothing of
78
+ * it stays then.
79
+ */
80
+ fun place(record: ModalRecord)
81
+
82
+ /**
83
+ * The record shows with [options] (resolved): its container visible, its slide up when [animated] — or
84
+ * [motion], an animation of its own —, at once otherwise and while nobody [seen] it; a sheet's root view goes
85
+ * into a Material sheet that slides to its first detent ([events] hear the user), whatever the options' own.
86
+ * [onEnd] once it is in place, at most once. The function returned stops it where it is, without [onEnd]; a
87
+ * screen under it that its [motion] moved goes back to rest then.
88
+ */
89
+ fun present(
90
+ record: ModalRecord,
91
+ options: Options,
92
+ animated: Boolean,
93
+ seen: Boolean,
94
+ events: ModalSheet.Events,
95
+ onEnd: () -> Unit,
96
+ motion: Motion?,
97
+ ): () -> Unit
98
+
99
+ /**
100
+ * The record leaves: its slide down (or [motion]) when [animated] and [seen], a sheet's when [seen]; as
101
+ * [present].
102
+ */
103
+ fun dismiss(
104
+ record: ModalRecord,
105
+ animated: Boolean,
106
+ seen: Boolean,
107
+ onEnd: () -> Unit,
108
+ motion: Motion?,
109
+ ): () -> Unit
110
+
111
+ /**
112
+ * The wait of the record's show for the targets of [animation]'s elements in its screens (and in [under]'s),
113
+ * as a stack's, while [waiting] holds; [done] once, not after the function returned stopped it.
114
+ */
115
+ fun awaitTargets(
116
+ record: ModalRecord,
117
+ animation: ModalAnimationOptions,
118
+ under: ViewController<*>?,
119
+ waiting: () -> Boolean,
120
+ done: () -> Unit,
121
+ ): () -> Unit {
122
+ done()
123
+ return {}
124
+ }
125
+
126
+ /** The record's views leave (a sheet's `remove()`); the modals layer hides when it holds none. */
127
+ fun remove(record: ModalRecord)
128
+
129
+ /** The record's show was stopped: its views stand where it ends (a sheet's goes on as its view is shown). */
130
+ fun settle(record: ModalRecord)
131
+
132
+ /** The record's container leaves the modals layer: a modal over it covers it. */
133
+ fun takeOut(record: ModalRecord)
134
+
135
+ /** The record's container comes back into the modals layer, at the place of [at], else at the top. */
136
+ fun putBack(record: ModalRecord, at: ModalRecord?)
137
+
138
+ /** [root]'s view leaves the root layer: a modal over it covers it. */
139
+ fun takeOutRoot(root: ViewController<*>)
140
+
141
+ /** [root]'s view comes back into the root layer. */
142
+ fun putBackRoot(root: ViewController<*>)
143
+
144
+ /**
145
+ * The record goes with [oldRoot]: its container moves into the root layer right above the old root's view
146
+ * (under the new root), and leaves with the old root's part of the transition.
147
+ */
148
+ fun carry(record: ModalRecord, oldRoot: ViewController<*>?)
149
+
150
+ /** New [options] (resolved) of the record: its `testID`s, its sheet's `update` ([move]: to its selection). */
151
+ fun update(record: ModalRecord, options: Options, move: Boolean)
152
+
153
+ /** The colors of the record's own views again (a light/dark switch). */
154
+ fun repaint(record: ModalRecord) = Unit
155
+
156
+ /** The record's views lay out again (the activity resumed). */
157
+ fun requestLayout(record: ModalRecord) = Unit
158
+ }
159
+
160
+ /**
161
+ * A show or a dismissal of the modal's own: [side] plays on the modal (the show's `enter`, the dismissal's `exit`),
162
+ * or it fades ([fades]: in at a show, out at a dismissal, 300 ms) around elements; with neither it doesn't move —
163
+ * it appears on the first frame, or stands to the end and goes. [underSide] plays on [under], the layer under it
164
+ * (the show's `exit`, the dismissal's `enter`). [elements]: the animation's elements from [from] to [to] (only with
165
+ * a layer under it).
166
+ */
167
+ class Motion(
168
+ val side: ViewAnimationOptions?,
169
+ val fades: Boolean,
170
+ val under: ViewController<*>?,
171
+ val underSide: ViewAnimationOptions?,
172
+ val elements: LayoutAnimation?,
173
+ val from: ViewController<*>?,
174
+ val to: ViewController<*>?,
175
+ )
176
+
177
+ // A `dismissAllModals` on its way.
178
+ private class Batch(val answer: CommandAnswer?) {
179
+ var members: List<ModalRecord> = emptyList()
180
+ // The record that leaves with its animation; none: they all go at once.
181
+ var top: ModalRecord? = null
182
+ // The modals it reports, and the screen the event names (the topmost counted record's).
183
+ var count = 0
184
+ var screen: ViewController<*>? = null
185
+ // The layer it reveals, when that had disappeared.
186
+ var revealed: ViewController<*>? = null
187
+ // The `dismissAllModals` that came during it and found nothing else (N6).
188
+ val later = mutableListOf<CommandAnswer>()
189
+ }
190
+
191
+ private val records = mutableListOf<ModalRecord>()
192
+ private val batches = mutableListOf<Batch>()
193
+ // The records that go with the old root of a `setRoot` in its transition (row 13), and the answers they hold.
194
+ private val carried = mutableListOf<ModalRecord>()
195
+ private val carriedAnswers = mutableListOf<CommandAnswer>()
196
+ // The root's view is out of the root layer: a modal covers it.
197
+ private var rootOut = false
198
+ // The ids of the modals that closed while no command waits for them: the user closed them (a drag, the scrim,
199
+ // back) or they were dismissed from below a modal that stays. `dismissModal` with one resolves.
200
+ private val closedAnswerable = HashMap<String, String>()
201
+ // A setRoot takes the modals now: one that waits goes, and none starts to show meanwhile.
202
+ private var taking = false
203
+
204
+ /** Every modal not gone, bottom to top. */
205
+ val modals: List<ModalRecord>
206
+ get() = records.toList()
207
+
208
+ /** The layout the user sees among the modals: the top modal that shows or comes in; none. */
209
+ val visibleLayout: ViewController<*>?
210
+ get() = records.lastOrNull { it.effective == State.Presenting || it.effective == State.Shown }?.root
211
+
212
+ /** The tops of the modals not gone, bottom to top: what the repaint walks. */
213
+ fun layers(): List<ViewController<*>> = records.map { it.root }
214
+
215
+ /** The modal [node] is in; none for a node of the root, an overlay, or no modal. */
216
+ fun recordOf(node: ViewController<*>): ModalRecord? {
217
+ val top = topOf(node)
218
+ return records.firstOrNull { it.root === top }
219
+ }
220
+
221
+ /**
222
+ * [node] is in a modal of the old root of a `setRoot` on its way (`setRoot` step 3): commands by its id answer "not
223
+ * shown", though it is still on screen.
224
+ */
225
+ fun isWithOldRoot(node: ViewController<*>): Boolean {
226
+ val top = topOf(node)
227
+ return records.any { it.root === top && it.state == State.WithOldRoot } || carried.any { it.root === top }
228
+ }
229
+
230
+ // Commands.
231
+
232
+ /**
233
+ * `showModal` after its checks: [make] makes the tree; the modal is the top at once, waiting (`showModal` step 2),
234
+ * and [answer] resolves with its root's id after its show. A failure to make or place it goes to the caller, which
235
+ * rejects; nothing of it stays then.
236
+ */
237
+ fun show(make: () -> ViewController<*>, answer: CommandAnswer) {
238
+ start(make, answer, null)
239
+ }
240
+
241
+ /**
242
+ * A modal of a `setRoot`'s layout: made now, shown without animation unless [animated] (the last modal, with its
243
+ * `animations.showModal`); [done] once it showed or went. A failure is logged and skipped. The function returned
244
+ * stops the step while the modal waits (a newer `setRoot`): it goes without a word.
245
+ */
246
+ fun showInChain(id: String, make: () -> ViewController<*>, animated: Boolean, done: () -> Unit): () -> Unit {
247
+ val record = try {
248
+ start(make, null, ModalRecord.Chain(animated, done))
249
+ } catch (e: Throwable) {
250
+ val reason = ErrorTexts.reasonOf(e)
251
+ host.log("[ApexNavigation] setRoot: ${ErrorTexts.couldNot("show the screen '$id'", reason)}")
252
+ done()
253
+ return {}
254
+ }
255
+ return {
256
+ record.chain = null
257
+ if (record.state == State.Waiting) cancel(record, null, reports = false)
258
+ }
259
+ }
260
+
261
+ /**
262
+ * `dismissModal` after its shared steps: the record of [componentId], Android's rule of the last modal without a
263
+ * root, [options] merged into the modal's visible screen, the animation of the command's screen with its parents
264
+ * and the defaults, then the record's move (row 4).
265
+ */
266
+ fun dismiss(componentId: String, options: Options?, answer: CommandAnswer) {
267
+ val node = host.find(componentId)
268
+ val record = when (val found = lookup(componentId, node)) {
269
+ Lookup.NotShown -> return answer.reject(ErrorTexts.screenNotShown(componentId))
270
+ Lookup.NotInModal -> return answer.reject(ErrorTexts.notInModal(componentId))
271
+ is Lookup.Closed -> return answer.resolve(found.rootId)
272
+ is Lookup.Found -> found.record
273
+ }
274
+ when (record.state) {
275
+ State.WithOldRoot, State.Gone -> return answer.reject(ErrorTexts.screenNotShown(componentId))
276
+ State.ClosedBelow -> return answer.resolve(record.rootId)
277
+ else -> Unit
278
+ }
279
+ if (isLastWithoutRoot(record)) return answer.reject(ErrorTexts.modalWithoutRoot(componentId))
280
+ options?.let { mergeInto(record, it) }
281
+ val from = node?.takeUnless { it.isDestroyed } ?: record.root
282
+ val animation = from.resolveCurrentOptions(DefaultOptions.current).animations.dismissModal
283
+ request(record, Dismissal(answer, AnimationRules.dismissAnimated(animation), byUser = false, animation))
284
+ }
285
+
286
+ /**
287
+ * `dismissAllModals` after its shared steps: [options] merge into the top modal's visible screen and its
288
+ * `animations.dismissModal` decides the animation of the top one; every modal goes in one batch with one
289
+ * `ANN.ModalDismissed`; the answer is `''`. A value of [options] that can't be read ([unreadablePath]) rejects
290
+ * before anything changes, with the id of the top modal's visible screen.
291
+ */
292
+ fun dismissAll(options: Options?, unreadablePath: String?, answer: CommandAnswer) {
293
+ val members = records.filter { it.batch == null && it.state in BATCHED }
294
+ if (members.isEmpty()) {
295
+ // Nothing else to take: the second one answers with the running batch (N6), else at once.
296
+ val running = batches.lastOrNull()
297
+ if (running != null) running.later += answer else answer.resolve("")
298
+ return
299
+ }
300
+ val top = topRecord() ?: members.last()
301
+ if (unreadablePath != null) {
302
+ val screen = AppearanceDispatcher.visibleNode(top.root)
303
+ return answer.reject(ErrorTexts.unreadableOption(unreadablePath, screen.id))
304
+ }
305
+ options?.let { mergeInto(top, it) }
306
+ val animation = top.root.resolveShownOptions(DefaultOptions.current).animations.dismissModal
307
+ startBatch(members, answer, AnimationRules.dismissAnimated(animation), animation)
308
+ }
309
+
310
+ // Back.
311
+
312
+ /**
313
+ * Back after JavaScript's listeners: the top modal that waits, comes in or shows, first — its content goes back if
314
+ * it can; else `hardwareBackButton.dismissModalOnPress` of its options at this moment: `true` closes it as
315
+ * `dismissModal` of its root, without a promise; `false` sends `ANN.NavigationButtonPressed` with
316
+ * `ApexNavigation.hardwareBackButton`. Null without such a modal: back goes to the root. False when back isn't
317
+ * taken: the only modal over no root.
318
+ */
319
+ fun handleBack(listener: CommandListener): Boolean? {
320
+ val record = backTarget() ?: return null
321
+ val what = "go back from the screen '${record.rootId}'"
322
+ // Only a failure of the modal's own dismissal ends the modal; one of its content's back or of the event leaves
323
+ // it as it was (a modal that waits or comes in goes on with its show).
324
+ var dismissal: Dismissal? = null
325
+ logged(what) {
326
+ if (record.root.handleBack(listener)) return true
327
+ if (holdsBack(record)) {
328
+ AppearanceDispatcher.navigationButtonPressed(
329
+ AppearanceDispatcher.visibleNode(record.root),
330
+ StackController.HARDWARE_BACK_BUTTON_ID,
331
+ )
332
+ return true
333
+ }
334
+ if (isLastWithoutRoot(record)) return false
335
+ val animation = record.root.resolveCurrentOptions(DefaultOptions.current).animations.dismissModal
336
+ dismissal = Dismissal(null, AnimationRules.dismissAnimated(animation), byUser = true, animation)
337
+ }
338
+ val taken = dismissal ?: return true
339
+ try {
340
+ request(record, taken)
341
+ } catch (e: Throwable) {
342
+ fail(record, e, what)
343
+ }
344
+ return true
345
+ }
346
+
347
+ /** The mirror of [handleBack], without acting; null without a modal to ask. */
348
+ fun canHandleBack(): Boolean? {
349
+ val record = backTarget() ?: return null
350
+ return record.root.canHandleBack() || holdsBack(record) || !isLastWithoutRoot(record)
351
+ }
352
+
353
+ // Options.
354
+
355
+ /**
356
+ * A `mergeOptions` went into [node] (`mergeOptions` step 5): when it is in a modal, the modal's sheet takes its
357
+ * options again (it re-reads the resolved ones at any merge) and its `testID`s apply again.
358
+ */
359
+ fun optionsMergedInto(node: ViewController<*>) {
360
+ val record = recordOf(node) ?: return
361
+ if (record.root.isDestroyed) return
362
+ views.update(record, record.root.resolveShownOptions(DefaultOptions.current), move = true)
363
+ }
364
+
365
+ /**
366
+ * A stack or the tabs of [node] changed the screen they show (`Navigator.shownScreensChanged`): a modal's sheet
367
+ * takes the hold of the new screen, without moving.
368
+ */
369
+ fun visibleScreenChanged(node: ViewController<*>) {
370
+ val record = recordOf(node) ?: return
371
+ if (record.state == State.Waiting || record.root.isDestroyed) return
372
+ views.update(record, record.root.resolveShownOptions(DefaultOptions.current), move = false)
373
+ }
374
+
375
+ /** The colors of the modals' own views again, after a light/dark switch. */
376
+ fun repaint() {
377
+ records.forEach(views::repaint)
378
+ }
379
+
380
+ /** The activity resumed: the modals lay out again; nothing is sent. */
381
+ fun onResume() {
382
+ records.forEach(views::requestLayout)
383
+ }
384
+
385
+ // A `setRoot` (RootCoordinator.ModalsOverRoot).
386
+
387
+ // A modal still waiting would only show over the root that goes: cancelled; the others go with the old
388
+ // root and commands don't find them; a dismissal finishes on its own.
389
+ override fun rootAccepted() = whileTaking {
390
+ for (record in records.toList()) {
391
+ when (record.state) {
392
+ State.Waiting -> cancel(record, null, reports = false)
393
+ State.Presenting, State.Shown, State.ClosedBelow -> {
394
+ record.takeIds()
395
+ record.before = record.state
396
+ record.state = State.WithOldRoot
397
+ }
398
+ else -> Unit
399
+ }
400
+ }
401
+ host.backChanged()
402
+ }
403
+
404
+ // The `setRoot` that took them ended without replacing the root.
405
+ override fun rootKept() {
406
+ records.filter { it.state == State.WithOldRoot }.forEach { it.state = it.before }
407
+ host.backChanged()
408
+ }
409
+
410
+ // Every modal goes with the old root; one that waits is cancelled. Their views go into the root layer over
411
+ // the old root (put back first when a modal covered it), and leave with its part of the transition.
412
+ override fun rootReplaced(old: ViewController<*>?) = whileTaking {
413
+ if (rootOut && old != null) views.putBackRoot(old)
414
+ rootOut = false
415
+ for (batch in batches) {
416
+ batch.answer?.let(carriedAnswers::add)
417
+ carriedAnswers += batch.later
418
+ }
419
+ batches.clear()
420
+ for (record in records.toList()) {
421
+ if (record.state == State.Waiting) {
422
+ cancel(record, null, reports = false)
423
+ continue
424
+ }
425
+ record.stopAnimation?.invoke()
426
+ record.stopAnimation = null
427
+ if (!record.root.isDestroyed) record.root.onLeaveStarted()
428
+ views.carry(record, old)
429
+ carried += record
430
+ }
431
+ records.clear()
432
+ host.backChanged()
433
+ }
434
+
435
+ // The transition that replaced the root ended (or was cut): the modals that went with it are destroyed after it,
436
+ // their shown screens' DidDisappear first, without `ANN.ModalDismissed`; what waited for them resolves.
437
+ override fun replacedRootGone() {
438
+ val taken = carried.toList()
439
+ carried.clear()
440
+ for (record in taken) {
441
+ views.remove(record)
442
+ record.state = State.Gone
443
+ if (!record.root.isDestroyed) record.root.destroy()
444
+ answerAll(record)
445
+ }
446
+ val answers = carriedAnswers.toList()
447
+ carriedAnswers.clear()
448
+ answers.forEach { it.resolve("") }
449
+ }
450
+
451
+ /**
452
+ * The activity's layers go (12): JavaScript reloads (nothing is sent, nothing answers: the generation moved) or the
453
+ * activity is destroyed (the destroy events; shows and the commands that wait resolve with their roots' ids, open
454
+ * point 5). A `setRoot`'s chain gets nothing: the root coordinator answers it.
455
+ */
456
+ fun destroyAll() {
457
+ val all = records.toList() + carried
458
+ records.clear()
459
+ carried.clear()
460
+ for (record in all) {
461
+ stopWaits(record)
462
+ host.removeWaitingLayer(record)
463
+ record.stopAnimation?.invoke()
464
+ record.stopAnimation = null
465
+ views.remove(record)
466
+ record.state = State.Gone
467
+ record.chain = null
468
+ if (!record.root.isDestroyed) record.root.destroy()
469
+ answerAll(record)
470
+ }
471
+ val answers = batches.flatMap { listOfNotNull(it.answer) + it.later } + carriedAnswers
472
+ batches.clear()
473
+ carriedAnswers.clear()
474
+ answers.forEach { it.resolve("") }
475
+ closedAnswerable.clear()
476
+ rootOut = false
477
+ }
478
+
479
+ // The show (3, 4).
480
+
481
+ private fun start(make: () -> ViewController<*>, answer: CommandAnswer?, chain: ModalRecord.Chain?): ModalRecord {
482
+ val root = make()
483
+ val record: ModalRecord
484
+ val options: Options
485
+ try {
486
+ options = root.resolveShownOptions(DefaultOptions.current)
487
+ // A sheet or not is decided before the root's view is made: its screens keep no room for the status bar.
488
+ val sheet = ModalRecord.isSheet(options)
489
+ root.shownAsSheet = sheet
490
+ record = ModalRecord(root, sheet)
491
+ } catch (e: Throwable) {
492
+ root.destroy()
493
+ throw e
494
+ }
495
+ // A waiting layer before its views join the window: what is in it isn't on screen from its first layout.
496
+ record.screensChanged = { screensChanged(record) }
497
+ host.addWaitingLayer(record)
498
+ try {
499
+ views.place(record)
500
+ } catch (e: Throwable) {
501
+ host.removeWaitingLayer(record)
502
+ root.destroy()
503
+ throw e
504
+ }
505
+ record.takeIds()
506
+ record.ids.forEach { closedAnswerable.remove(it) }
507
+ record.showAnswer = answer
508
+ record.chain = chain
509
+ records += record
510
+ // From here the record is listed: a failure ends it by its own path (the show rejects, the chain goes on),
511
+ // so no record stays waiting and the modals after it don't hang.
512
+ guarded(record) {
513
+ host.backChanged()
514
+ await(record, options)
515
+ }
516
+ return record
517
+ }
518
+
519
+ // The one wait of the core with the root's values: the screens the modal shows and, with `together` tabs, those it
520
+ // doesn't, within their own limit.
521
+ private fun await(record: ModalRecord, options: Options) {
522
+ val waitForRender = options.animations.showModal.enter.waitForRender
523
+ val unset = !waitForRender.isTrue && !waitForRender.isFalse
524
+ // Without `waitForRender` the targets of its elements wait within the same 0.5 s.
525
+ if (unset) record.cancelLimit = scheduler.schedule(WAIT_LIMIT_MILLIS) { record.overLimit = true }
526
+ val wait = RenderWait(
527
+ readiness = readiness,
528
+ scheduler = scheduler,
529
+ limitMillis = if (unset) WAIT_LIMIT_MILLIS else null,
530
+ bar = if (waitForRender.isTrue) RenderWait.Bar.AfterContent else RenderWait.Bar.WithinLimit,
531
+ countsUnknownContent = false,
532
+ step = { work -> guarded(record, work) },
533
+ onEnd = { guarded(record) { ready(record) } },
534
+ )
535
+ record.wait = wait
536
+ if (waitForRender.isFalse) {
537
+ wait.start(emptyList())
538
+ } else {
539
+ wait.start(RenderWait.waitedScreens(record.root), RenderWait.unseenScreens(record.root))
540
+ }
541
+ }
542
+
543
+ // A stack of the waiting modal changed its top: the wait follows the screens it shows now.
544
+ private fun screensChanged(record: ModalRecord) {
545
+ if (record.state != State.Waiting) return
546
+ val wait = record.wait ?: return
547
+ guarded(record) { wait.retake(RenderWait.waitedScreens(record.root), RenderWait.unseenScreens(record.root)) }
548
+ }
549
+
550
+ // Its wait ended; with elements, then the wait for their targets, hidden still.
551
+ private fun ready(record: ModalRecord) {
552
+ if (record.state != State.Waiting) return
553
+ record.wait = null
554
+ if (!record.targetsAwaited && awaitsTargets(record)) return awaitTargets(record)
555
+ record.cancelLimit()
556
+ record.isReady = true
557
+ presentReady()
558
+ }
559
+
560
+ // A modal not shown as a sheet, whose show animates with elements over a layer under it: unless `waitForRender:
561
+ // false`, its show waits for their targets too.
562
+ private fun awaitsTargets(record: ModalRecord): Boolean {
563
+ if (record.isSheet || record.chain?.animated == false || !host.isSeen()) return false
564
+ val animation = record.root.resolveShownOptions(DefaultOptions.current).animations.showModal
565
+ return AnimationRules.showAnimated(animation) && AnimationRules.hasElements(animation) &&
566
+ !animation.enter.waitForRender.isFalse && nodeOf(layerUnder(record)) != null
567
+ }
568
+
569
+ private fun awaitTargets(record: ModalRecord) {
570
+ record.targetsAwaited = true
571
+ val animation = record.root.resolveShownOptions(DefaultOptions.current).animations.showModal
572
+ var stopped = false
573
+ val stop = views.awaitTargets(
574
+ record,
575
+ animation,
576
+ nodeOf(layerUnder(record)),
577
+ waiting = { !stopped && record.state == State.Waiting && !record.overLimit },
578
+ ) {
579
+ if (stopped) return@awaitTargets
580
+ stopped = true
581
+ record.stopTargets = null
582
+ guarded(record) { ready(record) }
583
+ }
584
+ if (!stopped) {
585
+ record.stopTargets = {
586
+ stopped = true
587
+ stop()
588
+ }
589
+ }
590
+ }
591
+
592
+ // What a record waits for stops: its screens, the targets of its elements, the limit.
593
+ private fun stopWaits(record: ModalRecord) {
594
+ record.wait?.cancel()
595
+ record.wait = null
596
+ record.stopTargets?.invoke()
597
+ record.stopTargets = null
598
+ record.cancelLimit()
599
+ }
600
+
601
+ // N1: a ready modal shows once every older waiting one showed or went.
602
+ private fun presentReady() {
603
+ if (taking) return
604
+ for (record in records.toList()) {
605
+ if (record.state != State.Waiting) continue
606
+ if (!record.isReady) return
607
+ present(record)
608
+ }
609
+ }
610
+
611
+ // W → P: the decisions of the show, WillAppear of its screens, its animation.
612
+ private fun present(record: ModalRecord) {
613
+ host.removeWaitingLayer(record)
614
+ record.state = State.Presenting
615
+ try {
616
+ val options = record.root.resolveShownOptions(DefaultOptions.current)
617
+ record.coversUnder = ModalRecord.coversUnder(record.isSheet, options)
618
+ val animation = options.animations.showModal
619
+ val animated = (record.chain?.animated ?: true) && AnimationRules.showAnimated(animation)
620
+ // Its own animation over the layer under it; a sheet has only its Material motion.
621
+ val motion = if (animated && !record.isSheet) motionOf(animation, record, showing = true) else null
622
+ AppearanceDispatcher.beginTransition(listOf(record.root))
623
+ var ended = false
624
+ val stop = views.present(record, options, animated, host.isSeen(), SheetEvents(record), {
625
+ ended = true
626
+ guarded(record) { presented(record) }
627
+ }, motion)
628
+ if (!ended) record.stopAnimation = stop
629
+ } catch (e: Throwable) {
630
+ failed(record, e)
631
+ }
632
+ }
633
+
634
+ // The show couldn't be made, or a later step of it failed: the modal goes as a cancel, the show rejects (the chain
635
+ // logs and goes on), the layer it took out comes back, and the modals that wait go on. Its views and its root go
636
+ // each on their own: a part that fails again doesn't keep the rest from running.
637
+ private fun failed(record: ModalRecord, e: Throwable) {
638
+ val text = ErrorTexts.couldNot("show the screen '${record.rootId}'", ErrorTexts.reasonOf(e))
639
+ val under = layerUnder(record)
640
+ runCatching { record.stopAnimation?.invoke() }
641
+ record.stopAnimation = null
642
+ runCatching { stopWaits(record) }
643
+ record.state = State.Gone
644
+ val listed = records.remove(record)
645
+ host.removeWaitingLayer(record)
646
+ runCatching { views.remove(record) }
647
+ runCatching { if (!record.root.isDestroyed) record.root.destroy() }
648
+ if (record.showAnswer == null && record.chain == null) host.log("[ApexNavigation] $text")
649
+ record.showAnswer?.reject(text)
650
+ record.showAnswer = null
651
+ record.chain?.let {
652
+ record.chain = null
653
+ host.log("[ApexNavigation] setRoot: $text")
654
+ it.done()
655
+ }
656
+ record.answers.forEach { it.resolve(record.rootId) }
657
+ record.waitingDismissals.forEach { it.answer?.resolve(record.rootId) }
658
+ if (listed) runCatching { revealIfUncovered(under) }
659
+ host.backChanged()
660
+ presentReady()
661
+ }
662
+
663
+ // A later step of a dismissal failed (its end, the close of a modal below, back): the modal goes as at that end,
664
+ // without the events not sent yet; what waits for it rejects, the layer it took out comes back, and the modals that
665
+ // wait go on.
666
+ private fun dismissFailed(record: ModalRecord, e: Throwable) {
667
+ val text = ErrorTexts.couldNot("dismiss the modal of the screen '${record.rootId}'", ErrorTexts.reasonOf(e))
668
+ val listed = record in records
669
+ val under = layerUnder(record)
670
+ runCatching { record.stopAnimation?.invoke() }
671
+ record.stopAnimation = null
672
+ runCatching { stopWaits(record) }
673
+ if (record.ending?.byUser == true) record.ids.forEach { closedAnswerable[it] = record.rootId }
674
+ record.state = State.Gone
675
+ records.remove(record)
676
+ host.removeWaitingLayer(record)
677
+ runCatching { views.remove(record) }
678
+ runCatching { if (!record.root.isDestroyed) record.root.destroy() }
679
+ val answers = listOfNotNull(record.showAnswer) + record.answers +
680
+ record.waitingDismissals.mapNotNull { it.answer }
681
+ record.showAnswer = null
682
+ record.answers.clear()
683
+ record.waitingDismissals.clear()
684
+ if (answers.none { !it.isAnswered }) host.log("[ApexNavigation] $text")
685
+ answers.forEach { it.reject(text) }
686
+ record.chain?.let {
687
+ record.chain = null
688
+ it.done()
689
+ }
690
+ if (listed) runCatching { revealIfUncovered(under) }
691
+ host.backChanged()
692
+ presentReady()
693
+ }
694
+
695
+ // The show ended. The layer under leaves its layer when the modal covers it; DidDisappear of its
696
+ // screens, DidAppear of the modal's, the state, the answer. In a `setRoot`'s chain: no answer, no state of its own.
697
+ // A modal a `setRoot` took while it came in ends its show the same way and stays taken.
698
+ private fun presented(record: ModalRecord) {
699
+ record.stopAnimation = null
700
+ if (record.effective != State.Presenting) return
701
+ move(record, State.Shown)
702
+ val hiding = ArrayList<ViewController<*>>(1)
703
+ if (record.coversUnder) {
704
+ var under = layerUnder(record)
705
+ // A modal under it still coming in ends its show at its place first (its DidAppear, its answer): out of
706
+ // the window its slide or its sheet's settle would end unseen or never (a hung show).
707
+ // Under its own guard: a failure there ends that modal, and this one goes on.
708
+ if (under != null && under.effective == State.Presenting) {
709
+ val lower: ModalRecord = under
710
+ guarded(lower) {
711
+ lower.stopAnimation?.invoke()
712
+ views.settle(lower)
713
+ presented(lower)
714
+ }
715
+ under = layerUnder(record)
716
+ }
717
+ if (under == null) {
718
+ host.root?.let {
719
+ if (!rootOut) views.takeOutRoot(it)
720
+ rootOut = true
721
+ hiding += it
722
+ }
723
+ } else {
724
+ if (!under.isOut) views.takeOut(under)
725
+ under.isOut = true
726
+ hiding += under.root
727
+ }
728
+ }
729
+ // The answer and the chain stay on the record until the events went: a failure among them still answers.
730
+ val answer = record.showAnswer
731
+ val chain = record.chain
732
+ AppearanceDispatcher.endTransition(
733
+ hiding = hiding,
734
+ showing = listOf(record.root),
735
+ events = null,
736
+ answer = answer,
737
+ value = record.rootId,
738
+ reportsState = chain == null,
739
+ )
740
+ record.showAnswer = null
741
+ record.chain = null
742
+ // The chain and a dismissal that waited for the show go on whatever back's update does: they are no longer on
743
+ // the record, nothing else would start them.
744
+ try {
745
+ host.backChanged()
746
+ } finally {
747
+ chain?.done?.invoke()
748
+ // A `setRoot` took it: commands wait for the old root (row 13), back and the user act as on a shown modal.
749
+ val next = when (record.state) {
750
+ State.Shown -> record.waitingDismissals.removeFirstOrNull()
751
+ State.WithOldRoot -> record.waitingDismissals.firstOrNull { it.byUser }
752
+ ?.also(record.waitingDismissals::remove)
753
+ else -> null
754
+ }
755
+ next?.let { request(record, it) }
756
+ }
757
+ }
758
+
759
+ // A record a `setRoot` took keeps being taken: its own move goes to the state it has under it.
760
+ private fun move(record: ModalRecord, state: State) {
761
+ if (record.state == State.WithOldRoot) record.before = state else record.state = state
762
+ }
763
+
764
+ // The table, row 4 (a command) and rows 6, 7 (the user, back): what a dismissal does in each state, when it runs.
765
+ private fun request(record: ModalRecord, dismissal: Dismissal) {
766
+ when (record.effective) {
767
+ State.Waiting -> cancel(record, dismissal, reports = true)
768
+ State.Presenting -> record.waitingDismissals += dismissal
769
+ State.Shown -> if (isTop(record)) beginDismissal(record, dismissal) else closeBelow(record, dismissal)
770
+ State.Dismissing -> dismissal.answer?.let(record.answers::add)
771
+ State.ClosedBelow -> dismissal.answer?.resolve(record.rootId)
772
+ State.WithOldRoot, State.Gone -> dismissal.answer?.reject(ErrorTexts.screenNotShown(record.rootId))
773
+ }
774
+ }
775
+
776
+ // (e) W → X: the wait stops, its views leave, its root goes without events (no WillAppear went); the layer under
777
+ // isn't touched. The show resolves first, then — for a dismissal or back — one `ANN.ModalDismissed`, then the
778
+ // dismissal's answer.
779
+ private fun cancel(record: ModalRecord, dismissal: Dismissal?, reports: Boolean) {
780
+ val under = layerUnder(record)
781
+ stopWaits(record)
782
+ host.removeWaitingLayer(record)
783
+ record.state = State.Gone
784
+ records.remove(record)
785
+ views.remove(record)
786
+ val screen = AppearanceDispatcher.visibleNode(record.root)
787
+ record.showAnswer?.resolve(record.rootId)
788
+ record.showAnswer = null
789
+ record.chain?.let {
790
+ record.chain = null
791
+ it.done()
792
+ }
793
+ if (reports) {
794
+ record.reported = true
795
+ AppearanceDispatcher.modalDismissed(screen, 1)
796
+ }
797
+ if (dismissal?.byUser == true) record.ids.forEach { closedAnswerable[it] = record.rootId }
798
+ if (!record.root.isDestroyed) record.root.destroy()
799
+ dismissal?.answer?.resolve(record.rootId)
800
+ revealIfUncovered(under)
801
+ host.backChanged()
802
+ presentReady()
803
+ }
804
+
805
+ // A layer a modal closed below kept out stays out while modals are over it; once none is (the last one above was
806
+ // cancelled while it waited), it comes back with its appearance.
807
+ private fun revealIfUncovered(layer: ModalRecord?) {
808
+ if (!isOut(layer)) return
809
+ val above = if (layer == null) records else records.drop(records.indexOf(layer) + 1)
810
+ if (above.any { it.effective in COVERING }) return
811
+ val node = nodeOf(layer) ?: return
812
+ putBack(layer, null)
813
+ AppearanceDispatcher.beginTransition(listOf(node))
814
+ AppearanceDispatcher.endTransition(emptyList(), listOf(node), null, null, null)
815
+ }
816
+
817
+ // (d) S → D: the leaving screens let go of the focus, the layer revealed comes back when it had disappeared with
818
+ // its WillAppear, then the animation.
819
+ private fun beginDismissal(record: ModalRecord, dismissal: Dismissal) {
820
+ move(record, State.Dismissing)
821
+ dismissal.answer?.let(record.answers::add)
822
+ record.waitingDismissals.forEach { it.answer?.let(record.answers::add) }
823
+ record.waitingDismissals.clear()
824
+ if (!record.root.isDestroyed) record.root.onLeaveStarted()
825
+ val revealed = layerUnder(record)
826
+ val wasOut = isOut(revealed)
827
+ if (wasOut) putBack(revealed, record)
828
+ val node = if (wasOut) nodeOf(revealed) else null
829
+ node?.let { AppearanceDispatcher.beginTransition(listOf(it)) }
830
+ record.ending = ModalRecord.Ending(node, dismissal.byUser)
831
+ if (dismissal.byUser) record.takeIds()
832
+ var ended = false
833
+ val motion = dismissal.animation?.let { motionOf(it, record, showing = false) }
834
+ val stop = views.dismiss(record, dismissal.animated, host.isSeen(), {
835
+ ended = true
836
+ guarded(record) { dismissed(record) }
837
+ }, motion)
838
+ if (!ended) record.stopAnimation = stop
839
+ host.backChanged()
840
+ }
841
+
842
+ // Its views leave, DidDisappear of its screens, DidAppear of the layer revealed, the state,
843
+ // `ANN.ModalDismissed` unless it went already, its content stops, the answer.
844
+ private fun dismissed(record: ModalRecord) {
845
+ record.stopAnimation = null
846
+ (record.batch as? Batch)?.let { return memberEnded(it, record) }
847
+ if (record.effective != State.Dismissing) return
848
+ record.state = State.Gone
849
+ records.remove(record)
850
+ views.remove(record)
851
+ val ending = record.ending
852
+ if (ending?.byUser == true) record.ids.forEach { closedAnswerable[it] = record.rootId }
853
+ // The answers stay on the record until the events went: a failure among them still answers them.
854
+ val answers = record.answers.toList()
855
+ AppearanceDispatcher.endTransition(
856
+ hiding = listOf(record.root),
857
+ showing = listOfNotNull(ending?.revealed),
858
+ events = {
859
+ if (!record.reported) {
860
+ record.reported = true
861
+ AppearanceDispatcher.modalDismissed(record.root, 1)
862
+ }
863
+ record.root.destroy()
864
+ },
865
+ answer = answers.firstOrNull(),
866
+ value = record.rootId,
867
+ )
868
+ record.answers.clear()
869
+ answers.drop(1).forEach { it.resolve(record.rootId) }
870
+ host.backChanged()
871
+ }
872
+
873
+ // (c) S → B: dismissed while a modal above it stays: reported at once, its screens go, then its exit plays unseen
874
+ // and its view leaves (`dismissModal` step 5).
875
+ private fun closeBelow(record: ModalRecord, dismissal: Dismissal) {
876
+ move(record, State.ClosedBelow)
877
+ record.takeIds()
878
+ // Its record may leave at once (out of the window): a later `dismissModal` of it still resolves.
879
+ record.ids.forEach { closedAnswerable[it] = record.rootId }
880
+ // The answers wait on the record until the events went: a failure among them still answers them.
881
+ dismissal.answer?.let(record.answers::add)
882
+ record.waitingDismissals.forEach { it.answer?.let(record.answers::add) }
883
+ record.waitingDismissals.clear()
884
+ val answers = record.answers.toList()
885
+ AppearanceDispatcher.endTransition(
886
+ hiding = listOf(record.root),
887
+ showing = emptyList(),
888
+ events = {
889
+ record.reported = true
890
+ AppearanceDispatcher.modalDismissed(record.root, 1)
891
+ record.root.destroy()
892
+ },
893
+ answer = answers.firstOrNull(),
894
+ value = record.rootId,
895
+ )
896
+ record.answers.clear()
897
+ answers.drop(1).forEach { it.resolve(record.rootId) }
898
+ var ended = false
899
+ // Out of the window under a covering modal, its exit would end unseen or never (a sheet's settle): at once.
900
+ val stop = views.dismiss(record, dismissal.animated, host.isSeen() && !record.isOut, {
901
+ ended = true
902
+ guarded(record) { closedBelowEnded(record) }
903
+ }, null)
904
+ if (!ended) record.stopAnimation = stop
905
+ host.backChanged()
906
+ }
907
+
908
+ // The unseen exit of a modal closed below ended: its view leaves, and so does the record.
909
+ private fun closedBelowEnded(record: ModalRecord) {
910
+ record.stopAnimation = null
911
+ if (record.effective != State.ClosedBelow || record.batch != null) return
912
+ record.state = State.Gone
913
+ records.remove(record)
914
+ views.remove(record)
915
+ }
916
+
917
+ // (f) The batch of `dismissAllModals`: the top one leaves with its animation, every other at once.
918
+ private fun startBatch(
919
+ members: List<ModalRecord>,
920
+ answer: CommandAnswer,
921
+ animated: Boolean,
922
+ animation: ModalAnimationOptions,
923
+ ) {
924
+ val batch = Batch(answer)
925
+ batches += batch
926
+ batch.members = members
927
+ // The batch is registered from here: a failure takes it out with its members (as a later step's would), so no
928
+ // later `dismissAllModals` waits for it; the runner's answer then is a second one and is dropped.
929
+ try {
930
+ takeBatch(batch, members, animated, animation)
931
+ } catch (e: Throwable) {
932
+ batchFailed(batch, e)
933
+ throw e
934
+ }
935
+ }
936
+
937
+ private fun takeBatch(
938
+ batch: Batch,
939
+ members: List<ModalRecord>,
940
+ animated: Boolean,
941
+ animation: ModalAnimationOptions,
942
+ ) {
943
+ val lowest = members.first()
944
+ val revealed = layerUnder(lowest)
945
+ val wasOut = isOut(revealed)
946
+ val counted = members.filter { it.state != State.ClosedBelow && !it.reported }
947
+ batch.count = counted.size
948
+ batch.screen = counted.lastOrNull()?.let { AppearanceDispatcher.visibleNode(it.root) }
949
+ // The top that leaves with its animation: one already leaving keeps its own.
950
+ val top = members.lastOrNull { it.state in ANIMATED_IN_BATCH }
951
+ batch.top = top
952
+ val keepsItsOwn = top?.state == State.Dismissing && top.stopAnimation != null
953
+ for (record in members) {
954
+ record.batch = batch
955
+ stopWaits(record)
956
+ host.removeWaitingLayer(record)
957
+ record.waitingDismissals.forEach { it.answer?.let(record.answers::add) }
958
+ record.waitingDismissals.clear()
959
+ if (record.state != State.ClosedBelow && !record.root.isDestroyed) record.root.onLeaveStarted()
960
+ if (record.state != State.ClosedBelow) record.state = State.Dismissing
961
+ if (record === top && keepsItsOwn) continue
962
+ record.stopAnimation?.invoke()
963
+ record.stopAnimation = null
964
+ if (record !== top) views.remove(record)
965
+ }
966
+ if (wasOut) putBack(revealed, lowest)
967
+ batch.revealed = if (wasOut) nodeOf(revealed) else null
968
+ batch.revealed?.let { AppearanceDispatcher.beginTransition(listOf(it)) }
969
+ // A member leaving on its own revealed that layer already (its WillAppear went): it appears at the batch's end.
970
+ if (!wasOut) {
971
+ batch.revealed = members.firstNotNullOfOrNull { it.ending?.revealed }?.takeIf { it === nodeOf(revealed) }
972
+ }
973
+ host.backChanged()
974
+ if (top == null) return endBatch(batch)
975
+ if (keepsItsOwn) return
976
+ var ended = false
977
+ // The top leaves by the dismissal's animation of the top modal over what the batch reveals.
978
+ val motion = motionOf(animation, top, showing = false, under = nodeOf(revealed))
979
+ val stop = views.dismiss(top, animated, host.isSeen(), {
980
+ ended = true
981
+ guarded(top) { dismissed(top) }
982
+ }, motion)
983
+ if (!ended) top.stopAnimation = stop
984
+ }
985
+
986
+ private fun memberEnded(batch: Batch, record: ModalRecord) {
987
+ if (record === batch.top && batch in batches) endBatch(batch)
988
+ }
989
+
990
+ // (f)'s end: the screens of every modal of the batch disappear, the layer revealed appears, the state, one
991
+ // `ANN.ModalDismissed` with the number of modals not reported before, the content stops, every show and command
992
+ // that waited resolves with its own root's id, then the answer `''`.
993
+ private fun endBatch(batch: Batch) {
994
+ batches.remove(batch)
995
+ val members = batch.members
996
+ // The others' views went at its start.
997
+ batch.top?.let(views::remove)
998
+ for (record in members) {
999
+ record.stopAnimation?.invoke()
1000
+ record.stopAnimation = null
1001
+ record.state = State.Gone
1002
+ records.remove(record)
1003
+ }
1004
+ AppearanceDispatcher.endTransition(
1005
+ hiding = members.map { it.root }.filterNot { it.isDestroyed },
1006
+ showing = listOfNotNull(batch.revealed),
1007
+ events = {
1008
+ if (batch.count > 0) batch.screen?.let { AppearanceDispatcher.modalDismissed(it, batch.count) }
1009
+ for (record in members) {
1010
+ record.reported = true
1011
+ if (!record.root.isDestroyed) record.root.destroy()
1012
+ }
1013
+ members.forEach(::answerAll)
1014
+ },
1015
+ answer = batch.answer,
1016
+ value = "",
1017
+ )
1018
+ batch.later.forEach { it.resolve("") }
1019
+ host.backChanged()
1020
+ presentReady()
1021
+ }
1022
+
1023
+ // A later step of a `dismissAllModals` failed: every modal of it goes as at its end, without the events not sent
1024
+ // yet; what waited for each resolves as at that end, the batch's answers reject, and the modals that wait go on.
1025
+ private fun batchFailed(batch: Batch, e: Throwable) {
1026
+ val text = ErrorTexts.couldNot("dismiss all modals", ErrorTexts.reasonOf(e))
1027
+ batches.remove(batch)
1028
+ for (record in batch.members) {
1029
+ runCatching { record.stopAnimation?.invoke() }
1030
+ record.stopAnimation = null
1031
+ record.state = State.Gone
1032
+ records.remove(record)
1033
+ runCatching { views.remove(record) }
1034
+ runCatching { if (!record.root.isDestroyed) record.root.destroy() }
1035
+ runCatching { answerAll(record) }
1036
+ }
1037
+ val answers = listOfNotNull(batch.answer) + batch.later
1038
+ batch.later.clear()
1039
+ if (answers.none { !it.isAnswered }) host.log("[ApexNavigation] $text")
1040
+ answers.forEach { it.reject(text) }
1041
+ host.backChanged()
1042
+ presentReady()
1043
+ }
1044
+
1045
+ // What waited for a record that went without its own end resolves with its root's id; a chain goes on.
1046
+ private fun answerAll(record: ModalRecord) {
1047
+ record.showAnswer?.resolve(record.rootId)
1048
+ record.showAnswer = null
1049
+ record.chain?.let {
1050
+ record.chain = null
1051
+ it.done()
1052
+ }
1053
+ record.answers.forEach { it.resolve(record.rootId) }
1054
+ record.answers.clear()
1055
+ record.waitingDismissals.forEach { it.answer?.resolve(record.rootId) }
1056
+ record.waitingDismissals.clear()
1057
+ }
1058
+
1059
+ // The user (the sheet's events).
1060
+
1061
+ // The user closed the sheet (a drag down, the scrim): as back with `dismissModalOnPress: true`. While it comes in,
1062
+ // its show ends first, so it answers.
1063
+ private fun closedByTheUser(record: ModalRecord) {
1064
+ try {
1065
+ if (record.effective == State.Presenting) {
1066
+ record.stopAnimation?.invoke()
1067
+ presented(record)
1068
+ }
1069
+ if (record.effective != State.Shown) return
1070
+ request(record, Dismissal(null, animated = true, byUser = true))
1071
+ } catch (e: Throwable) {
1072
+ fail(record, e, "close the screen '${record.rootId}'")
1073
+ }
1074
+ }
1075
+
1076
+ private inner class SheetEvents(private val record: ModalRecord) : ModalSheet.Events {
1077
+ override fun onDetentChanged(detent: SheetDetent) {
1078
+ if (record.root.isDestroyed) return
1079
+ logged("tell the sheet's detent of the screen '${record.rootId}'") {
1080
+ AppearanceDispatcher.sheetDetentChanged(record.root, detent.toValue())
1081
+ }
1082
+ }
1083
+
1084
+ override fun onClosedByUser() = closedByTheUser(record)
1085
+
1086
+ // The user tried to close a sheet that holds them.
1087
+ override fun onCloseAttempted() {
1088
+ if (record.effective != State.Shown || record.root.isDestroyed) return
1089
+ logged("tell the attempt to close the screen '${record.rootId}'") {
1090
+ AppearanceDispatcher.modalAttemptedToDismiss(record.root)
1091
+ }
1092
+ }
1093
+ }
1094
+
1095
+ // Protection (ARCHITECTURE.md section 5).
1096
+
1097
+ // A step of [record] that comes later, under no runner: a failure ends what the record was doing ([fail]).
1098
+ private inline fun guarded(record: ModalRecord, work: () -> Unit) {
1099
+ try {
1100
+ work()
1101
+ } catch (e: Throwable) {
1102
+ fail(record, e, "show the screen '${record.rootId}'")
1103
+ }
1104
+ }
1105
+
1106
+ // A failure in a later step of [record], by what it was doing: a `dismissAllModals` it is in fails as a whole
1107
+ // (batchFailed); a show not answered yet fails as one that couldn't be made (failed); a dismissal or a close below
1108
+ // on its way fails as its end (dismissFailed). A record the step left as it was stays; with no answer to give, the
1109
+ // failure is logged as [what].
1110
+ private fun fail(record: ModalRecord, e: Throwable, what: String) {
1111
+ (record.batch as? Batch)?.let { return batchFailed(it, e) }
1112
+ val showing = record.state == State.Waiting || record.effective == State.Presenting
1113
+ when {
1114
+ showing || record.showAnswer != null || record.chain != null -> failed(record, e)
1115
+ record.state == State.Gone || record.effective in LEAVING -> dismissFailed(record, e)
1116
+ else -> host.log("[ApexNavigation] ${ErrorTexts.couldNot(what, ErrorTexts.reasonOf(e))}")
1117
+ }
1118
+ }
1119
+
1120
+ // A callback of the user that only sends an event: a failure is logged.
1121
+ private inline fun logged(what: String, work: () -> Unit) {
1122
+ try {
1123
+ work()
1124
+ } catch (e: Throwable) {
1125
+ host.log("[ApexNavigation] ${ErrorTexts.couldNot(what, ErrorTexts.reasonOf(e))}")
1126
+ }
1127
+ }
1128
+
1129
+ // Rules across records.
1130
+
1131
+ // The record a dismissal of [node] (or of [id] without a node) concerns.
1132
+ private fun lookup(id: String, node: ViewController<*>?): Lookup {
1133
+ if (node != null) {
1134
+ val top = topOf(node)
1135
+ if (carried.any { it.root === top }) return Lookup.NotShown
1136
+ return records.firstOrNull { it.root === top }?.let(Lookup::Found) ?: Lookup.NotInModal
1137
+ }
1138
+ val gone = records.firstOrNull {
1139
+ (it.state == State.ClosedBelow || it.state == State.WithOldRoot) && id in it.ids
1140
+ }
1141
+ if (gone != null) return Lookup.Found(gone)
1142
+ closedAnswerable[id]?.let { return Lookup.Closed(it) }
1143
+ return Lookup.NotShown
1144
+ }
1145
+
1146
+ private sealed class Lookup {
1147
+ object NotShown : Lookup()
1148
+ object NotInModal : Lookup()
1149
+ class Closed(val rootId: String) : Lookup()
1150
+ class Found(val record: ModalRecord) : Lookup()
1151
+ }
1152
+
1153
+ // A record is the top when no record above it waits, comes in or shows; one that leaves doesn't count.
1154
+ private fun isTop(record: ModalRecord): Boolean =
1155
+ records.drop(records.indexOf(record) + 1).none { it.effective in TOP_STATES }
1156
+
1157
+ // The top record, as the commands see it; none.
1158
+ private fun topRecord(): ModalRecord? = records.lastOrNull { it.effective in TOP_STATES }
1159
+
1160
+ // Back goes to the top modal that waits, comes in or shows.
1161
+ private fun backTarget(): ModalRecord? = records.lastOrNull { it.effective in TOP_STATES }
1162
+
1163
+ // `hardwareBackButton.dismissModalOnPress: false` of the modal's options now.
1164
+ private fun holdsBack(record: ModalRecord): Boolean =
1165
+ record.root.resolveShownOptions(DefaultOptions.current).hardwareBackButton.dismissModalOnPress.isFalse
1166
+
1167
+ // The only modal that isn't closed below, with the old root or gone, over no root.
1168
+ private fun isLastWithoutRoot(record: ModalRecord): Boolean = host.root == null &&
1169
+ records.none { it !== record && it.state != State.ClosedBelow && it.state != State.WithOldRoot }
1170
+
1171
+ // The animation of a show ([showing]) or a dismissal of [record]'s own, over [under] (the layer under it); none
1172
+ // when [animation] has none (`AnimationRules.modalIsOwn`) or the record is a sheet. A side that doesn't play
1173
+ // leaves its view as it is; with elements the modal fades (by its own side only when it is a single `alpha`) and
1174
+ // the layer under stands.
1175
+ private fun motionOf(
1176
+ animation: ModalAnimationOptions,
1177
+ record: ModalRecord,
1178
+ showing: Boolean,
1179
+ under: ViewController<*>? = nodeOf(layerUnder(record)),
1180
+ ): Motion? {
1181
+ if (record.isSheet || !AnimationRules.modalIsOwn(animation)) return null
1182
+ val modalSide = if (showing) animation.enter else animation.exit
1183
+ val underSide = if (showing) animation.exit else animation.enter
1184
+ val elements = AnimationRules.hasElements(animation)
1185
+ val side = if (elements) {
1186
+ modalSide.takeIf(AnimationRules::isSingleAlpha)
1187
+ } else {
1188
+ modalSide.takeIf(AnimationRules::sidePlays)
1189
+ }
1190
+ val screen = AppearanceDispatcher.visibleNode(record.root)
1191
+ return Motion(
1192
+ side = side,
1193
+ fades = elements && side == null,
1194
+ under = under,
1195
+ underSide = underSide.takeIf { !elements && under != null && AnimationRules.sidePlays(it) },
1196
+ elements = animation.takeIf { elements && under != null },
1197
+ from = if (showing) under else screen,
1198
+ to = if (showing) screen else under,
1199
+ )
1200
+ }
1201
+
1202
+ // The layer under a record: the nearest record below it that comes in or shows; none for the root.
1203
+ private fun layerUnder(record: ModalRecord): ModalRecord? {
1204
+ val index = records.indexOf(record).let { if (it < 0) records.size else it }
1205
+ for (i in index - 1 downTo 0) {
1206
+ val below = records[i]
1207
+ if (below.effective == State.Presenting || below.effective == State.Shown) return below
1208
+ }
1209
+ return null
1210
+ }
1211
+
1212
+ private fun isOut(layer: ModalRecord?): Boolean = layer?.isOut ?: (rootOut && host.root != null)
1213
+
1214
+ private fun nodeOf(layer: ModalRecord?): ViewController<*>? = layer?.root ?: host.root
1215
+
1216
+ // The layer comes back into its layer: a record's container at the place of [at], the root's view.
1217
+ private fun putBack(layer: ModalRecord?, at: ModalRecord?) {
1218
+ if (layer == null) {
1219
+ host.root?.let(views::putBackRoot)
1220
+ rootOut = false
1221
+ } else {
1222
+ views.putBack(layer, at)
1223
+ layer.isOut = false
1224
+ }
1225
+ }
1226
+
1227
+ // [options] of a command go into the modal's visible screen, as `mergeOptions` would.
1228
+ private fun mergeInto(record: ModalRecord, options: Options) {
1229
+ if (record.root.isDestroyed) return
1230
+ val screen = AppearanceDispatcher.visibleNode(record.root)
1231
+ if (screen.isDestroyed) return
1232
+ screen.mergeOptions(options)
1233
+ optionsMergedInto(screen)
1234
+ }
1235
+
1236
+ private inline fun whileTaking(work: () -> Unit) {
1237
+ taking = true
1238
+ try {
1239
+ work()
1240
+ } finally {
1241
+ taking = false
1242
+ }
1243
+ }
1244
+
1245
+ private fun topOf(node: ViewController<*>): ViewController<*> {
1246
+ var current = node
1247
+ while (true) current = current.parentController ?: return current
1248
+ }
1249
+
1250
+ companion object {
1251
+ /** How long a modal waits for its screens at most, unless `waitForRender` says otherwise. */
1252
+ const val WAIT_LIMIT_MILLIS = 500L
1253
+
1254
+ // What counts for the top of the modals.
1255
+ private val TOP_STATES = setOf(State.Waiting, State.Presenting, State.Shown)
1256
+
1257
+ // What a `dismissAllModals` takes (row 5): all but the old root's and what is gone.
1258
+ private val BATCHED = setOf(State.Waiting, State.Presenting, State.Shown, State.Dismissing, State.ClosedBelow)
1259
+
1260
+ // What may leave with the batch's animation.
1261
+ private val ANIMATED_IN_BATCH = setOf(State.Presenting, State.Shown, State.Dismissing)
1262
+
1263
+ // What keeps a layer under it covered.
1264
+ private val COVERING = setOf(State.Waiting, State.Presenting, State.Shown, State.Dismissing)
1265
+
1266
+ // A record on its way out: a failure of its step ends it.
1267
+ private val LEAVING = setOf(State.Dismissing, State.ClosedBelow)
1268
+ }
1269
+ }