@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.
- package/ApexNavigation.podspec +42 -0
- package/LICENSE +21 -0
- package/README.md +76 -2
- package/android/CLAUDE.md +183 -0
- package/android/CORE.md +219 -0
- package/android/MATERIAL_SYMBOLS_LICENSE.txt +205 -0
- package/android/RECIPES.md +39 -0
- package/android/build.gradle +108 -0
- package/android/consumer-rules.pro +2 -0
- package/android/src/main/AndroidManifest.xml +9 -0
- package/android/src/main/java/dev/apexnative/navigation/EdgeToEdgeDecision.kt +25 -0
- package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +339 -0
- package/android/src/main/java/dev/apexnative/navigation/NavigationApplication.kt +90 -0
- package/android/src/main/java/dev/apexnative/navigation/NavigationPackage.kt +37 -0
- package/android/src/main/java/dev/apexnative/navigation/customrow/BottomTabsCustomRowOptions.kt +85 -0
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutChecks.kt +51 -0
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutException.kt +7 -0
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutNode.kt +118 -0
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutReader.kt +274 -0
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutType.kt +35 -0
- package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenCalls.kt +61 -0
- package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenContext.kt +84 -0
- package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenCreator.kt +17 -0
- package/android/src/main/java/dev/apexnative/navigation/options/AnimationsOptions.kt +54 -0
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabOptions.kt +238 -0
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabsOptions.kt +244 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +70 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +296 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ComponentOptions.kt +141 -0
- package/android/src/main/java/dev/apexnative/navigation/options/DefaultOptions.kt +21 -0
- package/android/src/main/java/dev/apexnative/navigation/options/FabOptions.kt +97 -0
- package/android/src/main/java/dev/apexnative/navigation/options/FontOptions.kt +47 -0
- package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +49 -0
- package/android/src/main/java/dev/apexnative/navigation/options/InterpolationOptions.kt +203 -0
- package/android/src/main/java/dev/apexnative/navigation/options/KeyCommandOptions.kt +49 -0
- package/android/src/main/java/dev/apexnative/navigation/options/LargeTitleOptions.kt +78 -0
- package/android/src/main/java/dev/apexnative/navigation/options/LayoutAnimation.kt +157 -0
- package/android/src/main/java/dev/apexnative/navigation/options/LayoutOptions.kt +94 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ModalOptions.kt +87 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ModalPlacementOptions.kt +90 -0
- package/android/src/main/java/dev/apexnative/navigation/options/NavigationBarOptions.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/options/Options.kt +167 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +21 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionsReader.kt +133 -0
- package/android/src/main/java/dev/apexnative/navigation/options/PreviewOptions.kt +97 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ReadableMaps.kt +70 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ScrollEdgeEffectOptions.kt +98 -0
- package/android/src/main/java/dev/apexnative/navigation/options/SearchBarOptions.kt +151 -0
- package/android/src/main/java/dev/apexnative/navigation/options/SharedElementTransitionOptions.kt +57 -0
- package/android/src/main/java/dev/apexnative/navigation/options/SheetOptions.kt +108 -0
- package/android/src/main/java/dev/apexnative/navigation/options/SideMenuOptions.kt +130 -0
- package/android/src/main/java/dev/apexnative/navigation/options/SplitViewGroupOptions.kt +190 -0
- package/android/src/main/java/dev/apexnative/navigation/options/SplitViewOptions.kt +28 -0
- package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +270 -0
- package/android/src/main/java/dev/apexnative/navigation/options/StatusBarOptions.kt +75 -0
- package/android/src/main/java/dev/apexnative/navigation/options/TitleOptions.kt +167 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ToolbarOptions.kt +60 -0
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarAppearanceOptions.kt +223 -0
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarOptions.kt +381 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ViewAnimationOptions.kt +225 -0
- package/android/src/main/java/dev/apexnative/navigation/options/WindowOptions.kt +36 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/Bool.kt +23 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/Fraction.kt +12 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/LayoutDirection.kt +26 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/Param.kt +24 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/Text.kt +24 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/ThemeColour.kt +259 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/Variant.kt +36 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/BoolParser.kt +15 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/FontParser.kt +28 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/FractionParser.kt +24 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/IconParser.kt +48 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/StringListParser.kt +27 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/TextParser.kt +32 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/TypefaceLoader.kt +42 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/VariantParser.kt +34 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +41 -0
- package/android/src/main/java/dev/apexnative/navigation/react/CommandAnswer.kt +111 -0
- package/android/src/main/java/dev/apexnative/navigation/react/CommandListener.kt +27 -0
- package/android/src/main/java/dev/apexnative/navigation/react/CommandRunner.kt +131 -0
- package/android/src/main/java/dev/apexnative/navigation/react/DeveloperReload.kt +69 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ErrorTexts.kt +123 -0
- package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +154 -0
- package/android/src/main/java/dev/apexnative/navigation/react/LaunchLink.kt +37 -0
- package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +311 -0
- package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +89 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReactGateway.kt +67 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +197 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReadableJson.kt +60 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +130 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +69 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +87 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ScrollEvents.kt +160 -0
- package/android/src/main/java/dev/apexnative/navigation/react/StartInfo.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +507 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/ComponentType.kt +13 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +199 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +62 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/ScreenAppearance.kt +87 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +62 -0
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaReadyEvent.kt +16 -0
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +140 -0
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaViewManager.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotHost.kt +91 -0
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +158 -0
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +141 -0
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotViewManager.kt +50 -0
- package/android/src/main/java/dev/apexnative/navigation/splash/SplashHold.kt +67 -0
- package/android/src/main/java/dev/apexnative/navigation/splash/SplashTheme.kt +81 -0
- package/android/src/main/java/dev/apexnative/navigation/splash/SplashView.kt +77 -0
- package/android/src/main/java/dev/apexnative/navigation/system/AppDirection.kt +92 -0
- package/android/src/main/java/dev/apexnative/navigation/system/SystemUiLayers.kt +126 -0
- package/android/src/main/java/dev/apexnative/navigation/system/SystemUiOwner.kt +229 -0
- package/android/src/main/java/dev/apexnative/navigation/system/SystemUiRules.kt +302 -0
- package/android/src/main/java/dev/apexnative/navigation/system/SystemUiState.kt +58 -0
- package/android/src/main/java/dev/apexnative/navigation/system/SystemUiWindow.kt +405 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ColorUtils.kt +22 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/DevelopmentLog.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/DimensionExtensions.kt +16 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageLoader.kt +112 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/MaterialTheme.kt +148 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/NavigationLog.kt +6 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ScrollToTop.kt +33 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/SystemUiUtils.kt +41 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/TestIds.kt +89 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/TextViewUtils.kt +10 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/UiThread.kt +31 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/UiUtils.kt +43 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +124 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewExtensions.kt +41 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewUtils.kt +15 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/WindowFolds.kt +107 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +258 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementDefinition.kt +57 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementLayout.kt +225 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementPlanner.kt +120 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/SecondaryScreenPresenter.kt +31 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +54 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +664 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +367 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +81 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +223 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabBarLook.kt +74 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabBarMotion.kt +83 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabCellState.kt +27 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabHistory.kt +38 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +172 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabSelection.kt +65 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsAttach.kt +42 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +72 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/child/ChildController.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/child/ChildControllersRegistry.kt +29 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +90 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +254 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +65 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +231 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RestPlace.kt +28 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenContentFactory.kt +28 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFocus.kt +22 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +154 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +104 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +148 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentCreator.kt +18 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +187 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/NativeScreens.kt +25 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +40 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalContainer.kt +20 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +1269 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +186 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +342 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +398 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetContainer.kt +67 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +78 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/FirstRootDraw.kt +58 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/LayoutFactory.kt +203 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +562 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigators.kt +53 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +514 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/WaitingLayer.kt +18 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayContainer.kt +33 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +383 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayTouches.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayViews.kt +117 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +62 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +43 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +218 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ShownChildren.kt +82 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +283 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +276 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +92 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +107 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +59 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +509 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewLayout.kt +61 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewPresenter.kt +25 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +19 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedPushes.kt +114 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +387 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +635 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +167 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackPresenter.kt +24 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +1274 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +82 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +222 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPlacement.kt +47 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPlan.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +279 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +450 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/SearchPanel.kt +176 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +243 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +211 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarRowTransition.kt +122 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonCells.kt +30 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +65 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/LargeTitleCollapse.kt +71 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +72 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarCollapseBehavior.kt +104 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +1085 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarRoom.kt +95 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +122 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/IReactView.kt +89 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/Presenter.kt +51 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +194 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +320 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationRules.kt +141 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +193 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/FadeThrough.kt +57 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/SideAnimator.kt +143 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/SystemTransition.kt +26 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +93 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabItem.kt +13 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +550 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsContainer.kt +135 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +89 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +91 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +165 -0
- package/android/src/main/java/dev/apexnative/navigation/views/component/ComponentLayout.kt +89 -0
- package/android/src/main/java/dev/apexnative/navigation/views/component/Renderable.kt +6 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/DrawOrder.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +31 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +281 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/ImageLoads.kt +103 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +112 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +152 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +53 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +46 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +53 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +138 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +88 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +33 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +66 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +70 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +179 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +139 -0
- package/android/src/main/java/dev/apexnative/navigation/views/externalcomponent/ExternalComponentLayout.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +183 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +137 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +125 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabAnimator.kt +8 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCollapseBehaviour.kt +34 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +133 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/LargeTitleView.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +211 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +407 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBarDefaults.kt +35 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/ScopeRow.kt +82 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/SearchField.kt +130 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/SearchStyle.kt +29 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/SuggestionList.kt +77 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +80 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +334 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +106 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/IconBackgroundDrawable.kt +93 -0
- package/android/src/main/jni/ApexNavigationSpec.h +18 -0
- package/android/src/main/jni/CMakeLists.txt +33 -0
- package/android/src/main/res/color/apex_navigation_highlight_inverse.xml +5 -0
- package/android/src/main/res/color/apex_navigation_text_primary.xml +6 -0
- package/android/src/main/res/color/apex_navigation_text_primary_inverse.xml +6 -0
- package/android/src/main/res/color/apex_navigation_text_secondary.xml +6 -0
- package/android/src/main/res/color/apex_navigation_text_secondary_inverse.xml +6 -0
- package/android/src/main/res/drawable/apex_navigation_ic_arrow_back.xml +13 -0
- package/android/src/main/res/drawable/apex_navigation_ic_close.xml +12 -0
- package/android/src/main/res/drawable/ic_fab_add_24dp.xml +12 -0
- package/android/src/main/res/values/attrs.xml +13 -0
- package/android/src/main/res/values/dimens.xml +5 -0
- package/android/src/main/res/values/dimens_splash.xml +9 -0
- package/android/src/main/res/values/ids.xml +12 -0
- package/android/src/main/res/values/styles.xml +18 -0
- package/android/src/main/res/values/themes.xml +75 -0
- package/android/src/main/res/values-night/styles.xml +6 -0
- package/android/src/main/res/values-night/themes.xml +67 -0
- package/cli/app.js +113 -0
- package/cli/changes.js +235 -0
- package/cli/codegen/commands.js +356 -0
- package/cli/codegen/index.js +211 -0
- package/cli/codegen/kotlin.js +396 -0
- package/cli/codegen/names.js +99 -0
- package/cli/codegen/read.js +602 -0
- package/cli/codegen/swift.js +342 -0
- package/cli/config.js +78 -0
- package/cli/diff.js +139 -0
- package/cli/doctor/checks/android.js +217 -0
- package/cli/doctor/checks/app.js +305 -0
- package/cli/doctor/checks/conflicts.js +42 -0
- package/cli/doctor/checks/devices.js +98 -0
- package/cli/doctor/checks/icons.js +69 -0
- package/cli/doctor/checks/ios.js +187 -0
- package/cli/doctor/checks/navigation.js +285 -0
- package/cli/doctor/checks/splash.js +102 -0
- package/cli/doctor/fix.js +66 -0
- package/cli/doctor/index.js +136 -0
- package/cli/doctor/types.js +30 -0
- package/cli/exec.js +34 -0
- package/cli/gradle.js +142 -0
- package/cli/icons/android.js +173 -0
- package/cli/icons/images.js +202 -0
- package/cli/icons/index.js +97 -0
- package/cli/icons/ios.js +113 -0
- package/cli/icons/settings.js +116 -0
- package/cli/images.js +67 -0
- package/cli/index.js +307 -0
- package/cli/info/index.js +290 -0
- package/cli/init/index.js +426 -0
- package/cli/init/packageManager.js +48 -0
- package/cli/init/starter.js +440 -0
- package/cli/links/files.js +109 -0
- package/cli/links/identity.js +75 -0
- package/cli/links/index.js +532 -0
- package/cli/links/native.js +396 -0
- package/cli/links/open.js +120 -0
- package/cli/links/prefixes.js +89 -0
- package/cli/mcp/appMap.js +128 -0
- package/cli/mcp/docs.js +175 -0
- package/cli/mcp/index.js +153 -0
- package/cli/mcp/markdown.js +210 -0
- package/cli/mcp/protocol.js +151 -0
- package/cli/mcp/tools.js +389 -0
- package/cli/migrate/entry.js +451 -0
- package/cli/migrate/index.js +305 -0
- package/cli/migrate/native.js +250 -0
- package/cli/migrate/report.js +238 -0
- package/cli/pods.js +56 -0
- package/cli/project.js +189 -0
- package/cli/screen/index.js +383 -0
- package/cli/screen/templates/compose.js +46 -0
- package/cli/screen/templates/native.js +40 -0
- package/cli/screen/templates/react.js +47 -0
- package/cli/screen/templates/swiftui.js +30 -0
- package/cli/screen/templates/uikit.js +48 -0
- package/cli/screen/templates/views.js +46 -0
- package/cli/setup/index.js +240 -0
- package/cli/setup/source.js +58 -0
- package/cli/setup/steps/app.js +76 -0
- package/cli/setup/steps/appDelegate.js +98 -0
- package/cli/setup/steps/entry.js +68 -0
- package/cli/setup/steps/env.js +245 -0
- package/cli/setup/steps/infoPlist.js +39 -0
- package/cli/setup/steps/mainActivity.js +60 -0
- package/cli/setup/steps/mainApplication.js +58 -0
- package/cli/setup/steps/manifest.js +38 -0
- package/cli/setup/steps/styles.js +29 -0
- package/cli/setup/steps/types.js +14 -0
- package/cli/splash/android.js +239 -0
- package/cli/splash/files.js +50 -0
- package/cli/splash/images.js +117 -0
- package/cli/splash/index.js +109 -0
- package/cli/splash/ios.js +349 -0
- package/cli/splash/settings.js +143 -0
- package/cli/typescript.js +473 -0
- package/cli/ui.js +268 -0
- package/cli/upgrade/changelog.js +45 -0
- package/cli/upgrade/index.js +347 -0
- package/cli/upgrade/versions.js +105 -0
- package/cli/workspace.js +60 -0
- package/cli/xcode/pbxproj.js +327 -0
- package/docs-md/architecture/errors-and-loading.md +138 -0
- package/docs-md/architecture/native-screens.md +290 -0
- package/docs-md/architecture/one-tree.md +164 -0
- package/docs-md/architecture/theme-and-context.md +368 -0
- package/docs-md/architecture/transitions.md +191 -0
- package/docs-md/containers/arrangement.md +320 -0
- package/docs-md/containers/modals.md +195 -0
- package/docs-md/containers/overlays.md +109 -0
- package/docs-md/containers/side-menu.md +138 -0
- package/docs-md/containers/split-view.md +155 -0
- package/docs-md/containers/stack.md +156 -0
- package/docs-md/containers/tabs.md +187 -0
- package/docs-md/flows/a-search-screen.md +311 -0
- package/docs-md/flows/an-app-with-tabs.md +380 -0
- package/docs-md/flows/bottom-sheets.md +326 -0
- package/docs-md/flows/forms-in-a-modal.md +420 -0
- package/docs-md/flows/list-and-details.md +428 -0
- package/docs-md/flows/onboarding.md +454 -0
- package/docs-md/flows/sign-in-and-sign-out.md +693 -0
- package/docs-md/fundamentals/lifecycle-and-events.md +224 -0
- package/docs-md/fundamentals/moving-between-screens.md +267 -0
- package/docs-md/fundamentals/screen-options.md +197 -0
- package/docs-md/fundamentals/screens-and-props.md +314 -0
- package/docs-md/fundamentals/starting-the-app.md +317 -0
- package/docs-md/fundamentals/switching-roots.md +166 -0
- package/docs-md/guides/analytics.md +377 -0
- package/docs-md/guides/app-context.md +554 -0
- package/docs-md/guides/building-a-screen.md +350 -0
- package/docs-md/guides/cli.md +421 -0
- package/docs-md/guides/data-fetching.md +492 -0
- package/docs-md/guides/deep-links.md +694 -0
- package/docs-md/guides/error-reporting.md +290 -0
- package/docs-md/guides/gestures-and-animations.md +381 -0
- package/docs-md/guides/notifications.md +548 -0
- package/docs-md/guides/overview.md +65 -0
- package/docs-md/guides/right-to-left.md +273 -0
- package/docs-md/guides/splash-screen.md +30 -0
- package/docs-md/guides/state-management.md +1050 -0
- package/docs-md/guides/testing.md +293 -0
- package/docs-md/help/glossary.md +433 -0
- package/docs-md/help/troubleshooting.md +709 -0
- package/docs-md/index.json +4205 -0
- package/docs-md/migration/from-expo-router.md +446 -0
- package/docs-md/migration/from-react-native-navigation.md +789 -0
- package/docs-md/migration/from-react-navigation.md +628 -0
- package/docs-md/screen-ui/back-and-gestures.md +178 -0
- package/docs-md/screen-ui/bar-buttons.md +312 -0
- package/docs-md/screen-ui/search.md +181 -0
- package/docs-md/screen-ui/system-ui.md +337 -0
- package/docs-md/screen-ui/toolbar-and-fab.md +146 -0
- package/docs-md/screen-ui/top-bar.md +247 -0
- package/docs-md/start/installation.md +233 -0
- package/docs-md/start/introduction.md +46 -0
- package/docs-md/start/quick-start.md +124 -0
- package/ios/Animations/ANNAnimationRules.h +72 -0
- package/ios/Animations/ANNAnimationRules.mm +122 -0
- package/ios/Animations/ANNFrameDriver.h +46 -0
- package/ios/Animations/ANNFrameDriver.mm +126 -0
- package/ios/Animations/ANNTransitionAnimator.h +34 -0
- package/ios/Animations/ANNTransitionAnimator.mm +293 -0
- package/ios/Animations/ANNTransitionPlan.h +115 -0
- package/ios/Animations/ANNTransitionPlan.mm +130 -0
- package/ios/Animations/ANNTransitionWait.h +29 -0
- package/ios/Animations/ANNTransitionWait.mm +135 -0
- package/ios/Animations/Elements/ANNElementFinder.h +26 -0
- package/ios/Animations/Elements/ANNElementFinder.mm +37 -0
- package/ios/Animations/Elements/ANNElementTransition.h +30 -0
- package/ios/Animations/Elements/ANNElementTransition.mm +75 -0
- package/ios/Animations/Elements/ANNSharedElementFlight.h +42 -0
- package/ios/Animations/Elements/ANNSharedElementFlight.mm +340 -0
- package/ios/Animations/Elements/ANNZoomAnchor.h +33 -0
- package/ios/Animations/Elements/ANNZoomAnchor.mm +133 -0
- package/ios/Animations/Interpolators/ANNCurve.h +61 -0
- package/ios/Animations/Interpolators/ANNCurve.mm +301 -0
- package/ios/Animations/Interpolators/ANNInterpolate.h +69 -0
- package/ios/Animations/Interpolators/ANNTrack.h +52 -0
- package/ios/Animations/Interpolators/ANNTrack.mm +77 -0
- package/ios/Animations/Interpolators/ANNViewTracks.h +57 -0
- package/ios/Animations/Interpolators/ANNViewTracks.mm +261 -0
- package/ios/ApexNavigation-prefix.h +6 -0
- package/ios/CLAUDE.md +151 -0
- package/ios/CORE.md +177 -0
- package/ios/Contract/ANNCommandAnswer.h +38 -0
- package/ios/Contract/ANNCommandAnswer.mm +99 -0
- package/ios/Contract/ANNCommandRunner.h +42 -0
- package/ios/Contract/ANNCommandRunner.mm +89 -0
- package/ios/Contract/ANNErrorTexts.h +86 -0
- package/ios/Contract/ANNErrorTexts.mm +230 -0
- package/ios/Contract/ANNLayoutNode.h +64 -0
- package/ios/Contract/ANNLayoutNode.mm +153 -0
- package/ios/Contract/ANNLayoutReader.h +34 -0
- package/ios/Contract/ANNLayoutReader.mm +282 -0
- package/ios/Contract/ANNLayoutRoot.h +26 -0
- package/ios/Contract/ANNLayoutRoot.mm +21 -0
- package/ios/Contract/ANNLayoutTreeOptions.h +22 -0
- package/ios/Contract/ANNLayoutTreeOptions.mm +32 -0
- package/ios/Contract/ANNLayoutType.h +44 -0
- package/ios/Contract/ANNLayoutValidator.h +23 -0
- package/ios/Contract/ANNLayoutValidator.mm +28 -0
- package/ios/Core/ANNAppDelegate.mm +122 -0
- package/ios/Core/ANNAppDirection.h +43 -0
- package/ios/Core/ANNAppDirection.mm +194 -0
- package/ios/Core/ANNAppearanceDispatcher.h +117 -0
- package/ios/Core/ANNAppearanceDispatcher.mm +433 -0
- package/ios/Core/ANNAssert.h +7 -0
- package/ios/Core/ANNDeepLinkQueue.h +35 -0
- package/ios/Core/ANNDeepLinkQueue.mm +136 -0
- package/ios/Core/ANNErrorHandler.h +17 -0
- package/ios/Core/ANNErrorHandler.mm +14 -0
- package/ios/Core/ANNEventEmitter.h +174 -0
- package/ios/Core/ANNEventEmitter.mm +337 -0
- package/ios/Core/ANNHinge.h +26 -0
- package/ios/Core/ANNHinge.mm +116 -0
- package/ios/Core/ANNKeyCommands.h +12 -0
- package/ios/Core/ANNKeyCommands.mm +74 -0
- package/ios/Core/ANNLayoutInfo.h +18 -0
- package/ios/Core/ANNLayoutInfo.mm +13 -0
- package/ios/Core/ANNLayoutProtocol.h +155 -0
- package/ios/Core/ANNNavigationState.h +38 -0
- package/ios/Core/ANNNavigationState.mm +127 -0
- package/ios/Core/ANNNodeHelper.h +114 -0
- package/ios/Core/ANNNodeHelper.mm +260 -0
- package/ios/Core/ANNNodePresenter.h +86 -0
- package/ios/Core/ANNNodePresenter.mm +92 -0
- package/ios/Core/ANNNodeRegistry.h +30 -0
- package/ios/Core/ANNNodeRegistry.mm +48 -0
- package/ios/Core/ANNOptionsRepaint.h +19 -0
- package/ios/Core/ANNOptionsRepaint.mm +59 -0
- package/ios/Core/ANNParking.h +34 -0
- package/ios/Core/ANNParking.mm +117 -0
- package/ios/Core/ANNPendingLayers.h +31 -0
- package/ios/Core/ANNPendingLayers.mm +57 -0
- package/ios/Core/ANNReloadCoordinator.h +26 -0
- package/ios/Core/ANNReloadCoordinator.mm +211 -0
- package/ios/Core/ANNRenderWait.h +105 -0
- package/ios/Core/ANNRenderWait.mm +496 -0
- package/ios/Core/ANNSceneDelegate.mm +92 -0
- package/ios/Core/ANNScreenAppearance+Internal.h +29 -0
- package/ios/Core/ANNScreenAppearance.h +60 -0
- package/ios/Core/ANNScreenAppearance.mm +44 -0
- package/ios/Core/ANNShownScreens.h +27 -0
- package/ios/Core/ANNShownScreens.mm +16 -0
- package/ios/Core/ANNSystemUI.h +95 -0
- package/ios/Core/ANNSystemUI.mm +401 -0
- package/ios/Core/ANNSystemUIRules.h +35 -0
- package/ios/Core/ANNSystemUIRules.mm +139 -0
- package/ios/Core/ANNUtils.h +35 -0
- package/ios/Core/ANNUtils.mm +111 -0
- package/ios/Core/ApexNavigation+Internal.h +26 -0
- package/ios/Core/ApexNavigation.mm +177 -0
- package/ios/Core/UIViewController+LayoutProtocol.h +102 -0
- package/ios/Core/UIViewController+LayoutProtocol.mm +253 -0
- package/ios/Layouts/Arrangement/ANNArrangementScreenDelegate.h +18 -0
- package/ios/Layouts/Arrangement/ANNArrangementState.h +30 -0
- package/ios/Layouts/Arrangement/ANNArrangementState.mm +53 -0
- package/ios/Layouts/Arrangement/ANNArrangementViewController.h +38 -0
- package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +573 -0
- package/ios/Layouts/External/ANNExternalViewController.h +28 -0
- package/ios/Layouts/External/ANNExternalViewController.mm +118 -0
- package/ios/Layouts/External/ANNNativeScreenCalls.h +27 -0
- package/ios/Layouts/External/ANNNativeScreenCalls.mm +77 -0
- package/ios/Layouts/Modal/ANNModal.h +121 -0
- package/ios/Layouts/Modal/ANNModal.mm +64 -0
- package/ios/Layouts/Modal/ANNModalCoordinator.h +99 -0
- package/ios/Layouts/Modal/ANNModalCoordinator.mm +1965 -0
- package/ios/Layouts/Modal/ANNModalHostViewComponentView.h +13 -0
- package/ios/Layouts/Modal/ANNModalHostViewComponentView.mm +24 -0
- package/ios/Layouts/Modal/ANNModalPresentation.h +73 -0
- package/ios/Layouts/Modal/ANNModalPresentation.mm +189 -0
- package/ios/Layouts/Modal/ANNModalSizePresenter.h +13 -0
- package/ios/Layouts/Modal/ANNModalSizePresenter.mm +65 -0
- package/ios/Layouts/Modal/ANNModalTransitions.h +29 -0
- package/ios/Layouts/Modal/ANNModalTransitions.mm +40 -0
- package/ios/Layouts/Modal/ANNPopoverPresenter.h +29 -0
- package/ios/Layouts/Modal/ANNPopoverPresenter.mm +158 -0
- package/ios/Layouts/Modal/ANNPresentationGate.h +52 -0
- package/ios/Layouts/Modal/ANNPresentationGate.mm +153 -0
- package/ios/Layouts/Modal/ANNSheetPresenter.h +31 -0
- package/ios/Layouts/Modal/ANNSheetPresenter.mm +247 -0
- package/ios/Layouts/Overlay/ANNOverlayCoordinator.h +66 -0
- package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +604 -0
- package/ios/Layouts/Overlay/ANNOverlayWindow.h +10 -0
- package/ios/Layouts/Overlay/ANNOverlayWindow.mm +71 -0
- package/ios/Layouts/Root/ANNLayoutFactory.h +31 -0
- package/ios/Layouts/Root/ANNLayoutFactory.mm +349 -0
- package/ios/Layouts/Root/ANNRootCoordinator.h +42 -0
- package/ios/Layouts/Root/ANNRootCoordinator.mm +847 -0
- package/ios/Layouts/Root/ANNSplashViewController.h +30 -0
- package/ios/Layouts/Root/ANNSplashViewController.mm +138 -0
- package/ios/Layouts/Screen/ANNComponentPresenter.h +32 -0
- package/ios/Layouts/Screen/ANNComponentPresenter.mm +136 -0
- package/ios/Layouts/Screen/ANNComponentViewController.h +100 -0
- package/ios/Layouts/Screen/ANNComponentViewController.mm +652 -0
- package/ios/Layouts/Screen/ANNNativeScreenContext+Internal.h +19 -0
- package/ios/Layouts/Screen/ANNNativeScreenContext.mm +84 -0
- package/ios/Layouts/Screen/ANNPreviewInteraction.h +38 -0
- package/ios/Layouts/Screen/ANNPreviewInteraction.mm +252 -0
- package/ios/Layouts/Screen/ANNScreenBars.h +29 -0
- package/ios/Layouts/Screen/ANNScreenBars.mm +47 -0
- package/ios/Layouts/Screen/ANNScreenInsets.h +30 -0
- package/ios/Layouts/Screen/ANNScreenInsets.mm +68 -0
- package/ios/Layouts/Screen/ANNScreenReadiness.h +92 -0
- package/ios/Layouts/Screen/ANNScreenReadiness.mm +186 -0
- package/ios/Layouts/Screen/ANNScreenRegions.h +33 -0
- package/ios/Layouts/Screen/ANNScreenRegions.mm +105 -0
- package/ios/Layouts/Screen/ANNScreenSafeArea.h +38 -0
- package/ios/Layouts/Screen/ANNScreenSafeArea.mm +58 -0
- package/ios/Layouts/SideMenu/ANNSideMenuChildViewController.h +41 -0
- package/ios/Layouts/SideMenu/ANNSideMenuChildViewController.mm +113 -0
- package/ios/Layouts/SideMenu/ANNSideMenuPresenter.h +28 -0
- package/ios/Layouts/SideMenu/ANNSideMenuPresenter.mm +260 -0
- package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +19 -0
- package/ios/Layouts/SideMenu/ANNSideMenuViewController.h +46 -0
- package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +891 -0
- package/ios/Layouts/SplitView/ANNSplitViewCommands.h +39 -0
- package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +612 -0
- package/ios/Layouts/SplitView/ANNSplitViewController.h +52 -0
- package/ios/Layouts/SplitView/ANNSplitViewController.mm +494 -0
- package/ios/Layouts/SplitView/ANNSplitViewPresenter.h +18 -0
- package/ios/Layouts/SplitView/ANNSplitViewPresenter.mm +181 -0
- package/ios/Layouts/SplitView/UISplitViewController+ANNOptions.h +32 -0
- package/ios/Layouts/SplitView/UISplitViewController+ANNOptions.mm +133 -0
- package/ios/Layouts/Stack/ANNPreviewPush.h +46 -0
- package/ios/Layouts/Stack/ANNPreviewPush.mm +298 -0
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +32 -0
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +92 -0
- package/ios/Layouts/Stack/ANNStackCommands.h +51 -0
- package/ios/Layouts/Stack/ANNStackCommands.mm +403 -0
- package/ios/Layouts/Stack/ANNStackController.h +161 -0
- package/ios/Layouts/Stack/ANNStackController.mm +1597 -0
- package/ios/Layouts/Stack/ANNStackPresenter.h +44 -0
- package/ios/Layouts/Stack/ANNStackPresenter.mm +181 -0
- package/ios/Layouts/Stack/ANNStackQueue.h +194 -0
- package/ios/Layouts/Stack/ANNStackQueue.mm +1300 -0
- package/ios/Layouts/Stack/InteractivePopGestureDelegate.h +53 -0
- package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +228 -0
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +19 -0
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +29 -0
- package/ios/Layouts/Tabs/ANNBottomTabCellView.h +33 -0
- package/ios/Layouts/Tabs/ANNBottomTabCellView.mm +100 -0
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +49 -0
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +153 -0
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.h +17 -0
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +56 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.h +121 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.mm +1404 -0
- package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.h +47 -0
- package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +280 -0
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +81 -0
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +1026 -0
- package/ios/Layouts/Tabs/ANNMoreNavigationDelegate.h +24 -0
- package/ios/Layouts/Tabs/ANNMoreNavigationDelegate.mm +58 -0
- package/ios/Layouts/Tabs/ANNScrollToTop.h +23 -0
- package/ios/Layouts/Tabs/ANNScrollToTop.mm +55 -0
- package/ios/Layouts/Tabs/ANNTabDotView.h +19 -0
- package/ios/Layouts/Tabs/ANNTabDotView.mm +46 -0
- package/ios/Layouts/Tabs/ANNTabLongPress.h +28 -0
- package/ios/Layouts/Tabs/ANNTabLongPress.mm +98 -0
- package/ios/Layouts/Tabs/ANNTabsDesign.h +26 -0
- package/ios/Layouts/Tabs/ANNTabsDesign.mm +34 -0
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +27 -0
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +55 -0
- package/ios/Layouts/Tabs/UITabBar+utils.h +24 -0
- package/ios/Layouts/Tabs/UITabBar+utils.mm +103 -0
- package/ios/Options/ANNAnimationOptions.h +22 -0
- package/ios/Options/ANNAnimationOptions.mm +16 -0
- package/ios/Options/ANNAnimationPropertyOptions.h +17 -0
- package/ios/Options/ANNAnimationPropertyOptions.mm +15 -0
- package/ios/Options/ANNBottomTabDotIndicatorOptions.h +14 -0
- package/ios/Options/ANNBottomTabDotIndicatorOptions.mm +13 -0
- package/ios/Options/ANNBottomTabOptions.h +51 -0
- package/ios/Options/ANNBottomTabOptions.mm +47 -0
- package/ios/Options/ANNBottomTabsAccessoryOptions.h +19 -0
- package/ios/Options/ANNBottomTabsAccessoryOptions.mm +25 -0
- package/ios/Options/ANNBottomTabsAnimationOptions.h +12 -0
- package/ios/Options/ANNBottomTabsAnimationOptions.mm +11 -0
- package/ios/Options/ANNBottomTabsCustomRowOptions.h +19 -0
- package/ios/Options/ANNBottomTabsCustomRowOptions.mm +17 -0
- package/ios/Options/ANNBottomTabsOptions.h +51 -0
- package/ios/Options/ANNBottomTabsOptions.mm +48 -0
- package/ios/Options/ANNBottomTabsShadowOptions.h +14 -0
- package/ios/Options/ANNBottomTabsShadowOptions.mm +13 -0
- package/ios/Options/ANNButtonComponentOptions.h +13 -0
- package/ios/Options/ANNButtonComponentOptions.mm +12 -0
- package/ios/Options/ANNButtonOptions.h +56 -0
- package/ios/Options/ANNButtonOptions.mm +53 -0
- package/ios/Options/ANNButtonsParser.h +13 -0
- package/ios/Options/ANNButtonsParser.mm +18 -0
- package/ios/Options/ANNComponentOptions.h +14 -0
- package/ios/Options/ANNComponentOptions.mm +12 -0
- package/ios/Options/ANNDefaultOptions.h +18 -0
- package/ios/Options/ANNDefaultOptions.mm +22 -0
- package/ios/Options/ANNElementAnimationOptions.h +18 -0
- package/ios/Options/ANNElementAnimationOptions.mm +15 -0
- package/ios/Options/ANNElementTransitionOptions.h +26 -0
- package/ios/Options/ANNElementTransitionOptions.mm +28 -0
- package/ios/Options/ANNEnterExitBottomTabsAnimationOptions.h +14 -0
- package/ios/Options/ANNEnterExitBottomTabsAnimationOptions.mm +12 -0
- package/ios/Options/ANNEnterExitScreenAnimationOptions.h +14 -0
- package/ios/Options/ANNEnterExitScreenAnimationOptions.mm +12 -0
- package/ios/Options/ANNEnterExitTopBarAnimationOptions.h +14 -0
- package/ios/Options/ANNEnterExitTopBarAnimationOptions.mm +12 -0
- package/ios/Options/ANNFabOptions.h +26 -0
- package/ios/Options/ANNFabOptions.mm +23 -0
- package/ios/Options/ANNFontOptions.h +24 -0
- package/ios/Options/ANNFontOptions.mm +65 -0
- package/ios/Options/ANNHardwareBackButtonOptions.h +15 -0
- package/ios/Options/ANNHardwareBackButtonOptions.mm +13 -0
- package/ios/Options/ANNIconBackgroundOptions.h +16 -0
- package/ios/Options/ANNIconBackgroundOptions.mm +15 -0
- package/ios/Options/ANNIconInsetsOptions.h +16 -0
- package/ios/Options/ANNIconInsetsOptions.mm +14 -0
- package/ios/Options/ANNInterpolationOptions.h +22 -0
- package/ios/Options/ANNInterpolationOptions.mm +22 -0
- package/ios/Options/ANNLayoutOptions.h +26 -0
- package/ios/Options/ANNLayoutOptions.mm +25 -0
- package/ios/Options/ANNMenuOptions.h +37 -0
- package/ios/Options/ANNMenuOptions.mm +136 -0
- package/ios/Options/ANNModalAnimationOptions.h +17 -0
- package/ios/Options/ANNModalAnimationOptions.mm +15 -0
- package/ios/Options/ANNModalContentSizeOptions.h +14 -0
- package/ios/Options/ANNModalContentSizeOptions.mm +15 -0
- package/ios/Options/ANNModalOptions.h +19 -0
- package/ios/Options/ANNModalOptions.mm +15 -0
- package/ios/Options/ANNNavigationBarOptions.h +14 -0
- package/ios/Options/ANNNavigationBarOptions.mm +13 -0
- package/ios/Options/ANNNavigationOptions.h +60 -0
- package/ios/Options/ANNNavigationOptions.mm +54 -0
- package/ios/Options/ANNOptionField.h +91 -0
- package/ios/Options/ANNOptionField.mm +173 -0
- package/ios/Options/ANNOptions.h +62 -0
- package/ios/Options/ANNOptions.mm +329 -0
- package/ios/Options/ANNOptionsCache.h +22 -0
- package/ios/Options/ANNOptionsCache.mm +17 -0
- package/ios/Options/ANNOptionsReader.h +33 -0
- package/ios/Options/ANNOptionsReader.mm +63 -0
- package/ios/Options/ANNOverlayOptions.h +14 -0
- package/ios/Options/ANNOverlayOptions.mm +12 -0
- package/ios/Options/ANNPopoverOptions.h +17 -0
- package/ios/Options/ANNPopoverOptions.mm +31 -0
- package/ios/Options/ANNPreviewOptions.h +17 -0
- package/ios/Options/ANNPreviewOptions.mm +15 -0
- package/ios/Options/ANNScreenAnimationOptions.h +13 -0
- package/ios/Options/ANNScreenAnimationOptions.mm +12 -0
- package/ios/Options/ANNScrollEdgeEffectOptions.h +20 -0
- package/ios/Options/ANNScrollEdgeEffectOptions.mm +16 -0
- package/ios/Options/ANNScrollEdgeOptions.h +14 -0
- package/ios/Options/ANNScrollEdgeOptions.mm +12 -0
- package/ios/Options/ANNSearchBarOptions.h +49 -0
- package/ios/Options/ANNSearchBarOptions.mm +41 -0
- package/ios/Options/ANNSearchScopeOptions.h +15 -0
- package/ios/Options/ANNSearchScopeOptions.mm +13 -0
- package/ios/Options/ANNSearchSuggestionOptions.h +19 -0
- package/ios/Options/ANNSearchSuggestionOptions.mm +16 -0
- package/ios/Options/ANNSearchTokenOptions.h +18 -0
- package/ios/Options/ANNSearchTokenOptions.mm +15 -0
- package/ios/Options/ANNSetStackRootAnimationOptions.h +12 -0
- package/ios/Options/ANNSetStackRootAnimationOptions.mm +11 -0
- package/ios/Options/ANNSharedElementTransitionOptions.h +17 -0
- package/ios/Options/ANNSharedElementTransitionOptions.mm +15 -0
- package/ios/Options/ANNSheetOptions.h +25 -0
- package/ios/Options/ANNSheetOptions.mm +41 -0
- package/ios/Options/ANNSideMenuOptions.h +19 -0
- package/ios/Options/ANNSideMenuOptions.mm +16 -0
- package/ios/Options/ANNSideMenuSideOptions.h +23 -0
- package/ios/Options/ANNSideMenuSideOptions.mm +20 -0
- package/ios/Options/ANNSplitViewColumnOptions.h +14 -0
- package/ios/Options/ANNSplitViewColumnOptions.mm +13 -0
- package/ios/Options/ANNSplitViewInspectorOptions.h +13 -0
- package/ios/Options/ANNSplitViewInspectorOptions.mm +9 -0
- package/ios/Options/ANNSplitViewOptions.h +29 -0
- package/ios/Options/ANNSplitViewOptions.mm +26 -0
- package/ios/Options/ANNStackAnimationOptions.h +23 -0
- package/ios/Options/ANNStackAnimationOptions.mm +20 -0
- package/ios/Options/ANNStackPushAnimationOptions.h +13 -0
- package/ios/Options/ANNStackPushAnimationOptions.mm +11 -0
- package/ios/Options/ANNStatusBarOptions.h +20 -0
- package/ios/Options/ANNStatusBarOptions.mm +18 -0
- package/ios/Options/ANNToolbarOptions.h +14 -0
- package/ios/Options/ANNToolbarOptions.mm +27 -0
- package/ios/Options/ANNTopBarAnimationOptions.h +12 -0
- package/ios/Options/ANNTopBarAnimationOptions.mm +11 -0
- package/ios/Options/ANNTopBarBackButtonOptions.h +31 -0
- package/ios/Options/ANNTopBarBackButtonOptions.mm +35 -0
- package/ios/Options/ANNTopBarBackgroundComponentOptions.h +13 -0
- package/ios/Options/ANNTopBarBackgroundComponentOptions.mm +11 -0
- package/ios/Options/ANNTopBarBackgroundOptions.h +17 -0
- package/ios/Options/ANNTopBarBackgroundOptions.mm +15 -0
- package/ios/Options/ANNTopBarLargeTitleOptions.h +19 -0
- package/ios/Options/ANNTopBarLargeTitleOptions.mm +15 -0
- package/ios/Options/ANNTopBarOptions.h +62 -0
- package/ios/Options/ANNTopBarOptions.mm +49 -0
- package/ios/Options/ANNTopBarScrollEdgeAppearanceBackgroundOptions.h +14 -0
- package/ios/Options/ANNTopBarScrollEdgeAppearanceBackgroundOptions.mm +12 -0
- package/ios/Options/ANNTopBarScrollEdgeAppearanceOptions.h +19 -0
- package/ios/Options/ANNTopBarScrollEdgeAppearanceOptions.mm +16 -0
- package/ios/Options/ANNTopBarScrollEdgeAppearanceTitleOptions.h +16 -0
- package/ios/Options/ANNTopBarScrollEdgeAppearanceTitleOptions.mm +12 -0
- package/ios/Options/ANNTopBarSubtitleOptions.h +18 -0
- package/ios/Options/ANNTopBarSubtitleOptions.mm +14 -0
- package/ios/Options/ANNTopBarTitleComponentOptions.h +15 -0
- package/ios/Options/ANNTopBarTitleComponentOptions.mm +12 -0
- package/ios/Options/ANNTopBarTitleDocumentOptions.h +12 -0
- package/ios/Options/ANNTopBarTitleDocumentOptions.mm +11 -0
- package/ios/Options/ANNTopBarTitleOptions.h +29 -0
- package/ios/Options/ANNTopBarTitleOptions.mm +21 -0
- package/ios/Options/ANNViewAnimationOptions.h +26 -0
- package/ios/Options/ANNViewAnimationOptions.mm +58 -0
- package/ios/Options/ANNWindowOptions.h +12 -0
- package/ios/Options/ANNWindowOptions.mm +9 -0
- package/ios/Options/ANNZoomTransitionOptions.h +13 -0
- package/ios/Options/ANNZoomTransitionOptions.mm +12 -0
- package/ios/Options/Params/ANNIntegerParam.h +14 -0
- package/ios/Options/Params/ANNIntegerParam.mm +13 -0
- package/ios/Options/Params/ANNParam.h +28 -0
- package/ios/Options/Params/ANNParam.mm +29 -0
- package/ios/Options/Params/Bool.h +17 -0
- package/ios/Options/Params/Bool.mm +17 -0
- package/ios/Options/Params/BoolParser.h +12 -0
- package/ios/Options/Params/BoolParser.mm +10 -0
- package/ios/Options/Params/Color.h +43 -0
- package/ios/Options/Params/Color.mm +65 -0
- package/ios/Options/Params/ColorParser.h +14 -0
- package/ios/Options/Params/ColorParser.mm +95 -0
- package/ios/Options/Params/Double.h +14 -0
- package/ios/Options/Params/Double.mm +13 -0
- package/ios/Options/Params/DoubleParser.h +16 -0
- package/ios/Options/Params/DoubleParser.mm +16 -0
- package/ios/Options/Params/Image.h +15 -0
- package/ios/Options/Params/Image.mm +13 -0
- package/ios/Options/Params/ImageParser.h +16 -0
- package/ios/Options/Params/ImageParser.mm +103 -0
- package/ios/Options/Params/Number.h +14 -0
- package/ios/Options/Params/Number.mm +13 -0
- package/ios/Options/Params/NumberParser.h +13 -0
- package/ios/Options/Params/NumberParser.mm +10 -0
- package/ios/Options/Params/Param.h +16 -0
- package/ios/Options/Params/Param.mm +13 -0
- package/ios/Options/Params/Text.h +17 -0
- package/ios/Options/Params/Text.mm +17 -0
- package/ios/Options/Params/TextParser.h +17 -0
- package/ios/Options/Params/TextParser.mm +17 -0
- package/ios/Package.swift +58 -0
- package/ios/Public/ApexNavigation/ANNAppDelegate.h +66 -0
- package/ios/Public/ApexNavigation/ANNSceneDelegate.h +19 -0
- package/ios/Public/ApexNavigation/ApexNavigation.h +92 -0
- package/ios/Public/module.modulemap +8 -0
- package/ios/RECIPES.md +41 -0
- package/ios/React/ANNComponentType.h +22 -0
- package/ios/React/ANNComponentViewCreator.h +18 -0
- package/ios/React/ANNReactComponentRegistry.h +53 -0
- package/ios/React/ANNReactComponentRegistry.mm +153 -0
- package/ios/React/ANNReactView.h +104 -0
- package/ios/React/ANNReactView.mm +374 -0
- package/ios/React/ANNReactViewCreator.h +20 -0
- package/ios/React/ANNReactViewCreator.mm +42 -0
- package/ios/React/ANNSafeAreaViewComponentView.h +13 -0
- package/ios/React/ANNSafeAreaViewComponentView.mm +153 -0
- package/ios/React/ANNSurfaceHostingView.h +17 -0
- package/ios/React/ANNSurfaceHostingView.mm +68 -0
- package/ios/React/Slots/ANNSlotComponentView.h +10 -0
- package/ios/React/Slots/ANNSlotComponentView.mm +122 -0
- package/ios/React/Slots/ANNSlotContainers.h +34 -0
- package/ios/React/Slots/ANNSlotContainers.mm +39 -0
- package/ios/React/Slots/ANNSlotContentView.h +12 -0
- package/ios/React/Slots/ANNSlotContentView.mm +18 -0
- package/ios/React/Slots/ANNSlotHost.h +29 -0
- package/ios/React/Slots/ANNSlotHost.mm +59 -0
- package/ios/React/Slots/ANNSlotScreenView.h +38 -0
- package/ios/React/Slots/ANNSlotScreenView.mm +254 -0
- package/ios/TopBar/ANNBackButtonPresenter.h +35 -0
- package/ios/TopBar/ANNBackButtonPresenter.mm +187 -0
- package/ios/TopBar/ANNBarAppearance.h +53 -0
- package/ios/TopBar/ANNBarAppearance.mm +278 -0
- package/ios/TopBar/ANNBarBackgroundComponent.h +46 -0
- package/ios/TopBar/ANNBarBackgroundComponent.mm +163 -0
- package/ios/TopBar/ANNBarButtonComponentView.h +30 -0
- package/ios/TopBar/ANNBarButtonComponentView.mm +110 -0
- package/ios/TopBar/ANNBarButtons.h +65 -0
- package/ios/TopBar/ANNBarButtons.mm +1125 -0
- package/ios/TopBar/ANNBarComponentsWait.h +37 -0
- package/ios/TopBar/ANNBarComponentsWait.mm +116 -0
- package/ios/TopBar/ANNIconButtonImage.h +25 -0
- package/ios/TopBar/ANNIconButtonImage.mm +94 -0
- package/ios/TopBar/ANNLargeTitlePresenter.h +117 -0
- package/ios/TopBar/ANNLargeTitlePresenter.mm +402 -0
- package/ios/TopBar/ANNMainList.h +28 -0
- package/ios/TopBar/ANNMainList.mm +72 -0
- package/ios/TopBar/ANNScrollEdgeEffects.h +29 -0
- package/ios/TopBar/ANNScrollEdgeEffects.mm +122 -0
- package/ios/TopBar/ANNSearchPresenter.h +29 -0
- package/ios/TopBar/ANNSearchPresenter.mm +637 -0
- package/ios/TopBar/ANNSearchResultsViewController.h +16 -0
- package/ios/TopBar/ANNSearchResultsViewController.mm +56 -0
- package/ios/TopBar/ANNShowTextButton.h +22 -0
- package/ios/TopBar/ANNShowTextButton.mm +63 -0
- package/ios/TopBar/ANNTitleComponentView.h +37 -0
- package/ios/TopBar/ANNTitleComponentView.mm +86 -0
- package/ios/TopBar/ANNTitleGlassView.h +33 -0
- package/ios/TopBar/ANNTitleGlassView.mm +126 -0
- package/ios/TopBar/ANNTitleView.h +18 -0
- package/ios/TopBar/ANNTitleView.mm +63 -0
- package/ios/TopBar/ANNToolbarPresenter.h +26 -0
- package/ios/TopBar/ANNToolbarPresenter.mm +24 -0
- package/ios/TopBar/ANNTopBarPresenter.h +120 -0
- package/ios/TopBar/ANNTopBarPresenter.mm +1252 -0
- package/ios/TopBar/ANNUIBarButtonItem.h +16 -0
- package/ios/TopBar/ANNUIBarButtonItem.mm +5 -0
- package/ios/TurboModules/ANNTurboEventEmitter.h +31 -0
- package/ios/TurboModules/ANNTurboEventEmitter.mm +129 -0
- package/ios/TurboModules/ANNTurboModule.h +11 -0
- package/ios/TurboModules/ANNTurboModule.mm +626 -0
- package/ios/Utils/UIColor+ANNLuminance.h +13 -0
- package/ios/Utils/UIColor+ANNLuminance.mm +32 -0
- package/ios/Utils/UIView+Utils.h +12 -0
- package/ios/Utils/UIView+Utils.mm +21 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSafeAreaViewComponentDescriptor.h +19 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSafeAreaViewShadowNode.h +60 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSafeAreaViewState.h +33 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotComponentDescriptor.h +22 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotShadowNode.h +87 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +101 -0
- package/lib/module/ARCHITECTURE.md +289 -0
- package/lib/module/adapters/NativeANNTurboEventEmitter.js +12 -0
- package/lib/module/adapters/NativeANNTurboEventEmitter.js.map +1 -0
- package/lib/module/adapters/NativeANNTurboModule.js +13 -0
- package/lib/module/adapters/NativeANNTurboModule.js.map +1 -0
- package/lib/module/api/app/AppRegistry.js +52 -0
- package/lib/module/api/app/AppRegistry.js.map +1 -0
- package/lib/module/api/app/activeApp.js +12 -0
- package/lib/module/api/app/activeApp.js.map +1 -0
- package/lib/module/api/app/createNavigation.js +365 -0
- package/lib/module/api/app/createNavigation.js.map +1 -0
- package/lib/module/api/app/roots.js +20 -0
- package/lib/module/api/app/roots.js.map +1 -0
- package/lib/module/api/app/splash.js +124 -0
- package/lib/module/api/app/splash.js.map +1 -0
- package/lib/module/api/app/startFailure.js +38 -0
- package/lib/module/api/app/startFailure.js.map +1 -0
- package/lib/module/api/arrangement/arrangementState.js +86 -0
- package/lib/module/api/arrangement/arrangementState.js.map +1 -0
- package/lib/module/api/commands/commands.js +375 -0
- package/lib/module/api/commands/commands.js.map +1 -0
- package/lib/module/api/commands/errors.js +94 -0
- package/lib/module/api/commands/errors.js.map +1 -0
- package/lib/module/api/commands/presentation.js +4 -0
- package/lib/module/api/commands/presentation.js.map +1 -0
- package/lib/module/api/commands/sideMenus.js +134 -0
- package/lib/module/api/commands/sideMenus.js.map +1 -0
- package/lib/module/api/commands/transitions.js +245 -0
- package/lib/module/api/commands/transitions.js.map +1 -0
- package/lib/module/api/context/appContext.js +22 -0
- package/lib/module/api/context/appContext.js.map +1 -0
- package/lib/module/api/events/navigationEvents.js +69 -0
- package/lib/module/api/events/navigationEvents.js.map +1 -0
- package/lib/module/api/events/screenLifecycle.js +30 -0
- package/lib/module/api/events/screenLifecycle.js.map +1 -0
- package/lib/module/api/events/tabPresses.js +32 -0
- package/lib/module/api/events/tabPresses.js.map +1 -0
- package/lib/module/api/hinge/hinge.js +73 -0
- package/lib/module/api/hinge/hinge.js.map +1 -0
- package/lib/module/api/hooks/appHooks.js +26 -0
- package/lib/module/api/hooks/appHooks.js.map +1 -0
- package/lib/module/api/hooks/screenHooks.js +250 -0
- package/lib/module/api/hooks/screenHooks.js.map +1 -0
- package/lib/module/api/hooks/useArrangement.js +24 -0
- package/lib/module/api/hooks/useArrangement.js.map +1 -0
- package/lib/module/api/hooks/useHinge.js +29 -0
- package/lib/module/api/hooks/useHinge.js.map +1 -0
- package/lib/module/api/hooks/useNavigation.js +117 -0
- package/lib/module/api/hooks/useNavigation.js.map +1 -0
- package/lib/module/api/hooks/usePendingLink.js +12 -0
- package/lib/module/api/hooks/usePendingLink.js.map +1 -0
- package/lib/module/api/hooks/usePreview.js +97 -0
- package/lib/module/api/hooks/usePreview.js.map +1 -0
- package/lib/module/api/hooks/useReservedRegions.js +24 -0
- package/lib/module/api/hooks/useReservedRegions.js.map +1 -0
- package/lib/module/api/hooks/useSafeAreaInsets.js +25 -0
- package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -0
- package/lib/module/api/index.js +26 -0
- package/lib/module/api/index.js.map +1 -0
- package/lib/module/api/layout/Root.js +121 -0
- package/lib/module/api/layout/Root.js.map +1 -0
- package/lib/module/api/layout/Screen.js +52 -0
- package/lib/module/api/layout/Screen.js.map +1 -0
- package/lib/module/api/layout/SideMenu.js +85 -0
- package/lib/module/api/layout/SideMenu.js.map +1 -0
- package/lib/module/api/layout/SplitView.js +137 -0
- package/lib/module/api/layout/SplitView.js.map +1 -0
- package/lib/module/api/layout/Stack.js +36 -0
- package/lib/module/api/layout/Stack.js.map +1 -0
- package/lib/module/api/layout/Tabs.js +326 -0
- package/lib/module/api/layout/Tabs.js.map +1 -0
- package/lib/module/api/layout/element.js +100 -0
- package/lib/module/api/layout/element.js.map +1 -0
- package/lib/module/api/linking/linkPaths.js +132 -0
- package/lib/module/api/linking/linkPaths.js.map +1 -0
- package/lib/module/api/linking/linking.js +244 -0
- package/lib/module/api/linking/linking.js.map +1 -0
- package/lib/module/api/linking/pendingLinks.js +34 -0
- package/lib/module/api/linking/pendingLinks.js.map +1 -0
- package/lib/module/api/linking/types.js +4 -0
- package/lib/module/api/linking/types.js.map +1 -0
- package/lib/module/api/navigation.js +105 -0
- package/lib/module/api/navigation.js.map +1 -0
- package/lib/module/api/options/OptionsChain.js +158 -0
- package/lib/module/api/options/OptionsChain.js.map +1 -0
- package/lib/module/api/options/ScreenOptions.js +83 -0
- package/lib/module/api/options/ScreenOptions.js.map +1 -0
- package/lib/module/api/options/buttons.js +4 -0
- package/lib/module/api/options/buttons.js.map +1 -0
- package/lib/module/api/safeArea/ANNSafeAreaViewNativeComponent.ts +28 -0
- package/lib/module/api/safeArea/screenInsets.js +86 -0
- package/lib/module/api/safeArea/screenInsets.js.map +1 -0
- package/lib/module/api/safeArea/screenRegions.js +84 -0
- package/lib/module/api/safeArea/screenRegions.js.map +1 -0
- package/lib/module/api/screens/ScreenBoundary.js +44 -0
- package/lib/module/api/screens/ScreenBoundary.js.map +1 -0
- package/lib/module/api/screens/arrangement.js +63 -0
- package/lib/module/api/screens/arrangement.js.map +1 -0
- package/lib/module/api/screens/defineScreen.js +29 -0
- package/lib/module/api/screens/defineScreen.js.map +1 -0
- package/lib/module/api/screens/nativeScreenCalls.js +34 -0
- package/lib/module/api/screens/nativeScreenCalls.js.map +1 -0
- package/lib/module/api/screens/nativeScreens.js +43 -0
- package/lib/module/api/screens/nativeScreens.js.map +1 -0
- package/lib/module/api/screens/registerScreens.js +305 -0
- package/lib/module/api/screens/registerScreens.js.map +1 -0
- package/lib/module/api/slots/ANNSlotNativeComponent.ts +23 -0
- package/lib/module/api/slots/SlotHost.js +92 -0
- package/lib/module/api/slots/SlotHost.js.map +1 -0
- package/lib/module/api/state/navigationState.js +98 -0
- package/lib/module/api/state/navigationState.js.map +1 -0
- package/lib/module/api/testIDs.js +14 -0
- package/lib/module/api/testIDs.js.map +1 -0
- package/lib/module/api/theme/theme.js +180 -0
- package/lib/module/api/theme/theme.js.map +1 -0
- package/lib/module/api/types.js +4 -0
- package/lib/module/api/types.js.map +1 -0
- package/lib/module/engine/backListeners.js +39 -0
- package/lib/module/engine/backListeners.js.map +1 -0
- package/lib/module/engine/buttons.js +105 -0
- package/lib/module/engine/buttons.js.map +1 -0
- package/lib/module/engine/commands.js +388 -0
- package/lib/module/engine/commands.js.map +1 -0
- package/lib/module/engine/events.js +30 -0
- package/lib/module/engine/events.js.map +1 -0
- package/lib/module/engine/ids.js +10 -0
- package/lib/module/engine/ids.js.map +1 -0
- package/lib/module/engine/launchState.js +34 -0
- package/lib/module/engine/launchState.js.map +1 -0
- package/lib/module/engine/layout.js +202 -0
- package/lib/module/engine/layout.js.map +1 -0
- package/lib/module/engine/mergeOptions.js +23 -0
- package/lib/module/engine/mergeOptions.js.map +1 -0
- package/lib/module/engine/native.js +45 -0
- package/lib/module/engine/native.js.map +1 -0
- package/lib/module/engine/nativeScreens.js +265 -0
- package/lib/module/engine/nativeScreens.js.map +1 -0
- package/lib/module/engine/options.js +170 -0
- package/lib/module/engine/options.js.map +1 -0
- package/lib/module/engine/places.js +178 -0
- package/lib/module/engine/places.js.map +1 -0
- package/lib/module/engine/props.js +44 -0
- package/lib/module/engine/props.js.map +1 -0
- package/lib/module/engine/reactMeasures.js +23 -0
- package/lib/module/engine/reactMeasures.js.map +1 -0
- package/lib/module/engine/rememberedOptions.js +118 -0
- package/lib/module/engine/rememberedOptions.js.map +1 -0
- package/lib/module/engine/screens.js +194 -0
- package/lib/module/engine/screens.js.map +1 -0
- package/lib/module/engine/slots.js +200 -0
- package/lib/module/engine/slots.js.map +1 -0
- package/lib/module/engine/tabs.js +79 -0
- package/lib/module/engine/tabs.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/interfaces/ComponentEvents.js +2 -0
- package/lib/module/interfaces/ComponentEvents.js.map +1 -0
- package/lib/module/interfaces/Events.js +2 -0
- package/lib/module/interfaces/Events.js.map +1 -0
- package/lib/module/interfaces/Layout.js +4 -0
- package/lib/module/interfaces/Layout.js.map +1 -0
- package/lib/module/interfaces/Options.js +4 -0
- package/lib/module/interfaces/Options.js.map +1 -0
- package/lib/module/interfaces/options/animations.js +2 -0
- package/lib/module/interfaces/options/animations.js.map +1 -0
- package/lib/module/interfaces/options/bottomTabs.js +4 -0
- package/lib/module/interfaces/options/bottomTabs.js.map +1 -0
- package/lib/module/interfaces/options/buttons.js +4 -0
- package/lib/module/interfaces/options/buttons.js.map +1 -0
- package/lib/module/interfaces/options/common.js +4 -0
- package/lib/module/interfaces/options/common.js.map +1 -0
- package/lib/module/interfaces/options/modals.js +2 -0
- package/lib/module/interfaces/options/modals.js.map +1 -0
- package/lib/module/interfaces/options/preview.js +2 -0
- package/lib/module/interfaces/options/preview.js.map +1 -0
- package/lib/module/interfaces/options/sideMenu.js +2 -0
- package/lib/module/interfaces/options/sideMenu.js.map +1 -0
- package/lib/module/interfaces/options/splitView.js +2 -0
- package/lib/module/interfaces/options/splitView.js.map +1 -0
- package/lib/module/interfaces/options/stack.js +4 -0
- package/lib/module/interfaces/options/stack.js.map +1 -0
- package/lib/module/interfaces/options/system.js +4 -0
- package/lib/module/interfaces/options/system.js.map +1 -0
- package/lib/module/interfaces/options/toolbar.js +4 -0
- package/lib/module/interfaces/options/toolbar.js.map +1 -0
- package/lib/module/interfaces/options/topBar.js +4 -0
- package/lib/module/interfaces/options/topBar.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/adapters/NativeANNTurboEventEmitter.d.ts +14 -0
- package/lib/typescript/adapters/NativeANNTurboEventEmitter.d.ts.map +1 -0
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts +77 -0
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -0
- package/lib/typescript/api/app/AppRegistry.d.ts +14 -0
- package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -0
- package/lib/typescript/api/app/activeApp.d.ts +12 -0
- package/lib/typescript/api/app/activeApp.d.ts.map +1 -0
- package/lib/typescript/api/app/createNavigation.d.ts +182 -0
- package/lib/typescript/api/app/createNavigation.d.ts.map +1 -0
- package/lib/typescript/api/app/roots.d.ts +15 -0
- package/lib/typescript/api/app/roots.d.ts.map +1 -0
- package/lib/typescript/api/app/splash.d.ts +81 -0
- package/lib/typescript/api/app/splash.d.ts.map +1 -0
- package/lib/typescript/api/app/startFailure.d.ts +15 -0
- package/lib/typescript/api/app/startFailure.d.ts.map +1 -0
- package/lib/typescript/api/arrangement/arrangementState.d.ts +21 -0
- package/lib/typescript/api/arrangement/arrangementState.d.ts.map +1 -0
- package/lib/typescript/api/commands/commands.d.ts +57 -0
- package/lib/typescript/api/commands/commands.d.ts.map +1 -0
- package/lib/typescript/api/commands/errors.d.ts +24 -0
- package/lib/typescript/api/commands/errors.d.ts.map +1 -0
- package/lib/typescript/api/commands/presentation.d.ts +69 -0
- package/lib/typescript/api/commands/presentation.d.ts.map +1 -0
- package/lib/typescript/api/commands/sideMenus.d.ts +14 -0
- package/lib/typescript/api/commands/sideMenus.d.ts.map +1 -0
- package/lib/typescript/api/commands/transitions.d.ts +33 -0
- package/lib/typescript/api/commands/transitions.d.ts.map +1 -0
- package/lib/typescript/api/context/appContext.d.ts +4 -0
- package/lib/typescript/api/context/appContext.d.ts.map +1 -0
- package/lib/typescript/api/events/navigationEvents.d.ts +70 -0
- package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -0
- package/lib/typescript/api/events/screenLifecycle.d.ts +5 -0
- package/lib/typescript/api/events/screenLifecycle.d.ts.map +1 -0
- package/lib/typescript/api/events/tabPresses.d.ts +5 -0
- package/lib/typescript/api/events/tabPresses.d.ts.map +1 -0
- package/lib/typescript/api/hinge/hinge.d.ts +21 -0
- package/lib/typescript/api/hinge/hinge.d.ts.map +1 -0
- package/lib/typescript/api/hooks/appHooks.d.ts +15 -0
- package/lib/typescript/api/hooks/appHooks.d.ts.map +1 -0
- package/lib/typescript/api/hooks/screenHooks.d.ts +74 -0
- package/lib/typescript/api/hooks/screenHooks.d.ts.map +1 -0
- package/lib/typescript/api/hooks/useArrangement.d.ts +13 -0
- package/lib/typescript/api/hooks/useArrangement.d.ts.map +1 -0
- package/lib/typescript/api/hooks/useHinge.d.ts +16 -0
- package/lib/typescript/api/hooks/useHinge.d.ts.map +1 -0
- package/lib/typescript/api/hooks/useNavigation.d.ts +108 -0
- package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -0
- package/lib/typescript/api/hooks/usePendingLink.d.ts +7 -0
- package/lib/typescript/api/hooks/usePendingLink.d.ts.map +1 -0
- package/lib/typescript/api/hooks/usePreview.d.ts +29 -0
- package/lib/typescript/api/hooks/usePreview.d.ts.map +1 -0
- package/lib/typescript/api/hooks/useReservedRegions.d.ts +13 -0
- package/lib/typescript/api/hooks/useReservedRegions.d.ts.map +1 -0
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts +14 -0
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -0
- package/lib/typescript/api/index.d.ts +60 -0
- package/lib/typescript/api/index.d.ts.map +1 -0
- package/lib/typescript/api/layout/Root.d.ts +47 -0
- package/lib/typescript/api/layout/Root.d.ts.map +1 -0
- package/lib/typescript/api/layout/Screen.d.ts +32 -0
- package/lib/typescript/api/layout/Screen.d.ts.map +1 -0
- package/lib/typescript/api/layout/SideMenu.d.ts +33 -0
- package/lib/typescript/api/layout/SideMenu.d.ts.map +1 -0
- package/lib/typescript/api/layout/SplitView.d.ts +48 -0
- package/lib/typescript/api/layout/SplitView.d.ts.map +1 -0
- package/lib/typescript/api/layout/Stack.d.ts +21 -0
- package/lib/typescript/api/layout/Stack.d.ts.map +1 -0
- package/lib/typescript/api/layout/Tabs.d.ts +120 -0
- package/lib/typescript/api/layout/Tabs.d.ts.map +1 -0
- package/lib/typescript/api/layout/element.d.ts +52 -0
- package/lib/typescript/api/layout/element.d.ts.map +1 -0
- package/lib/typescript/api/linking/linkPaths.d.ts +31 -0
- package/lib/typescript/api/linking/linkPaths.d.ts.map +1 -0
- package/lib/typescript/api/linking/linking.d.ts +37 -0
- package/lib/typescript/api/linking/linking.d.ts.map +1 -0
- package/lib/typescript/api/linking/pendingLinks.d.ts +8 -0
- package/lib/typescript/api/linking/pendingLinks.d.ts.map +1 -0
- package/lib/typescript/api/linking/types.d.ts +105 -0
- package/lib/typescript/api/linking/types.d.ts.map +1 -0
- package/lib/typescript/api/navigation.d.ts +115 -0
- package/lib/typescript/api/navigation.d.ts.map +1 -0
- package/lib/typescript/api/options/OptionsChain.d.ts +47 -0
- package/lib/typescript/api/options/OptionsChain.d.ts.map +1 -0
- package/lib/typescript/api/options/ScreenOptions.d.ts +32 -0
- package/lib/typescript/api/options/ScreenOptions.d.ts.map +1 -0
- package/lib/typescript/api/options/buttons.d.ts +35 -0
- package/lib/typescript/api/options/buttons.d.ts.map +1 -0
- package/lib/typescript/api/safeArea/ANNSafeAreaViewNativeComponent.d.ts +20 -0
- package/lib/typescript/api/safeArea/ANNSafeAreaViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/api/safeArea/screenInsets.d.ts +20 -0
- package/lib/typescript/api/safeArea/screenInsets.d.ts.map +1 -0
- package/lib/typescript/api/safeArea/screenRegions.d.ts +24 -0
- package/lib/typescript/api/safeArea/screenRegions.d.ts.map +1 -0
- package/lib/typescript/api/screens/ScreenBoundary.d.ts +34 -0
- package/lib/typescript/api/screens/ScreenBoundary.d.ts.map +1 -0
- package/lib/typescript/api/screens/arrangement.d.ts +70 -0
- package/lib/typescript/api/screens/arrangement.d.ts.map +1 -0
- package/lib/typescript/api/screens/defineScreen.d.ts +41 -0
- package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -0
- package/lib/typescript/api/screens/nativeScreenCalls.d.ts +3 -0
- package/lib/typescript/api/screens/nativeScreenCalls.d.ts.map +1 -0
- package/lib/typescript/api/screens/nativeScreens.d.ts +47 -0
- package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -0
- package/lib/typescript/api/screens/registerScreens.d.ts +61 -0
- package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -0
- package/lib/typescript/api/slots/ANNSlotNativeComponent.d.ts +15 -0
- package/lib/typescript/api/slots/ANNSlotNativeComponent.d.ts.map +1 -0
- package/lib/typescript/api/slots/SlotHost.d.ts +8 -0
- package/lib/typescript/api/slots/SlotHost.d.ts.map +1 -0
- package/lib/typescript/api/state/navigationState.d.ts +26 -0
- package/lib/typescript/api/state/navigationState.d.ts.map +1 -0
- package/lib/typescript/api/testIDs.d.ts +12 -0
- package/lib/typescript/api/testIDs.d.ts.map +1 -0
- package/lib/typescript/api/theme/theme.d.ts +70 -0
- package/lib/typescript/api/theme/theme.d.ts.map +1 -0
- package/lib/typescript/api/types.d.ts +64 -0
- package/lib/typescript/api/types.d.ts.map +1 -0
- package/lib/typescript/engine/backListeners.d.ts +8 -0
- package/lib/typescript/engine/backListeners.d.ts.map +1 -0
- package/lib/typescript/engine/buttons.d.ts +11 -0
- package/lib/typescript/engine/buttons.d.ts.map +1 -0
- package/lib/typescript/engine/commands.d.ts +38 -0
- package/lib/typescript/engine/commands.d.ts.map +1 -0
- package/lib/typescript/engine/events.d.ts +17 -0
- package/lib/typescript/engine/events.d.ts.map +1 -0
- package/lib/typescript/engine/ids.d.ts +3 -0
- package/lib/typescript/engine/ids.d.ts.map +1 -0
- package/lib/typescript/engine/launchState.d.ts +25 -0
- package/lib/typescript/engine/launchState.d.ts.map +1 -0
- package/lib/typescript/engine/layout.d.ts +32 -0
- package/lib/typescript/engine/layout.d.ts.map +1 -0
- package/lib/typescript/engine/mergeOptions.d.ts +6 -0
- package/lib/typescript/engine/mergeOptions.d.ts.map +1 -0
- package/lib/typescript/engine/native.d.ts +22 -0
- package/lib/typescript/engine/native.d.ts.map +1 -0
- package/lib/typescript/engine/nativeScreens.d.ts +49 -0
- package/lib/typescript/engine/nativeScreens.d.ts.map +1 -0
- package/lib/typescript/engine/options.d.ts +12 -0
- package/lib/typescript/engine/options.d.ts.map +1 -0
- package/lib/typescript/engine/places.d.ts +57 -0
- package/lib/typescript/engine/places.d.ts.map +1 -0
- package/lib/typescript/engine/props.d.ts +10 -0
- package/lib/typescript/engine/props.d.ts.map +1 -0
- package/lib/typescript/engine/reactMeasures.d.ts +3 -0
- package/lib/typescript/engine/reactMeasures.d.ts.map +1 -0
- package/lib/typescript/engine/rememberedOptions.d.ts +28 -0
- package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -0
- package/lib/typescript/engine/screens.d.ts +90 -0
- package/lib/typescript/engine/screens.d.ts.map +1 -0
- package/lib/typescript/engine/slots.d.ts +71 -0
- package/lib/typescript/engine/slots.d.ts.map +1 -0
- package/lib/typescript/engine/tabs.d.ts +24 -0
- package/lib/typescript/engine/tabs.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +3 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/interfaces/ComponentEvents.d.ts +189 -0
- package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -0
- package/lib/typescript/interfaces/Events.d.ts +199 -0
- package/lib/typescript/interfaces/Events.d.ts.map +1 -0
- package/lib/typescript/interfaces/Layout.d.ts +150 -0
- package/lib/typescript/interfaces/Layout.d.ts.map +1 -0
- package/lib/typescript/interfaces/Options.d.ts +93 -0
- package/lib/typescript/interfaces/Options.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/animations.d.ts +452 -0
- package/lib/typescript/interfaces/options/animations.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/bottomTabs.d.ts +462 -0
- package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/buttons.d.ts +331 -0
- package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/common.d.ts +51 -0
- package/lib/typescript/interfaces/options/common.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/modals.d.ts +202 -0
- package/lib/typescript/interfaces/options/modals.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/preview.d.ts +40 -0
- package/lib/typescript/interfaces/options/preview.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/sideMenu.d.ts +130 -0
- package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/splitView.d.ts +118 -0
- package/lib/typescript/interfaces/options/splitView.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/stack.d.ts +109 -0
- package/lib/typescript/interfaces/options/stack.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/system.d.ts +238 -0
- package/lib/typescript/interfaces/options/system.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/toolbar.d.ts +45 -0
- package/lib/typescript/interfaces/options/toolbar.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/topBar.d.ts +804 -0
- package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/package.json +189 -4
- package/react-native.config.js +22 -0
- package/src/ARCHITECTURE.md +289 -0
- package/src/adapters/NativeANNTurboEventEmitter.ts +15 -0
- package/src/adapters/NativeANNTurboModule.ts +100 -0
- package/src/api/app/AppRegistry.ts +57 -0
- package/src/api/app/activeApp.ts +20 -0
- package/src/api/app/createNavigation.ts +566 -0
- package/src/api/app/roots.ts +40 -0
- package/src/api/app/splash.ts +154 -0
- package/src/api/app/startFailure.tsx +39 -0
- package/src/api/arrangement/arrangementState.ts +98 -0
- package/src/api/commands/commands.ts +371 -0
- package/src/api/commands/errors.ts +99 -0
- package/src/api/commands/presentation.ts +78 -0
- package/src/api/commands/sideMenus.ts +122 -0
- package/src/api/commands/transitions.ts +133 -0
- package/src/api/context/appContext.ts +23 -0
- package/src/api/events/navigationEvents.ts +175 -0
- package/src/api/events/screenLifecycle.ts +27 -0
- package/src/api/events/tabPresses.ts +35 -0
- package/src/api/hinge/hinge.ts +84 -0
- package/src/api/hooks/appHooks.ts +37 -0
- package/src/api/hooks/screenHooks.ts +272 -0
- package/src/api/hooks/useArrangement.ts +26 -0
- package/src/api/hooks/useHinge.ts +26 -0
- package/src/api/hooks/useNavigation.ts +267 -0
- package/src/api/hooks/usePendingLink.ts +11 -0
- package/src/api/hooks/usePreview.ts +111 -0
- package/src/api/hooks/useReservedRegions.ts +26 -0
- package/src/api/hooks/useSafeAreaInsets.ts +23 -0
- package/src/api/index.ts +139 -0
- package/src/api/layout/Root.ts +113 -0
- package/src/api/layout/Screen.ts +55 -0
- package/src/api/layout/SideMenu.ts +87 -0
- package/src/api/layout/SplitView.ts +146 -0
- package/src/api/layout/Stack.ts +48 -0
- package/src/api/layout/Tabs.ts +339 -0
- package/src/api/layout/element.ts +114 -0
- package/src/api/linking/linkPaths.ts +159 -0
- package/src/api/linking/linking.ts +242 -0
- package/src/api/linking/pendingLinks.ts +37 -0
- package/src/api/linking/types.ts +130 -0
- package/src/api/navigation.ts +269 -0
- package/src/api/options/OptionsChain.ts +142 -0
- package/src/api/options/ScreenOptions.ts +81 -0
- package/src/api/options/buttons.ts +43 -0
- package/src/api/safeArea/ANNSafeAreaViewNativeComponent.ts +28 -0
- package/src/api/safeArea/screenInsets.ts +86 -0
- package/src/api/safeArea/screenRegions.ts +99 -0
- package/src/api/screens/ScreenBoundary.tsx +52 -0
- package/src/api/screens/arrangement.ts +106 -0
- package/src/api/screens/defineScreen.ts +57 -0
- package/src/api/screens/nativeScreenCalls.ts +59 -0
- package/src/api/screens/nativeScreens.ts +58 -0
- package/src/api/screens/registerScreens.tsx +364 -0
- package/src/api/slots/ANNSlotNativeComponent.ts +23 -0
- package/src/api/slots/SlotHost.tsx +64 -0
- package/src/api/state/navigationState.ts +95 -0
- package/src/api/testIDs.ts +11 -0
- package/src/api/theme/theme.ts +184 -0
- package/src/api/types.ts +95 -0
- package/src/engine/backListeners.ts +36 -0
- package/src/engine/buttons.ts +91 -0
- package/src/engine/commands.ts +469 -0
- package/src/engine/events.ts +24 -0
- package/src/engine/ids.ts +7 -0
- package/src/engine/launchState.ts +35 -0
- package/src/engine/layout.ts +247 -0
- package/src/engine/mergeOptions.ts +20 -0
- package/src/engine/native.ts +51 -0
- package/src/engine/nativeScreens.ts +263 -0
- package/src/engine/options.ts +165 -0
- package/src/engine/places.ts +205 -0
- package/src/engine/props.ts +45 -0
- package/src/engine/reactMeasures.ts +24 -0
- package/src/engine/rememberedOptions.ts +111 -0
- package/src/engine/screens.tsx +239 -0
- package/src/engine/slots.ts +191 -0
- package/src/engine/tabs.ts +95 -0
- package/src/index.ts +3 -0
- package/src/interfaces/ComponentEvents.ts +214 -0
- package/src/interfaces/Events.ts +227 -0
- package/src/interfaces/Layout.ts +161 -0
- package/src/interfaces/Options.ts +175 -0
- package/src/interfaces/options/animations.ts +480 -0
- package/src/interfaces/options/bottomTabs.ts +481 -0
- package/src/interfaces/options/buttons.ts +364 -0
- package/src/interfaces/options/common.ts +76 -0
- package/src/interfaces/options/modals.ts +217 -0
- package/src/interfaces/options/preview.ts +40 -0
- package/src/interfaces/options/sideMenu.ts +132 -0
- package/src/interfaces/options/splitView.ts +127 -0
- package/src/interfaces/options/stack.ts +110 -0
- package/src/interfaces/options/system.ts +252 -0
- package/src/interfaces/options/toolbar.ts +47 -0
- package/src/interfaces/options/topBar.ts +828 -0
|
@@ -0,0 +1,1300 @@
|
|
|
1
|
+
#import "ANNStackQueue.h"
|
|
2
|
+
#import "ANNAnimationRules.h"
|
|
3
|
+
#import "ANNAppearanceDispatcher.h"
|
|
4
|
+
#import "ANNAssert.h"
|
|
5
|
+
#import "ANNBarComponentsWait.h"
|
|
6
|
+
#import "ANNCommandRunner.h"
|
|
7
|
+
#import "ANNComponentViewController.h"
|
|
8
|
+
#import "ANNErrorTexts.h"
|
|
9
|
+
#import "ANNReloadCoordinator.h"
|
|
10
|
+
#import "ANNRenderWait.h"
|
|
11
|
+
#import "ANNTransitionPlan.h"
|
|
12
|
+
#import "UIViewController+LayoutProtocol.h"
|
|
13
|
+
#import <QuartzCore/QuartzCore.h>
|
|
14
|
+
#import <React/RCTLog.h>
|
|
15
|
+
|
|
16
|
+
// How long the new top of a `setStackRoot` waits for its first content when `waitForRender` is not set.
|
|
17
|
+
static const NSTimeInterval ANNStackRootRenderLimit = 0.5;
|
|
18
|
+
|
|
19
|
+
// The limits of the bar components of a push: title and background 1 s, buttons 0.5 s, together from the wait's start.
|
|
20
|
+
static const ANNBarWaitLimits ANNPushBarLimits = {1, 0.5};
|
|
21
|
+
|
|
22
|
+
// The bar components of a `setStackRoot` within its 0.5 s.
|
|
23
|
+
static const ANNBarWaitLimits ANNStackRootBarLimits = {0.5, 0.5};
|
|
24
|
+
|
|
25
|
+
typedef NS_ENUM(NSInteger, ANNStackOperationKind) {
|
|
26
|
+
ANNStackOperationPush,
|
|
27
|
+
ANNStackOperationCut,
|
|
28
|
+
ANNStackOperationReplace,
|
|
29
|
+
ANNStackOperationNone,
|
|
30
|
+
ANNStackOperationSwipe,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// One command or action of the user in the queue: what it moves, its answer, and how far it got.
|
|
34
|
+
@interface ANNStackOperation : NSObject
|
|
35
|
+
@property(nonatomic) ANNStackOperationKind kind;
|
|
36
|
+
// The JavaScript it belongs to: a step of another one does nothing (reload).
|
|
37
|
+
@property(nonatomic) NSUInteger generation;
|
|
38
|
+
@property(nonatomic, strong, nullable) ANNCommandAnswer *answer;
|
|
39
|
+
@property(nonatomic, strong, nullable) id value;
|
|
40
|
+
@property(nonatomic, copy) NSString *what;
|
|
41
|
+
@property(nonatomic, copy, nullable) NSString *componentId;
|
|
42
|
+
// The node the command came from; a completed swipe that took it (or the target) away marks `sourceGone`.
|
|
43
|
+
@property(nonatomic, weak, nullable) UIViewController *source;
|
|
44
|
+
@property(nonatomic) BOOL sourceGone;
|
|
45
|
+
// push
|
|
46
|
+
@property(nonatomic, strong, nullable) UIViewController *node;
|
|
47
|
+
// cut, swipe: the entry that stays on top
|
|
48
|
+
@property(nonatomic, strong, nullable) UIViewController *target;
|
|
49
|
+
@property(nonatomic) BOOL silent;
|
|
50
|
+
// replace
|
|
51
|
+
@property(nonatomic, copy, nullable) NSArray<UIViewController *> *nodes;
|
|
52
|
+
// replace, push: a push with `animated` NO has no animation, with `waits` NO no wait before its transition.
|
|
53
|
+
@property(nonatomic) BOOL animated;
|
|
54
|
+
@property(nonatomic) BOOL waits;
|
|
55
|
+
@property(nonatomic) BOOL atOnce;
|
|
56
|
+
// When the replace's own wait for its new top started (`waitForRender` unset): the custom transition's wait takes what
|
|
57
|
+
// is left of the 0.5 s. 0 when it didn't wait so.
|
|
58
|
+
@property(nonatomic) CFTimeInterval waitStarted;
|
|
59
|
+
@property(nonatomic, copy, nullable) dispatch_block_t completion;
|
|
60
|
+
@property(nonatomic, copy, nullable) ANNTransitionRejectionBlock rejection;
|
|
61
|
+
// The run.
|
|
62
|
+
@property(nonatomic) BOOL done;
|
|
63
|
+
// The operation's render wait: its content, then or together with its bar components.
|
|
64
|
+
@property(nonatomic, strong, nullable) ANNRenderWait *wait;
|
|
65
|
+
@property(nonatomic, readonly) BOOL waiting;
|
|
66
|
+
// The entry that waits in the stack's view while the wait runs.
|
|
67
|
+
@property(nonatomic, strong, nullable) UIViewController *waited;
|
|
68
|
+
@property(nonatomic) BOOL parked;
|
|
69
|
+
@property(nonatomic, copy, nullable) NSArray<UIViewController *> *driven;
|
|
70
|
+
// The entries the transition takes away, top first; the entry a push covers.
|
|
71
|
+
@property(nonatomic, copy, nullable) NSArray<UIViewController *> *leaving;
|
|
72
|
+
@property(nonatomic, strong, nullable) UIViewController *covered;
|
|
73
|
+
@end
|
|
74
|
+
|
|
75
|
+
@implementation ANNStackOperation
|
|
76
|
+
|
|
77
|
+
- (BOOL)isCurrent {
|
|
78
|
+
return _generation == ANNReloadCoordinator.generation;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// The operation waits for a screen to render (either phase of its wait).
|
|
82
|
+
- (BOOL)waiting {
|
|
83
|
+
return _wait.isWaiting;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@end
|
|
87
|
+
|
|
88
|
+
static NSString *ANNIdOf(UIViewController *node) {
|
|
89
|
+
return node.layoutInfo.componentId ?: @"";
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
UIViewController *ANNStackOptionsScreen(UIViewController *entry) {
|
|
93
|
+
if ([entry respondsToSelector:@selector(optionsScreen)]) {
|
|
94
|
+
UIViewController *screen = [(id<ANNLayoutProtocol>)entry optionsScreen];
|
|
95
|
+
if (screen) {
|
|
96
|
+
return screen;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return entry;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
NSString *ANNStackAnswerIdOf(UIViewController *entry, ANNStackAnswerCommand command) {
|
|
103
|
+
switch (command) {
|
|
104
|
+
case ANNStackAnswerCommandPush:
|
|
105
|
+
return ANNIdOf(entry);
|
|
106
|
+
case ANNStackAnswerCommandReplace:
|
|
107
|
+
case ANNStackAnswerCommandPop:
|
|
108
|
+
case ANNStackAnswerCommandPopToRoot:
|
|
109
|
+
case ANNStackAnswerCommandKey:
|
|
110
|
+
case ANNStackAnswerCommandShowInColumn:
|
|
111
|
+
return ANNIdOf(ANNStackOptionsScreen(entry));
|
|
112
|
+
}
|
|
113
|
+
return ANNIdOf(ANNStackOptionsScreen(entry));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
NSArray<ANNComponentViewController *> *ANNStackScreensOfEntry(UIViewController *entry) {
|
|
117
|
+
if ([entry isKindOfClass:ANNComponentViewController.class]) {
|
|
118
|
+
return @[ (ANNComponentViewController *)entry ];
|
|
119
|
+
}
|
|
120
|
+
NSMutableArray<ANNComponentViewController *> *screens = [NSMutableArray new];
|
|
121
|
+
for (UIViewController *child in entry.layoutChildren) {
|
|
122
|
+
if ([child isKindOfClass:ANNComponentViewController.class]) {
|
|
123
|
+
[screens addObject:(ANNComponentViewController *)child];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return screens;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
BOOL ANNStackEntryIsReady(UIViewController *entry) {
|
|
130
|
+
for (ANNComponentViewController *screen in ANNStackScreensOfEntry(entry)) {
|
|
131
|
+
if (screen.reactView && !screen.reactView.isReady) {
|
|
132
|
+
return NO;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return YES;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// A screen renders once by itself; another entry (a pair) renders only while its view never loaded.
|
|
139
|
+
static void ANNRenderIfNeeded(UIViewController *entry) {
|
|
140
|
+
if ([entry isKindOfClass:ANNComponentViewController.class] || !entry.isViewLoaded) {
|
|
141
|
+
[entry render];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// The node an operation shows renders right before its transition. A caller that waited itself (`waits` NO: a
|
|
146
|
+
// preview, `showInColumn`, the split view's replace) rendered it already: only a screen, which renders once, is asked
|
|
147
|
+
// again; a pair's `render` would start its count again.
|
|
148
|
+
static void ANNRenderBeforeTransition(UIViewController *node, BOOL waits) {
|
|
149
|
+
if (waits || [node isKindOfClass:ANNComponentViewController.class]) {
|
|
150
|
+
[node render];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
static NSArray<UIViewController *> *ANNTopFirst(NSArray<UIViewController *> *entries) {
|
|
155
|
+
return entries.reverseObjectEnumerator.allObjects;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
@implementation ANNStackQueue {
|
|
159
|
+
__weak id<ANNStackDisplay> _display;
|
|
160
|
+
NSMutableArray<UIViewController *> *_entries;
|
|
161
|
+
NSMutableArray<UIViewController *> *_shown;
|
|
162
|
+
NSMutableArray<ANNStackOperation *> *_pending;
|
|
163
|
+
// The operation that waits or runs its transition (iOS runs one at a time).
|
|
164
|
+
ANNStackOperation *_current;
|
|
165
|
+
BOOL _running;
|
|
166
|
+
BOOL _runScheduled;
|
|
167
|
+
// UIKit runs a transition the queue didn't start: the next operation waits for its end.
|
|
168
|
+
BOOL _waitingForUIKit;
|
|
169
|
+
BOOL _destroyed;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
- (instancetype)initWithDisplay:(id<ANNStackDisplay>)display {
|
|
173
|
+
if (self = [super init]) {
|
|
174
|
+
_display = display;
|
|
175
|
+
_entries = [NSMutableArray new];
|
|
176
|
+
_shown = [NSMutableArray new];
|
|
177
|
+
_pending = [NSMutableArray new];
|
|
178
|
+
}
|
|
179
|
+
return self;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
#pragma mark - The lists
|
|
183
|
+
|
|
184
|
+
- (NSArray<UIViewController *> *)entries {
|
|
185
|
+
return [_entries copy];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
- (NSArray<UIViewController *> *)shown {
|
|
189
|
+
return [_shown copy];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
- (BOOL)isAtRest {
|
|
193
|
+
return !_current && _pending.count == 0 && !_waitingForUIKit && !_destroyed &&
|
|
194
|
+
![_display stackRunningTransition];
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
- (NSArray<UIViewController *> *)heldNodes {
|
|
198
|
+
NSMutableOrderedSet<UIViewController *> *nodes =
|
|
199
|
+
[NSMutableOrderedSet orderedSetWithArray:_shown];
|
|
200
|
+
[nodes addObjectsFromArray:_entries];
|
|
201
|
+
NSMutableArray<ANNStackOperation *> *operations = [_pending mutableCopy];
|
|
202
|
+
if (_current) {
|
|
203
|
+
[operations insertObject:_current atIndex:0];
|
|
204
|
+
}
|
|
205
|
+
for (ANNStackOperation *operation in operations) {
|
|
206
|
+
if (operation.node) {
|
|
207
|
+
[nodes addObject:operation.node];
|
|
208
|
+
}
|
|
209
|
+
if (operation.nodes) {
|
|
210
|
+
[nodes addObjectsFromArray:operation.nodes];
|
|
211
|
+
}
|
|
212
|
+
if (operation.leaving) {
|
|
213
|
+
[nodes addObjectsFromArray:operation.leaving];
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return nodes.array;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
- (void)setInitialEntries:(NSArray<UIViewController *> *)entries {
|
|
220
|
+
UIViewController *stack = [_display stackViewController];
|
|
221
|
+
for (UIViewController *entry in entries) {
|
|
222
|
+
[entry setLayoutParentFallback:stack];
|
|
223
|
+
}
|
|
224
|
+
[_entries setArray:entries];
|
|
225
|
+
[_shown setArray:entries];
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
#pragma mark - Accepting an operation (`entries` changes now)
|
|
229
|
+
|
|
230
|
+
- (ANNStackOperation *)operationOfKind:(ANNStackOperationKind)kind
|
|
231
|
+
answer:(ANNCommandAnswer *)answer
|
|
232
|
+
what:(NSString *)what
|
|
233
|
+
componentId:(NSString *)componentId
|
|
234
|
+
source:(UIViewController *)source {
|
|
235
|
+
ANNStackOperation *operation = [ANNStackOperation new];
|
|
236
|
+
operation.kind = kind;
|
|
237
|
+
operation.answer = answer;
|
|
238
|
+
operation.generation = answer ? answer.generation : ANNReloadCoordinator.generation;
|
|
239
|
+
operation.what = what ?: @"go back";
|
|
240
|
+
operation.componentId = componentId;
|
|
241
|
+
operation.source = source;
|
|
242
|
+
return operation;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
- (void)push:(UIViewController *)node
|
|
246
|
+
answer:(ANNCommandAnswer *)answer
|
|
247
|
+
what:(NSString *)what
|
|
248
|
+
componentId:(NSString *)componentId
|
|
249
|
+
source:(UIViewController *)source {
|
|
250
|
+
[self push:node
|
|
251
|
+
answer:answer
|
|
252
|
+
what:what
|
|
253
|
+
componentId:componentId
|
|
254
|
+
source:source
|
|
255
|
+
animated:YES
|
|
256
|
+
waits:YES];
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
- (void)push:(UIViewController *)node
|
|
260
|
+
answer:(ANNCommandAnswer *)answer
|
|
261
|
+
what:(NSString *)what
|
|
262
|
+
componentId:(NSString *)componentId
|
|
263
|
+
source:(UIViewController *)source
|
|
264
|
+
animated:(BOOL)animated
|
|
265
|
+
waits:(BOOL)waits {
|
|
266
|
+
ANNAssertMainQueue();
|
|
267
|
+
ANNStackOperation *operation = [self operationOfKind:ANNStackOperationPush
|
|
268
|
+
answer:answer
|
|
269
|
+
what:what
|
|
270
|
+
componentId:componentId
|
|
271
|
+
source:source];
|
|
272
|
+
operation.node = node;
|
|
273
|
+
operation.value = ANNStackAnswerIdOf(node, ANNStackAnswerCommandPush);
|
|
274
|
+
operation.animated = animated;
|
|
275
|
+
operation.waits = waits;
|
|
276
|
+
if (_destroyed) {
|
|
277
|
+
[self reject:operation text:[ANNErrorTexts screenNotShown:componentId]];
|
|
278
|
+
[node destroy];
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
// A push over a waiting `setStackRoot` completes it now: its screens lie under the push.
|
|
282
|
+
[self completeWaitingReplace];
|
|
283
|
+
[node setLayoutParentFallback:[_display stackViewController]];
|
|
284
|
+
[_entries addObject:node];
|
|
285
|
+
[_pending addObject:operation];
|
|
286
|
+
[self runNext];
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
- (void)cutTo:(UIViewController *)target
|
|
290
|
+
answer:(ANNCommandAnswer *)answer
|
|
291
|
+
value:(id)value
|
|
292
|
+
what:(NSString *)what
|
|
293
|
+
componentId:(NSString *)componentId
|
|
294
|
+
source:(UIViewController *)source
|
|
295
|
+
silent:(BOOL)silent {
|
|
296
|
+
ANNAssertMainQueue();
|
|
297
|
+
ANNStackOperation *operation = [self operationOfKind:ANNStackOperationCut
|
|
298
|
+
answer:answer
|
|
299
|
+
what:what
|
|
300
|
+
componentId:componentId
|
|
301
|
+
source:source];
|
|
302
|
+
operation.target = target;
|
|
303
|
+
operation.value = value;
|
|
304
|
+
operation.silent = silent;
|
|
305
|
+
if (_destroyed) {
|
|
306
|
+
[self reject:operation text:[ANNErrorTexts screenNotShown:componentId ?: ANNIdOf(target)]];
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
// A cut while a `setStackRoot` waits completes it first and runs on its list: a back never waits for a render that
|
|
310
|
+
// may take long.
|
|
311
|
+
[self completeWaitingReplace];
|
|
312
|
+
NSUInteger index = [_entries indexOfObjectIdenticalTo:target];
|
|
313
|
+
if (index == NSNotFound) {
|
|
314
|
+
[self reject:operation text:[ANNErrorTexts screenNotShown:componentId ?: ANNIdOf(target)]];
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
NSRange above = NSMakeRange(index + 1, _entries.count - index - 1);
|
|
318
|
+
NSArray<UIViewController *> *removed = [_entries subarrayWithRange:above];
|
|
319
|
+
[_entries removeObjectsInRange:above];
|
|
320
|
+
// The pushes it takes away that haven't shown are interrupted now (C1): a back never waits behind a screen the user
|
|
321
|
+
// hasn't seen. When nothing else goes, it moves nothing: a `none` in its turn.
|
|
322
|
+
if (![self interruptPushesOf:removed]) {
|
|
323
|
+
if (!answer) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
operation.kind = ANNStackOperationNone;
|
|
327
|
+
}
|
|
328
|
+
[_pending addObject:operation];
|
|
329
|
+
[self runNext];
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
- (void)replaceWith:(NSArray<UIViewController *> *)nodes
|
|
333
|
+
animated:(BOOL)animated
|
|
334
|
+
waits:(BOOL)waits
|
|
335
|
+
answer:(ANNCommandAnswer *)answer
|
|
336
|
+
what:(NSString *)what
|
|
337
|
+
componentId:(NSString *)componentId
|
|
338
|
+
source:(UIViewController *)source
|
|
339
|
+
completion:(dispatch_block_t)completion
|
|
340
|
+
rejection:(ANNTransitionRejectionBlock)rejection {
|
|
341
|
+
ANNAssertMainQueue();
|
|
342
|
+
ANNStackOperation *operation = [self operationOfKind:ANNStackOperationReplace
|
|
343
|
+
answer:answer
|
|
344
|
+
what:what
|
|
345
|
+
componentId:componentId
|
|
346
|
+
source:source];
|
|
347
|
+
operation.nodes = nodes;
|
|
348
|
+
operation.animated = animated;
|
|
349
|
+
operation.waits = waits;
|
|
350
|
+
operation.completion = completion;
|
|
351
|
+
operation.rejection = rejection;
|
|
352
|
+
operation.value = ANNStackAnswerIdOf(nodes.lastObject, ANNStackAnswerCommandReplace);
|
|
353
|
+
if (_destroyed) {
|
|
354
|
+
[self reject:operation text:[ANNErrorTexts screenNotShown:componentId]];
|
|
355
|
+
for (UIViewController *node in nodes) {
|
|
356
|
+
[node destroy];
|
|
357
|
+
}
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
// A second `setStackRoot` completes a waiting one and runs from its state; the pushes not shown yet go.
|
|
361
|
+
[self completeWaitingReplace];
|
|
362
|
+
[self interruptPushesOf:[_entries copy]];
|
|
363
|
+
UIViewController *stack = [_display stackViewController];
|
|
364
|
+
for (UIViewController *node in nodes) {
|
|
365
|
+
[node setLayoutParentFallback:stack];
|
|
366
|
+
}
|
|
367
|
+
[_entries setArray:nodes];
|
|
368
|
+
[_pending addObject:operation];
|
|
369
|
+
[self runNext];
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
- (void)noneWithValue:(id)value
|
|
373
|
+
answer:(ANNCommandAnswer *)answer
|
|
374
|
+
componentId:(NSString *)componentId
|
|
375
|
+
source:(UIViewController *)source {
|
|
376
|
+
ANNAssertMainQueue();
|
|
377
|
+
ANNStackOperation *operation = [self operationOfKind:ANNStackOperationNone
|
|
378
|
+
answer:answer
|
|
379
|
+
what:@"pop"
|
|
380
|
+
componentId:componentId
|
|
381
|
+
source:source];
|
|
382
|
+
operation.value = value;
|
|
383
|
+
if (_destroyed) {
|
|
384
|
+
[self reject:operation text:[ANNErrorTexts screenNotShown:componentId]];
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
[_pending addObject:operation];
|
|
388
|
+
[self runNext];
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// Every push whose node `removed` holds and that hasn't started its transition (waiting for its render, or queued)
|
|
392
|
+
// is interrupted, oldest first. Whether anything else of `removed` is left to move.
|
|
393
|
+
- (BOOL)interruptPushesOf:(NSArray<UIViewController *> *)removed {
|
|
394
|
+
NSMutableArray<UIViewController *> *left = [removed mutableCopy];
|
|
395
|
+
ANNStackOperation *current = _current;
|
|
396
|
+
if (current.kind == ANNStackOperationPush && current.waiting &&
|
|
397
|
+
[removed indexOfObjectIdenticalTo:current.node] != NSNotFound) {
|
|
398
|
+
[left removeObjectIdenticalTo:current.node];
|
|
399
|
+
[self interrupt:current];
|
|
400
|
+
}
|
|
401
|
+
for (ANNStackOperation *operation in [_pending copy]) {
|
|
402
|
+
if (operation.kind == ANNStackOperationPush && operation.node &&
|
|
403
|
+
[removed indexOfObjectIdenticalTo:operation.node] != NSNotFound) {
|
|
404
|
+
[_pending removeObjectIdenticalTo:operation];
|
|
405
|
+
[left removeObjectIdenticalTo:operation.node];
|
|
406
|
+
[self interrupt:operation];
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return left.count > 0;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// An interrupted push: it resolves with its node's id, which never appeared, and the node is destroyed without
|
|
413
|
+
// appearance events and without `ScreenPopped` (its destroy's own `SlotDestroyed` or `NativeScreenReleased` go). The
|
|
414
|
+
// screen under it is not touched.
|
|
415
|
+
- (void)interrupt:(ANNStackOperation *)operation {
|
|
416
|
+
[self endWaitOf:operation];
|
|
417
|
+
[self unparkOf:operation];
|
|
418
|
+
[self stopDrivingOf:operation];
|
|
419
|
+
operation.done = YES;
|
|
420
|
+
operation.wait.ended = nil;
|
|
421
|
+
if (_current == operation) {
|
|
422
|
+
_current = nil;
|
|
423
|
+
}
|
|
424
|
+
if (!operation.isCurrent) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
[operation.answer resolve:operation.value];
|
|
428
|
+
[self destroyNodes:@[ operation.node ]];
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// A waiting `setStackRoot` completed at once: its end steps now, without an animation and without an appearance of its
|
|
432
|
+
// new top, which lies under what comes next. YES when it completed.
|
|
433
|
+
- (BOOL)completeWaitingReplace {
|
|
434
|
+
ANNStackOperation *operation = _current;
|
|
435
|
+
if (operation.kind != ANNStackOperationReplace || !operation.waiting || !operation.isCurrent) {
|
|
436
|
+
return NO;
|
|
437
|
+
}
|
|
438
|
+
[self endWaitOf:operation];
|
|
439
|
+
operation.atOnce = YES;
|
|
440
|
+
[self protect:operation
|
|
441
|
+
step:^{
|
|
442
|
+
[self startReplaceTransition:operation];
|
|
443
|
+
}];
|
|
444
|
+
return _current != operation;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
#pragma mark - Running
|
|
448
|
+
|
|
449
|
+
- (void)runNext {
|
|
450
|
+
if (_running || _destroyed || _waitingForUIKit) {
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
_running = YES;
|
|
454
|
+
while (!_destroyed && !_waitingForUIKit) {
|
|
455
|
+
ANNStackOperation *head = _pending.firstObject;
|
|
456
|
+
if (!head) {
|
|
457
|
+
break;
|
|
458
|
+
}
|
|
459
|
+
if (_current) {
|
|
460
|
+
// A waiting `setStackRoot` is completed at once by what changes the list after it; a `none` waits until
|
|
461
|
+
// it starts its transition (C6).
|
|
462
|
+
if (_current.kind == ANNStackOperationReplace && head.kind != ANNStackOperationNone &&
|
|
463
|
+
[self completeWaitingReplace]) {
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
break;
|
|
467
|
+
}
|
|
468
|
+
[_pending removeObjectAtIndex:0];
|
|
469
|
+
if (!head.isCurrent) {
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
id<UIViewControllerTransitionCoordinator> coordinator = [_display stackRunningTransition];
|
|
473
|
+
if (coordinator) {
|
|
474
|
+
[_pending insertObject:head atIndex:0];
|
|
475
|
+
[self waitForUIKit:coordinator];
|
|
476
|
+
break;
|
|
477
|
+
}
|
|
478
|
+
_current = head;
|
|
479
|
+
[self protect:head
|
|
480
|
+
step:^{
|
|
481
|
+
[self start:head];
|
|
482
|
+
}];
|
|
483
|
+
}
|
|
484
|
+
_running = NO;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// The operation that ended asked for the next one: the loop takes it when it runs, else on the next turn of the main
|
|
488
|
+
// queue, once UIKit finished its own part of the transition that ended.
|
|
489
|
+
- (void)scheduleRunNext {
|
|
490
|
+
if (_running || _runScheduled || _destroyed) {
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
_runScheduled = YES;
|
|
494
|
+
__weak ANNStackQueue *weakSelf = self;
|
|
495
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
496
|
+
ANNStackQueue *queue = weakSelf;
|
|
497
|
+
if (!queue) {
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
queue->_runScheduled = NO;
|
|
501
|
+
[queue runNext];
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// UIKit drops a push or a pop asked for during a transition of its own: the queue goes on once it ended.
|
|
506
|
+
- (void)waitForUIKit:(id<UIViewControllerTransitionCoordinator>)coordinator {
|
|
507
|
+
_waitingForUIKit = YES;
|
|
508
|
+
__weak ANNStackQueue *weakSelf = self;
|
|
509
|
+
dispatch_block_t resume = ^{
|
|
510
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
511
|
+
ANNStackQueue *queue = weakSelf;
|
|
512
|
+
if (!queue || !queue->_waitingForUIKit) {
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
queue->_waitingForUIKit = NO;
|
|
516
|
+
[queue runNext];
|
|
517
|
+
});
|
|
518
|
+
};
|
|
519
|
+
void (^completion)(id<UIViewControllerTransitionCoordinatorContext>) =
|
|
520
|
+
^(id<UIViewControllerTransitionCoordinatorContext> context) {
|
|
521
|
+
resume();
|
|
522
|
+
};
|
|
523
|
+
if (![coordinator animateAlongsideTransition:nil completion:completion]) {
|
|
524
|
+
resume();
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
- (void)start:(ANNStackOperation *)operation {
|
|
529
|
+
switch (operation.kind) {
|
|
530
|
+
case ANNStackOperationPush:
|
|
531
|
+
[self startPush:operation];
|
|
532
|
+
break;
|
|
533
|
+
case ANNStackOperationCut:
|
|
534
|
+
[self startCut:operation];
|
|
535
|
+
break;
|
|
536
|
+
case ANNStackOperationReplace:
|
|
537
|
+
[self startReplace:operation];
|
|
538
|
+
break;
|
|
539
|
+
case ANNStackOperationNone:
|
|
540
|
+
if (operation.sourceGone) {
|
|
541
|
+
[self rejectInTurn:operation];
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
[operation.answer resolve:operation.value];
|
|
545
|
+
[self finish:operation];
|
|
546
|
+
break;
|
|
547
|
+
case ANNStackOperationSwipe:
|
|
548
|
+
break;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
#pragma mark - push
|
|
553
|
+
|
|
554
|
+
- (void)startPush:(ANNStackOperation *)operation {
|
|
555
|
+
UIViewController *node = operation.node;
|
|
556
|
+
// Its node went before its turn (a swipe that completed took the screen it came from, C8): interrupted.
|
|
557
|
+
if ([_entries indexOfObjectIdenticalTo:node] == NSNotFound) {
|
|
558
|
+
[self interrupt:operation];
|
|
559
|
+
[self scheduleRunNext];
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
// `waitForRender: true` waits for the content as long as it takes, then for the bar components (their limits from
|
|
563
|
+
// the content's end); unset (also with `enabled: false`), only for the bar components, each kind to its own limit,
|
|
564
|
+
// without parking (bar roots render out of a window); `false`, for nothing. The content comes during the
|
|
565
|
+
// transition. A stack that isn't seen never waits.
|
|
566
|
+
Bool *waitForRender = [node resolveOptionsWithDefault].animations.push.waitForRender;
|
|
567
|
+
// A push whose caller waited already (a preview, `showInColumn`) waits for nothing here.
|
|
568
|
+
BOOL onScreen = operation.waits && [_display stackIsOnScreen];
|
|
569
|
+
__weak ANNStackQueue *weakSelf = self;
|
|
570
|
+
__weak ANNStackOperation *weakOperation = operation;
|
|
571
|
+
if (onScreen && waitForRender.hasValue && waitForRender.get) {
|
|
572
|
+
[self waitFor:operation
|
|
573
|
+
entry:node
|
|
574
|
+
content:ANNRenderWaitContentNode
|
|
575
|
+
limit:0
|
|
576
|
+
unknownLimit:YES
|
|
577
|
+
bar:ANNRenderWaitBarAfterContent
|
|
578
|
+
barLimits:ANNPushBarLimits
|
|
579
|
+
then:^{
|
|
580
|
+
[weakSelf startPushTransition:weakOperation];
|
|
581
|
+
}];
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
if (onScreen && !waitForRender.hasValue) {
|
|
585
|
+
[self waitFor:operation
|
|
586
|
+
entry:node
|
|
587
|
+
content:ANNRenderWaitContentNone
|
|
588
|
+
limit:0
|
|
589
|
+
unknownLimit:NO
|
|
590
|
+
bar:ANNRenderWaitBarAfterContent
|
|
591
|
+
barLimits:ANNPushBarLimits
|
|
592
|
+
then:^{
|
|
593
|
+
// UIKit sizes the screen inside the push: it makes its content right before.
|
|
594
|
+
[weakOperation.node render];
|
|
595
|
+
[weakSelf startPushTransition:weakOperation];
|
|
596
|
+
}];
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
// UIKit sizes the screen inside the push: it makes its content right before.
|
|
600
|
+
ANNRenderBeforeTransition(node, operation.waits);
|
|
601
|
+
[self startPushTransition:operation];
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
- (void)startPushTransition:(ANNStackOperation *)operation {
|
|
605
|
+
if (!operation) {
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
UIViewController *node = operation.node;
|
|
609
|
+
[self unparkOf:operation];
|
|
610
|
+
BOOL onScreen = [_display stackIsOnScreen];
|
|
611
|
+
// The arriving screen's `animations.push`: its own transition when it has one, else UIKit's push (or the zoom);
|
|
612
|
+
// none with `enabled: false`.
|
|
613
|
+
ANNStackPushAnimationOptions *push = [node resolveOptionsWithDefault].animations.push;
|
|
614
|
+
BOOL animated = onScreen && operation.animated && [push.enabled withDefault:YES];
|
|
615
|
+
UIViewController *covered = _shown.lastObject;
|
|
616
|
+
operation.covered = covered;
|
|
617
|
+
ANNTransitionPlan *plan = nil;
|
|
618
|
+
if (animated) {
|
|
619
|
+
plan = [ANNTransitionPlan stackPlanOfKind:ANNTransitionKindPush
|
|
620
|
+
animation:push
|
|
621
|
+
waitForRender:push.waitForRender
|
|
622
|
+
waitLimit:ANNCustomTransitionWaitLimit
|
|
623
|
+
from:covered
|
|
624
|
+
to:node];
|
|
625
|
+
}
|
|
626
|
+
[self drive:operation nodes:covered ? @[ covered, node ] : @[ node ]];
|
|
627
|
+
[_display stackEntryJoins:node first:_shown.count == 0];
|
|
628
|
+
[_shown addObject:node];
|
|
629
|
+
if (onScreen) {
|
|
630
|
+
[ANNAppearanceDispatcher beginTransitionShowing:@[ node ]];
|
|
631
|
+
}
|
|
632
|
+
[_display stackChange:ANNStackChangePush toEntries:[_shown copy] animated:animated plan:plan];
|
|
633
|
+
[self whenTransitionOf:operation
|
|
634
|
+
ends:^(BOOL cancelled) {
|
|
635
|
+
[self endPush:operation];
|
|
636
|
+
}];
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
- (void)endPush:(ANNStackOperation *)operation {
|
|
640
|
+
UIViewController *node = operation.node;
|
|
641
|
+
UIViewController *covered = operation.covered;
|
|
642
|
+
BOOL showing = [_display stackIsOnScreen] && _shown.lastObject == node;
|
|
643
|
+
[ANNAppearanceDispatcher endTransitionHiding:covered ? @[ covered ] : @[]
|
|
644
|
+
showing:showing ? @[ node ] : @[]
|
|
645
|
+
events:nil
|
|
646
|
+
answer:operation.answer
|
|
647
|
+
value:operation.value];
|
|
648
|
+
[self finish:operation];
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
#pragma mark - cut (`pop`, `popTo`, `popToRoot`, the user's back)
|
|
652
|
+
|
|
653
|
+
- (void)startCut:(ANNStackOperation *)operation {
|
|
654
|
+
UIViewController *target = operation.target;
|
|
655
|
+
NSUInteger index = [_shown indexOfObjectIdenticalTo:target];
|
|
656
|
+
if (operation.sourceGone || index == NSNotFound) {
|
|
657
|
+
[self rejectInTurn:operation];
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
NSArray<UIViewController *> *above =
|
|
661
|
+
[_shown subarrayWithRange:NSMakeRange(index + 1, _shown.count - index - 1)];
|
|
662
|
+
// What it would remove went already (a swipe that completed): nothing moves, and no second `ScreenPopped`.
|
|
663
|
+
if (above.count == 0) {
|
|
664
|
+
[operation.answer resolve:operation.value];
|
|
665
|
+
[self finish:operation];
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
NSArray<UIViewController *> *leaving = ANNTopFirst(above);
|
|
669
|
+
operation.leaving = leaving;
|
|
670
|
+
for (UIViewController *entry in leaving) {
|
|
671
|
+
[ANNComponentViewController nodeWillLeave:entry];
|
|
672
|
+
}
|
|
673
|
+
[_display stackEntriesWillMove];
|
|
674
|
+
BOOL onScreen = !operation.silent && [_display stackIsOnScreen];
|
|
675
|
+
// The pop transition is the leaving top's `animations.pop` (`pop` step 3); the screens between it and the target go
|
|
676
|
+
// without one. Whether it is animated is read from the screen the command came from (`popTo`: its target), and from
|
|
677
|
+
// the top for the user's back and a command by the stack's id.
|
|
678
|
+
UIViewController *top = leaving.firstObject;
|
|
679
|
+
ANNStackAnimationOptions *pop = [top resolveOptionsWithDefault].animations.pop;
|
|
680
|
+
UIViewController *enabledFrom = operation.source ?: top;
|
|
681
|
+
Bool *enabled = enabledFrom == top
|
|
682
|
+
? pop.enabled
|
|
683
|
+
: [enabledFrom resolveOptionsWithDefault].animations.pop.enabled;
|
|
684
|
+
BOOL animated = onScreen && [enabled withDefault:YES];
|
|
685
|
+
ANNTransitionPlan *plan = animated ? [ANNTransitionPlan stackPlanOfKind:ANNTransitionKindPop
|
|
686
|
+
animation:pop
|
|
687
|
+
waitForRender:nil
|
|
688
|
+
waitLimit:0
|
|
689
|
+
from:top
|
|
690
|
+
to:target]
|
|
691
|
+
: nil;
|
|
692
|
+
plan.overridesZoom = operation.answer != nil;
|
|
693
|
+
[self drive:operation nodes:[leaving arrayByAddingObject:target]];
|
|
694
|
+
[_shown removeObjectsInRange:NSMakeRange(index + 1, _shown.count - index - 1)];
|
|
695
|
+
// A lower screen that never rendered makes its content now, so that its `WillAppear` has content to report.
|
|
696
|
+
ANNRenderIfNeeded(target);
|
|
697
|
+
if (onScreen) {
|
|
698
|
+
[ANNAppearanceDispatcher beginTransitionShowing:@[ target ]];
|
|
699
|
+
}
|
|
700
|
+
[_display stackChange:ANNStackChangePop toEntries:[_shown copy] animated:animated plan:plan];
|
|
701
|
+
[self whenTransitionOf:operation
|
|
702
|
+
ends:^(BOOL cancelled) {
|
|
703
|
+
[self endCut:operation];
|
|
704
|
+
}];
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
// The order: `DidDisappear` of the visible top (the others never showed), `DidAppear` of the target, the state,
|
|
708
|
+
// `ScreenPopped` of each entry that left, top to bottom, then their destroys, then the answer.
|
|
709
|
+
- (void)endCut:(ANNStackOperation *)operation {
|
|
710
|
+
UIViewController *target = operation.target;
|
|
711
|
+
NSArray<UIViewController *> *leaving = operation.leaving;
|
|
712
|
+
BOOL showing =
|
|
713
|
+
!operation.silent && [_display stackIsOnScreen] && _shown.lastObject == target;
|
|
714
|
+
__weak ANNStackQueue *weakSelf = self;
|
|
715
|
+
[ANNAppearanceDispatcher endTransitionHiding:operation.silent ? @[] : leaving
|
|
716
|
+
showing:showing ? @[ target ] : @[]
|
|
717
|
+
events:^{
|
|
718
|
+
[weakSelf poppedEntries:leaving reused:@[]];
|
|
719
|
+
}
|
|
720
|
+
answer:operation.answer
|
|
721
|
+
value:operation.value];
|
|
722
|
+
[self finish:operation];
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
#pragma mark - replace (`setStackRoot`, the split view's call)
|
|
726
|
+
|
|
727
|
+
- (void)startReplace:(ANNStackOperation *)operation {
|
|
728
|
+
if (operation.sourceGone) {
|
|
729
|
+
[self rejectInTurn:operation];
|
|
730
|
+
return;
|
|
731
|
+
}
|
|
732
|
+
UIViewController *top = operation.nodes.lastObject;
|
|
733
|
+
// Like a root: the new top waits unseen for its first content and its bar components together at most 0.5 s; with
|
|
734
|
+
// `waitForRender: true` the content as long as it takes, then the bar components at most 0.5 s; with `false` not at
|
|
735
|
+
// all. The split view's call never waits.
|
|
736
|
+
if (operation.waits && [_display stackIsOnScreen]) {
|
|
737
|
+
Bool *waitForRender = [top resolveOptionsWithDefault].animations.setStackRoot.waitForRender;
|
|
738
|
+
__weak ANNStackQueue *weakSelf = self;
|
|
739
|
+
__weak ANNStackOperation *weakOperation = operation;
|
|
740
|
+
if (!waitForRender.hasValue) {
|
|
741
|
+
operation.waitStarted = CACurrentMediaTime();
|
|
742
|
+
[self waitFor:operation
|
|
743
|
+
entry:top
|
|
744
|
+
content:ANNRenderWaitContentNode
|
|
745
|
+
limit:ANNStackRootRenderLimit
|
|
746
|
+
unknownLimit:NO
|
|
747
|
+
bar:ANNRenderWaitBarWithContent
|
|
748
|
+
barLimits:ANNStackRootBarLimits
|
|
749
|
+
then:^{
|
|
750
|
+
[weakSelf startReplaceTransition:weakOperation];
|
|
751
|
+
}];
|
|
752
|
+
return;
|
|
753
|
+
}
|
|
754
|
+
if (waitForRender.get) {
|
|
755
|
+
[self waitFor:operation
|
|
756
|
+
entry:top
|
|
757
|
+
content:ANNRenderWaitContentNode
|
|
758
|
+
limit:0
|
|
759
|
+
unknownLimit:YES
|
|
760
|
+
bar:ANNRenderWaitBarAfterContent
|
|
761
|
+
barLimits:ANNStackRootBarLimits
|
|
762
|
+
then:^{
|
|
763
|
+
[weakSelf startReplaceTransition:weakOperation];
|
|
764
|
+
}];
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
ANNRenderBeforeTransition(top, operation.waits);
|
|
769
|
+
[self startReplaceTransition:operation];
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
- (void)startReplaceTransition:(ANNStackOperation *)operation {
|
|
773
|
+
if (!operation) {
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
776
|
+
[self unparkOf:operation];
|
|
777
|
+
NSArray<UIViewController *> *nodes = operation.nodes;
|
|
778
|
+
UIViewController *top = nodes.lastObject;
|
|
779
|
+
NSMutableArray<UIViewController *> *leaving = [NSMutableArray new];
|
|
780
|
+
for (UIViewController *entry in _shown.reverseObjectEnumerator) {
|
|
781
|
+
if ([nodes indexOfObjectIdenticalTo:entry] == NSNotFound) {
|
|
782
|
+
[leaving addObject:entry];
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
operation.leaving = leaving;
|
|
786
|
+
for (UIViewController *entry in leaving) {
|
|
787
|
+
[ANNComponentViewController nodeWillLeave:entry];
|
|
788
|
+
}
|
|
789
|
+
[_display stackEntriesWillMove];
|
|
790
|
+
BOOL onScreen = !operation.atOnce && [_display stackIsOnScreen];
|
|
791
|
+
BOOL animated = onScreen && operation.animated;
|
|
792
|
+
ANNTransitionPlan *plan = animated && operation.waits
|
|
793
|
+
? [self replacePlanOf:operation from:_shown.lastObject]
|
|
794
|
+
: nil;
|
|
795
|
+
[self drive:operation nodes:[leaving arrayByAddingObject:top]];
|
|
796
|
+
for (NSUInteger index = 0; index < nodes.count; index++) {
|
|
797
|
+
[_display stackEntryJoins:nodes[index] first:index == 0];
|
|
798
|
+
}
|
|
799
|
+
[_shown setArray:nodes];
|
|
800
|
+
if (onScreen) {
|
|
801
|
+
[ANNAppearanceDispatcher beginTransitionShowing:@[ top ]];
|
|
802
|
+
}
|
|
803
|
+
[_display stackChange:ANNStackChangeReplace toEntries:nodes animated:animated plan:plan];
|
|
804
|
+
if (operation.atOnce) {
|
|
805
|
+
[self endReplace:operation];
|
|
806
|
+
return;
|
|
807
|
+
}
|
|
808
|
+
[self whenTransitionOf:operation
|
|
809
|
+
ends:^(BOOL cancelled) {
|
|
810
|
+
[self endReplace:operation];
|
|
811
|
+
}];
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
// The new top's own `animations.setStackRoot`, else its own `animations.push`, else none (UIKit's
|
|
815
|
+
// `setViewControllers:animated:`); iOS doesn't read `asPush`. Only a `setStackRoot` command: the split view's call
|
|
816
|
+
// keeps UIKit's. The wait is the `setStackRoot`'s `waitForRender`.
|
|
817
|
+
- (ANNTransitionPlan *)replacePlanOf:(ANNStackOperation *)operation
|
|
818
|
+
from:(UIViewController *)oldTop {
|
|
819
|
+
UIViewController *top = operation.nodes.lastObject;
|
|
820
|
+
if (!top) {
|
|
821
|
+
return nil;
|
|
822
|
+
}
|
|
823
|
+
ANNAnimationOptions *animations = [top resolveOptionsWithDefault].animations;
|
|
824
|
+
Bool *waitForRender = animations.setStackRoot.waitForRender;
|
|
825
|
+
// With `waitForRender: true` the targets 0.5 s; unset, what the `setStackRoot`'s own wait left.
|
|
826
|
+
NSTimeInterval limit =
|
|
827
|
+
waitForRender.hasValue
|
|
828
|
+
? ANNCustomTransitionWaitLimit
|
|
829
|
+
: [ANNAnimationRules customWaitLimitAfterWaitStartedAt:operation.waitStarted
|
|
830
|
+
commandLimit:ANNStackRootRenderLimit];
|
|
831
|
+
ANNStackAnimationOptions *animation = animations.setStackRoot;
|
|
832
|
+
if (![ANNAnimationRules stackIsOwn:animation]) {
|
|
833
|
+
animation = animations.push;
|
|
834
|
+
}
|
|
835
|
+
return [ANNTransitionPlan stackPlanOfKind:ANNTransitionKindReplace
|
|
836
|
+
animation:animation
|
|
837
|
+
waitForRender:waitForRender
|
|
838
|
+
waitLimit:limit
|
|
839
|
+
from:oldTop
|
|
840
|
+
to:top];
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
// `ScreenPopped` of each old entry whose id no new node takes, top to bottom, then their destroys; an old entry whose
|
|
844
|
+
// id a new node took gets no `ScreenPopped` and is destroyed after the others.
|
|
845
|
+
- (void)endReplace:(ANNStackOperation *)operation {
|
|
846
|
+
NSArray<UIViewController *> *nodes = operation.nodes;
|
|
847
|
+
UIViewController *top = nodes.lastObject;
|
|
848
|
+
NSMutableSet<NSString *> *newIds = [NSMutableSet new];
|
|
849
|
+
for (UIViewController *node in nodes) {
|
|
850
|
+
[newIds addObject:ANNIdOf(node)];
|
|
851
|
+
for (ANNComponentViewController *screen in ANNStackScreensOfEntry(node)) {
|
|
852
|
+
[newIds addObject:ANNIdOf(screen)];
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
NSMutableArray<UIViewController *> *popped = [NSMutableArray new];
|
|
856
|
+
NSMutableArray<UIViewController *> *reused = [NSMutableArray new];
|
|
857
|
+
for (UIViewController *entry in operation.leaving) {
|
|
858
|
+
[([newIds containsObject:ANNIdOf(entry)] ? reused : popped) addObject:entry];
|
|
859
|
+
}
|
|
860
|
+
BOOL showing = !operation.atOnce && [_display stackIsOnScreen] && _shown.lastObject == top;
|
|
861
|
+
__weak ANNStackQueue *weakSelf = self;
|
|
862
|
+
[ANNAppearanceDispatcher endTransitionHiding:operation.leaving
|
|
863
|
+
showing:showing ? @[ top ] : @[]
|
|
864
|
+
events:^{
|
|
865
|
+
[weakSelf poppedEntries:popped reused:reused];
|
|
866
|
+
}
|
|
867
|
+
answer:operation.answer
|
|
868
|
+
value:operation.value];
|
|
869
|
+
// One answer: a failure after this rejects nothing.
|
|
870
|
+
dispatch_block_t completion = operation.completion;
|
|
871
|
+
operation.completion = nil;
|
|
872
|
+
operation.rejection = nil;
|
|
873
|
+
if (completion && operation.isCurrent) {
|
|
874
|
+
completion();
|
|
875
|
+
}
|
|
876
|
+
// The lower new screens make their content now, under the top.
|
|
877
|
+
if (nodes.count > 1) {
|
|
878
|
+
NSRange lower = NSMakeRange(0, nodes.count - 1);
|
|
879
|
+
[_display stackRenderLowerEntries:[nodes subarrayWithRange:lower]];
|
|
880
|
+
}
|
|
881
|
+
[self finish:operation];
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
#pragma mark - The swipe back
|
|
885
|
+
|
|
886
|
+
- (BOOL)swipeBeganFrom:(UIViewController *)top revealing:(UIViewController *)revealed {
|
|
887
|
+
ANNAssertMainQueue();
|
|
888
|
+
if (_current || _destroyed || _shown.lastObject != top ||
|
|
889
|
+
[_shown indexOfObjectIdenticalTo:revealed] == NSNotFound) {
|
|
890
|
+
return NO;
|
|
891
|
+
}
|
|
892
|
+
ANNStackOperation *operation = [self operationOfKind:ANNStackOperationSwipe
|
|
893
|
+
answer:nil
|
|
894
|
+
what:@"go back"
|
|
895
|
+
componentId:nil
|
|
896
|
+
source:nil];
|
|
897
|
+
operation.target = revealed;
|
|
898
|
+
operation.leaving = @[ top ];
|
|
899
|
+
_current = operation;
|
|
900
|
+
// The stack reports the swipe itself, as a command: UIKit's appearance callbacks of the two screens send nothing
|
|
901
|
+
// meanwhile.
|
|
902
|
+
// The lower screens still rendering in the stack's view leave it before UIKit moves the revealed one.
|
|
903
|
+
[_display stackEntriesWillMove];
|
|
904
|
+
[self drive:operation nodes:@[ top, revealed ]];
|
|
905
|
+
ANNRenderIfNeeded(revealed);
|
|
906
|
+
[ANNAppearanceDispatcher beginTransitionShowing:@[ revealed ]];
|
|
907
|
+
[self whenTransitionOf:operation
|
|
908
|
+
ends:^(BOOL cancelled) {
|
|
909
|
+
[self endSwipe:operation cancelled:cancelled];
|
|
910
|
+
}];
|
|
911
|
+
return YES;
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
- (void)endSwipe:(ANNStackOperation *)operation cancelled:(BOOL)cancelled {
|
|
915
|
+
UIViewController *top = operation.leaving.firstObject;
|
|
916
|
+
UIViewController *revealed = operation.target;
|
|
917
|
+
// A cancelled swipe: the screen under goes again; the top never left.
|
|
918
|
+
if (cancelled) {
|
|
919
|
+
[ANNAppearanceDispatcher endTransitionHiding:@[ revealed ]
|
|
920
|
+
showing:@[]
|
|
921
|
+
events:nil
|
|
922
|
+
answer:nil
|
|
923
|
+
value:nil];
|
|
924
|
+
[self finish:operation];
|
|
925
|
+
return;
|
|
926
|
+
}
|
|
927
|
+
[_shown removeObjectIdenticalTo:top];
|
|
928
|
+
// The top and what was accepted over it leave `entries` now: a push from it is interrupted, a command from it or to
|
|
929
|
+
// it rejects in its turn.
|
|
930
|
+
[self removeEntriesFrom:top];
|
|
931
|
+
[ANNComponentViewController nodeWillLeave:top];
|
|
932
|
+
BOOL showing = [_display stackIsOnScreen] && _shown.lastObject == revealed;
|
|
933
|
+
__weak ANNStackQueue *weakSelf = self;
|
|
934
|
+
// No `NavigationButtonPressed` on a finished swipe.
|
|
935
|
+
[ANNAppearanceDispatcher endTransitionHiding:@[ top ]
|
|
936
|
+
showing:showing ? @[ revealed ] : @[]
|
|
937
|
+
events:^{
|
|
938
|
+
[weakSelf poppedEntries:@[ top ] reused:@[]];
|
|
939
|
+
}
|
|
940
|
+
answer:nil
|
|
941
|
+
value:nil];
|
|
942
|
+
[self finish:operation];
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
#pragma mark - UIKit's own changes
|
|
946
|
+
|
|
947
|
+
- (void)uikitShows:(NSArray<UIViewController *> *)viewControllers {
|
|
948
|
+
ANNAssertMainQueue();
|
|
949
|
+
// The queue's own transition reports itself.
|
|
950
|
+
if (_destroyed || (_current && !_current.waiting)) {
|
|
951
|
+
return;
|
|
952
|
+
}
|
|
953
|
+
NSUInteger kept = 0;
|
|
954
|
+
while (kept < _shown.count &&
|
|
955
|
+
[viewControllers indexOfObjectIdenticalTo:_shown[kept]] != NSNotFound) {
|
|
956
|
+
kept++;
|
|
957
|
+
}
|
|
958
|
+
if (kept == _shown.count) {
|
|
959
|
+
return;
|
|
960
|
+
}
|
|
961
|
+
NSRange range = NSMakeRange(kept, _shown.count - kept);
|
|
962
|
+
NSArray<UIViewController *> *gone = ANNTopFirst([_shown subarrayWithRange:range]);
|
|
963
|
+
[_shown removeObjectsInRange:range];
|
|
964
|
+
[self removeEntriesFrom:gone.lastObject];
|
|
965
|
+
for (UIViewController *entry in gone) {
|
|
966
|
+
[ANNComponentViewController nodeWillLeave:entry];
|
|
967
|
+
}
|
|
968
|
+
// UIKit reported the appearance of its own transition; what left gets its `ScreenPopped` and goes.
|
|
969
|
+
__weak ANNStackQueue *weakSelf = self;
|
|
970
|
+
[ANNAppearanceDispatcher endTransitionHiding:gone
|
|
971
|
+
showing:@[]
|
|
972
|
+
events:^{
|
|
973
|
+
[weakSelf poppedEntries:gone reused:@[]];
|
|
974
|
+
}
|
|
975
|
+
answer:nil
|
|
976
|
+
value:nil];
|
|
977
|
+
[_display stackOperationEnded];
|
|
978
|
+
[self scheduleRunNext];
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
// `entry` and everything over it leave `entries`: a push of them is interrupted, a queued command from them or to them
|
|
982
|
+
// rejects in its turn.
|
|
983
|
+
- (void)removeEntriesFrom:(UIViewController *)entry {
|
|
984
|
+
NSUInteger index = entry ? [_entries indexOfObjectIdenticalTo:entry] : NSNotFound;
|
|
985
|
+
if (index == NSNotFound) {
|
|
986
|
+
return;
|
|
987
|
+
}
|
|
988
|
+
NSRange range = NSMakeRange(index, _entries.count - index);
|
|
989
|
+
NSArray<UIViewController *> *removed = [_entries subarrayWithRange:range];
|
|
990
|
+
[_entries removeObjectsInRange:range];
|
|
991
|
+
[self interruptPushesOf:removed];
|
|
992
|
+
for (ANNStackOperation *pending in _pending) {
|
|
993
|
+
UIViewController *source = pending.source;
|
|
994
|
+
UIViewController *target = pending.target;
|
|
995
|
+
if ((source && [removed indexOfObjectIdenticalTo:source] != NSNotFound) ||
|
|
996
|
+
(target && [removed indexOfObjectIdenticalTo:target] != NSNotFound)) {
|
|
997
|
+
pending.sourceGone = YES;
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
#pragma mark - The stack
|
|
1003
|
+
|
|
1004
|
+
- (void)stackWentOffScreen {
|
|
1005
|
+
ANNStackOperation *operation = _current;
|
|
1006
|
+
if (operation.waiting) {
|
|
1007
|
+
// The wait's phase ends without `markReady`: the operation runs as in a stack off screen, and its top appears
|
|
1008
|
+
// when the stack shows.
|
|
1009
|
+
[operation.wait endPhase];
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
- (NSArray<UIViewController *> *)destroyQueue {
|
|
1014
|
+
ANNAssertMainQueue();
|
|
1015
|
+
NSArray<UIViewController *> *nodes = self.heldNodes;
|
|
1016
|
+
_destroyed = YES;
|
|
1017
|
+
_waitingForUIKit = NO;
|
|
1018
|
+
NSMutableArray<ANNStackOperation *> *operations = [_pending mutableCopy];
|
|
1019
|
+
if (_current) {
|
|
1020
|
+
[operations insertObject:_current atIndex:0];
|
|
1021
|
+
}
|
|
1022
|
+
_current = nil;
|
|
1023
|
+
[_pending removeAllObjects];
|
|
1024
|
+
for (ANNStackOperation *operation in operations) {
|
|
1025
|
+
[self endWaitOf:operation];
|
|
1026
|
+
[self unparkOf:operation];
|
|
1027
|
+
[self stopDrivingOf:operation];
|
|
1028
|
+
if (operation.done) {
|
|
1029
|
+
continue;
|
|
1030
|
+
}
|
|
1031
|
+
operation.done = YES;
|
|
1032
|
+
operation.wait.ended = nil;
|
|
1033
|
+
if (operation.isCurrent) {
|
|
1034
|
+
[self answerRejection:operation
|
|
1035
|
+
text:[ANNErrorTexts screenNotShown:operation.componentId ?: @""]];
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
[_entries removeAllObjects];
|
|
1039
|
+
[_shown removeAllObjects];
|
|
1040
|
+
return nodes;
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
#pragma mark - Waits
|
|
1044
|
+
|
|
1045
|
+
// The operation's render wait (`ANNRenderWait`), its token, limits and bar components. With content, the entry waits
|
|
1046
|
+
// for it in the stack's view, its appearance driven: the wait ends at the entry's ready handler (set first, then the
|
|
1047
|
+
// park and `render`, then the test of 16.1), at `limit` with `markReady`, or with `unknownLimit` for a screen whose
|
|
1048
|
+
// rendered state stays unknown after 1 s. Without content, only the bar components, without parking (bar roots render
|
|
1049
|
+
// out of a window). A wait that would end does nothing once its operation ended or belongs to an old JavaScript; its
|
|
1050
|
+
// end runs protected (the end steps of the operation, `then`).
|
|
1051
|
+
- (void)waitFor:(ANNStackOperation *)operation
|
|
1052
|
+
entry:(UIViewController *)entry
|
|
1053
|
+
content:(ANNRenderWaitContent)content
|
|
1054
|
+
limit:(NSTimeInterval)limit
|
|
1055
|
+
unknownLimit:(BOOL)unknownLimit
|
|
1056
|
+
bar:(ANNRenderWaitBar)bar
|
|
1057
|
+
barLimits:(ANNBarWaitLimits)barLimits
|
|
1058
|
+
then:(dispatch_block_t)then {
|
|
1059
|
+
__weak ANNStackQueue *weakSelf = self;
|
|
1060
|
+
__weak ANNStackOperation *weakOperation = operation;
|
|
1061
|
+
// The screens the wait is about are those the entry waits for (a pair: the ones it puts in the window).
|
|
1062
|
+
NSArray<UIViewController *> * (^screens)(void) = ^NSArray<UIViewController *> * {
|
|
1063
|
+
return entry.waitedComponentViewControllers;
|
|
1064
|
+
};
|
|
1065
|
+
ANNRenderWait *wait = [[ANNRenderWait alloc] initWithContent:content
|
|
1066
|
+
node:entry
|
|
1067
|
+
screens:screens
|
|
1068
|
+
limit:limit
|
|
1069
|
+
bar:bar
|
|
1070
|
+
barLimits:barLimits];
|
|
1071
|
+
wait.unknownContentRule = unknownLimit;
|
|
1072
|
+
wait.canEnd = ^BOOL {
|
|
1073
|
+
ANNStackQueue *queue = weakSelf;
|
|
1074
|
+
ANNStackOperation *waiting = weakOperation;
|
|
1075
|
+
return queue && waiting && !waiting.done && waiting.isCurrent && !queue->_destroyed;
|
|
1076
|
+
};
|
|
1077
|
+
wait.protect = ^(dispatch_block_t step) {
|
|
1078
|
+
[weakSelf protect:weakOperation step:step];
|
|
1079
|
+
};
|
|
1080
|
+
wait.ended = then;
|
|
1081
|
+
if (content != ANNRenderWaitContentNone) {
|
|
1082
|
+
wait.setUp = ^{
|
|
1083
|
+
ANNStackQueue *queue = weakSelf;
|
|
1084
|
+
ANNStackOperation *waiting = weakOperation;
|
|
1085
|
+
if (!queue || !waiting) {
|
|
1086
|
+
return;
|
|
1087
|
+
}
|
|
1088
|
+
// A pair is ready once the screens it shows are only when it waits for them.
|
|
1089
|
+
if (![entry isKindOfClass:ANNComponentViewController.class]) {
|
|
1090
|
+
[entry setWaitForRender:YES];
|
|
1091
|
+
}
|
|
1092
|
+
// The place in the window loads the view, which renders a screen nobody rendered. A native screen is ready
|
|
1093
|
+
// inside the load that parking makes: the wait's test after the setup ends its wait.
|
|
1094
|
+
waiting.waited = entry;
|
|
1095
|
+
waiting.parked = YES;
|
|
1096
|
+
[queue->_display stackPark:entry];
|
|
1097
|
+
[entry render];
|
|
1098
|
+
for (ANNComponentViewController *screen in ANNStackScreensOfEntry(entry)) {
|
|
1099
|
+
[screen updateRootLayout];
|
|
1100
|
+
}
|
|
1101
|
+
};
|
|
1102
|
+
}
|
|
1103
|
+
operation.wait = wait;
|
|
1104
|
+
[wait start];
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
- (void)endWaitOf:(ANNStackOperation *)operation {
|
|
1108
|
+
[operation.wait cancel];
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
- (void)unparkOf:(ANNStackOperation *)operation {
|
|
1112
|
+
if (!operation.parked) {
|
|
1113
|
+
return;
|
|
1114
|
+
}
|
|
1115
|
+
operation.parked = NO;
|
|
1116
|
+
[_display stackUnpark:operation.waited];
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
#pragma mark - The end steps
|
|
1120
|
+
|
|
1121
|
+
// From its start to its end a command drives the appearance of the screens it moves: UIKit's callbacks of those screens
|
|
1122
|
+
// send nothing, whenever UIKit calls them against the coordinator's completion.
|
|
1123
|
+
- (void)drive:(ANNStackOperation *)operation nodes:(NSArray<UIViewController *> *)nodes {
|
|
1124
|
+
[self stopDrivingOf:operation];
|
|
1125
|
+
operation.driven = nodes;
|
|
1126
|
+
[ANNAppearanceDispatcher driveAppearanceOf:nodes];
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
- (void)stopDrivingOf:(ANNStackOperation *)operation {
|
|
1130
|
+
NSArray<UIViewController *> *driven = operation.driven;
|
|
1131
|
+
if (driven) {
|
|
1132
|
+
operation.driven = nil;
|
|
1133
|
+
[ANNAppearanceDispatcher stopDrivingAppearanceOf:driven];
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
// The end of the transition, guarded: a completion of an operation that ended already, or of a JavaScript that went,
|
|
1138
|
+
// does nothing (a reload's old stack stays as it is until its destroy).
|
|
1139
|
+
- (void)whenTransitionOf:(ANNStackOperation *)operation ends:(void (^)(BOOL cancelled))ended {
|
|
1140
|
+
__weak ANNStackQueue *weakSelf = self;
|
|
1141
|
+
[_display stackWhenTransitionEnds:^(BOOL cancelled) {
|
|
1142
|
+
ANNStackQueue *queue = weakSelf;
|
|
1143
|
+
if (!queue || operation.done || !operation.isCurrent || queue->_destroyed) {
|
|
1144
|
+
return;
|
|
1145
|
+
}
|
|
1146
|
+
[queue protect:operation
|
|
1147
|
+
step:^{
|
|
1148
|
+
ended(cancelled);
|
|
1149
|
+
}];
|
|
1150
|
+
}];
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
// Every `ScreenPopped` first, then the destroys in the same order: the content of each stops only after all the events.
|
|
1154
|
+
- (void)poppedEntries:(NSArray<UIViewController *> *)popped
|
|
1155
|
+
reused:(NSArray<UIViewController *> *)reused {
|
|
1156
|
+
for (UIViewController *entry in popped) {
|
|
1157
|
+
[ANNAppearanceDispatcher screenPopped:entry];
|
|
1158
|
+
}
|
|
1159
|
+
[self destroyNodes:popped];
|
|
1160
|
+
[self destroyNodes:reused];
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
- (void)destroyNodes:(NSArray<UIViewController *> *)nodes {
|
|
1164
|
+
for (UIViewController *node in nodes) {
|
|
1165
|
+
@try {
|
|
1166
|
+
[node destroy];
|
|
1167
|
+
} @catch (NSException *exception) {
|
|
1168
|
+
RCTLogWarn(@"[ApexNavigation] could not destroy the screen '%@': %@", ANNIdOf(node),
|
|
1169
|
+
exception.reason ?: exception.name);
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
- (void)finish:(ANNStackOperation *)operation {
|
|
1175
|
+
operation.done = YES;
|
|
1176
|
+
operation.wait.ended = nil;
|
|
1177
|
+
[self stopDrivingOf:operation];
|
|
1178
|
+
if (_current == operation) {
|
|
1179
|
+
_current = nil;
|
|
1180
|
+
}
|
|
1181
|
+
@try {
|
|
1182
|
+
[_display stackOperationEnded];
|
|
1183
|
+
} @catch (NSException *exception) {
|
|
1184
|
+
RCTLogWarn(@"[ApexNavigation] %@",
|
|
1185
|
+
[ANNCommandRunner rejectionOf:exception what:@"show the top of the stack"]);
|
|
1186
|
+
}
|
|
1187
|
+
[self scheduleRunNext];
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
#pragma mark - Failures
|
|
1191
|
+
|
|
1192
|
+
// The steps after a command's body run outside the runner's protection: a failure rejects that operation with its error
|
|
1193
|
+
// text, ends what it holds, destroys what it made and never showed, and the queue goes on.
|
|
1194
|
+
- (void)protect:(ANNStackOperation *)operation step:(dispatch_block_t)step {
|
|
1195
|
+
@try {
|
|
1196
|
+
step();
|
|
1197
|
+
} @catch (NSException *exception) {
|
|
1198
|
+
[self operation:operation failed:exception];
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
- (void)operation:(ANNStackOperation *)operation failed:(NSException *)exception {
|
|
1203
|
+
NSString *text = [ANNCommandRunner rejectionOf:exception what:operation.what];
|
|
1204
|
+
if (operation.done) {
|
|
1205
|
+
RCTLogWarn(@"[ApexNavigation] %@", text);
|
|
1206
|
+
return;
|
|
1207
|
+
}
|
|
1208
|
+
[self endWaitOf:operation];
|
|
1209
|
+
[self unparkOf:operation];
|
|
1210
|
+
[self stopDrivingOf:operation];
|
|
1211
|
+
if (operation.answer || operation.rejection) {
|
|
1212
|
+
[self answerRejection:operation text:text];
|
|
1213
|
+
} else {
|
|
1214
|
+
RCTLogWarn(@"[ApexNavigation] %@", text);
|
|
1215
|
+
}
|
|
1216
|
+
[self destroyUnshownNodesOf:operation];
|
|
1217
|
+
[self rebuildEntries];
|
|
1218
|
+
[self finish:operation];
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
// An operation whose screen went before its turn: it rejects with its command's id and destroys silently what it made.
|
|
1222
|
+
- (void)rejectInTurn:(ANNStackOperation *)operation {
|
|
1223
|
+
[self answerRejection:operation
|
|
1224
|
+
text:[ANNErrorTexts screenNotShown:operation.componentId ?: @""]];
|
|
1225
|
+
[self destroyUnshownNodesOf:operation];
|
|
1226
|
+
[self rebuildEntries];
|
|
1227
|
+
[self finish:operation];
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
- (void)reject:(ANNStackOperation *)operation text:(NSString *)text {
|
|
1231
|
+
operation.done = YES;
|
|
1232
|
+
[self answerRejection:operation text:text];
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
- (void)answerRejection:(ANNStackOperation *)operation text:(NSString *)text {
|
|
1236
|
+
if (operation.answer) {
|
|
1237
|
+
[operation.answer reject:text];
|
|
1238
|
+
return;
|
|
1239
|
+
}
|
|
1240
|
+
ANNTransitionRejectionBlock rejection = operation.rejection;
|
|
1241
|
+
operation.rejection = nil;
|
|
1242
|
+
operation.completion = nil;
|
|
1243
|
+
if (rejection && operation.isCurrent) {
|
|
1244
|
+
rejection(text, nil);
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
|
|
1248
|
+
- (void)destroyUnshownNodesOf:(ANNStackOperation *)operation {
|
|
1249
|
+
NSMutableArray<UIViewController *> *made = [NSMutableArray new];
|
|
1250
|
+
if (operation.kind == ANNStackOperationPush && operation.node) {
|
|
1251
|
+
[made addObject:operation.node];
|
|
1252
|
+
} else if (operation.kind == ANNStackOperationReplace && operation.nodes) {
|
|
1253
|
+
[made addObjectsFromArray:operation.nodes];
|
|
1254
|
+
}
|
|
1255
|
+
// A cut or a replace that failed after it took entries off what shows leaves them in no list: they go too.
|
|
1256
|
+
for (UIViewController *entry in operation.leaving ?: @[]) {
|
|
1257
|
+
if ([_entries indexOfObjectIdenticalTo:entry] == NSNotFound) {
|
|
1258
|
+
[made addObject:entry];
|
|
1259
|
+
}
|
|
1260
|
+
}
|
|
1261
|
+
NSMutableArray<UIViewController *> *unshown = [NSMutableArray new];
|
|
1262
|
+
for (UIViewController *node in made) {
|
|
1263
|
+
if ([_shown indexOfObjectIdenticalTo:node] == NSNotFound &&
|
|
1264
|
+
[unshown indexOfObjectIdenticalTo:node] == NSNotFound) {
|
|
1265
|
+
[unshown addObject:node];
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
operation.leaving = nil;
|
|
1269
|
+
[self destroyNodes:unshown];
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
// `entries` after an operation that failed: what shows, with what the queued operations accepted over it.
|
|
1273
|
+
- (void)rebuildEntries {
|
|
1274
|
+
NSMutableArray<UIViewController *> *rebuilt = [_shown mutableCopy];
|
|
1275
|
+
for (ANNStackOperation *operation in _pending) {
|
|
1276
|
+
switch (operation.kind) {
|
|
1277
|
+
case ANNStackOperationPush:
|
|
1278
|
+
if (operation.node) {
|
|
1279
|
+
[rebuilt addObject:operation.node];
|
|
1280
|
+
}
|
|
1281
|
+
break;
|
|
1282
|
+
case ANNStackOperationReplace:
|
|
1283
|
+
[rebuilt setArray:operation.nodes ?: @[]];
|
|
1284
|
+
break;
|
|
1285
|
+
case ANNStackOperationCut: {
|
|
1286
|
+
NSUInteger index = [rebuilt indexOfObjectIdenticalTo:operation.target];
|
|
1287
|
+
if (index != NSNotFound) {
|
|
1288
|
+
NSRange above = NSMakeRange(index + 1, rebuilt.count - index - 1);
|
|
1289
|
+
[rebuilt removeObjectsInRange:above];
|
|
1290
|
+
}
|
|
1291
|
+
break;
|
|
1292
|
+
}
|
|
1293
|
+
default:
|
|
1294
|
+
break;
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
[_entries setArray:rebuilt];
|
|
1298
|
+
}
|
|
1299
|
+
|
|
1300
|
+
@end
|