@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,1597 @@
|
|
|
1
|
+
#import "ANNStackController.h"
|
|
2
|
+
#import "ANNAnimationRules.h"
|
|
3
|
+
#import "ANNAppDirection.h"
|
|
4
|
+
#import "ANNAppearanceDispatcher.h"
|
|
5
|
+
#import "ANNAssert.h"
|
|
6
|
+
#import "ANNComponentViewController.h"
|
|
7
|
+
#import "ANNElementFinder.h"
|
|
8
|
+
#import "ANNErrorTexts.h"
|
|
9
|
+
#import "ANNParking.h"
|
|
10
|
+
#import "ANNPendingLayers.h"
|
|
11
|
+
#import "ANNScreenBars.h"
|
|
12
|
+
#import "ANNSheetPresenter.h"
|
|
13
|
+
#import "ANNShownScreens.h"
|
|
14
|
+
#import "ANNStackAnimatingDelegate.h"
|
|
15
|
+
#import "ANNStackPresenter.h"
|
|
16
|
+
#import "ANNSystemUI.h"
|
|
17
|
+
#import "ANNTopBarPresenter.h"
|
|
18
|
+
#import "ANNTransitionAnimator.h"
|
|
19
|
+
#import "ANNTransitionPlan.h"
|
|
20
|
+
#import "ANNZoomAnchor.h"
|
|
21
|
+
#import "InteractivePopGestureDelegate.h"
|
|
22
|
+
#import <React/RCTLog.h>
|
|
23
|
+
#import <React/RCTUtils.h>
|
|
24
|
+
|
|
25
|
+
NSString *const ANNBackButtonDefaultId = @"ApexNavigation.back";
|
|
26
|
+
|
|
27
|
+
// How long a lower screen renders in the stack's view before it leaves it anyway; it waits for nobody.
|
|
28
|
+
static const NSTimeInterval ANNLowerScreenRenderLimit = 0.5;
|
|
29
|
+
|
|
30
|
+
// How many times the delegate's recompute at the end of an operation waits for a transition that still runs.
|
|
31
|
+
static const NSUInteger ANNGateRecomputeTries = 8;
|
|
32
|
+
|
|
33
|
+
// The ready handler key of a lower screen's render.
|
|
34
|
+
static NSString *const ANNLowerRenderReadyKey = @"ApexNavigation.lowerRender";
|
|
35
|
+
|
|
36
|
+
NSString *ANNStackKeyOfLayout(ANNLayoutNode *node) {
|
|
37
|
+
if (node.key.length > 0) {
|
|
38
|
+
return node.key;
|
|
39
|
+
}
|
|
40
|
+
if (node.type == ANNLayoutTypeArrangement) {
|
|
41
|
+
NSString *primaryKey = node.children.firstObject.key;
|
|
42
|
+
return primaryKey.length > 0 ? primaryKey : nil;
|
|
43
|
+
}
|
|
44
|
+
return nil;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// UIKit's navigation controller answers its bar as its delegate without saying so in its header: this makes its
|
|
48
|
+
// answer reachable from the stack's own.
|
|
49
|
+
@interface UINavigationController (ANNNavigationBarDelegate) <UINavigationBarDelegate>
|
|
50
|
+
@end
|
|
51
|
+
|
|
52
|
+
static BOOL ANNIsActive(UIGestureRecognizer *recognizer) {
|
|
53
|
+
UIGestureRecognizerState state = recognizer.state;
|
|
54
|
+
return state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@interface ANNStackController () <ANNStackDisplay, ANNStackAnimating>
|
|
58
|
+
@end
|
|
59
|
+
|
|
60
|
+
@implementation ANNStackController {
|
|
61
|
+
NSMapTable<UIViewController *, NSString *> *_keys;
|
|
62
|
+
// The views that wait in the stack's view (a push or a `setStackRoot` that waits, a lower screen that renders).
|
|
63
|
+
ANNParking *_parking;
|
|
64
|
+
// The lower screens to render once the stack shows, and those rendering now, each with its number.
|
|
65
|
+
NSMutableArray<UIViewController *> *_lowerToRender;
|
|
66
|
+
NSMapTable<UIViewController *, NSNumber *> *_lowerRendering;
|
|
67
|
+
NSUInteger _lowerNumber;
|
|
68
|
+
// The core's own calls to UIKit run: UIKit's calls into the overrides pass then.
|
|
69
|
+
NSInteger _coreCalls;
|
|
70
|
+
InteractivePopGestureDelegate *_edgeSwipeDelegate;
|
|
71
|
+
InteractivePopGestureDelegate *_contentSwipeDelegate;
|
|
72
|
+
// The delegates of UIKit's More navigation's swipes while it shows the stack's screens.
|
|
73
|
+
InteractivePopGestureDelegate *_moreEdgeSwipeDelegate;
|
|
74
|
+
InteractivePopGestureDelegate *_moreContentSwipeDelegate;
|
|
75
|
+
__weak UITouch *_swipeTouch;
|
|
76
|
+
__weak UITouch *_heldTouch;
|
|
77
|
+
__weak UIViewController *_lastTop;
|
|
78
|
+
// The UIKit transition the stack already took as the swipe or follows as one of UIKit's own.
|
|
79
|
+
__weak id<UIViewControllerTransitionCoordinator> _seenTransition;
|
|
80
|
+
// The screen the visibilities of the bars were last set for (the shared part of the bar).
|
|
81
|
+
__weak UIViewController *_sharedBarScreen;
|
|
82
|
+
// The lower screens whose render is being set up: a ready callback inside the setup waits for its end.
|
|
83
|
+
NSHashTable<UIViewController *> *_lowerSettingUp;
|
|
84
|
+
// UIKit's More navigation that showed the stack's screens last (the tab open from More).
|
|
85
|
+
__weak UINavigationController *_moreNavigation;
|
|
86
|
+
// The delegate that also offers UIKit a transition object, set only while a custom animation may be needed; the
|
|
87
|
+
// queue's plan of the change UIKit starts next, until UIKit asks or the operation ends; the custom transition that
|
|
88
|
+
// runs.
|
|
89
|
+
ANNStackAnimatingDelegate *_animatingDelegate;
|
|
90
|
+
ANNTransitionPlan *_pendingPlan;
|
|
91
|
+
ANNStackChange _pendingChange;
|
|
92
|
+
__weak ANNTransitionAnimator *_runningAnimator;
|
|
93
|
+
BOOL _gateUpdateScheduled;
|
|
94
|
+
// The stack is made (its helper set up): its options can be resolved.
|
|
95
|
+
BOOL _madeUp;
|
|
96
|
+
// The direction the last push forced on the stack's view and bar, for a view that loads later.
|
|
97
|
+
UISemanticContentAttribute _forcedDirection;
|
|
98
|
+
// Whether the bar was hidden at the last layout: UIKit's own hides don't go through the setter (F6).
|
|
99
|
+
BOOL _barSeenHidden;
|
|
100
|
+
// The navigation whose bar the stack hid for the keyboard (`topBar.hideOnKeyboard`), until the keyboard closes.
|
|
101
|
+
__weak UINavigationController *_keyboardHidBarOf;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
- (instancetype)initWithLayoutInfo:(ANNLayoutInfo *)layoutInfo
|
|
105
|
+
creator:(id<ANNComponentViewCreator>)creator
|
|
106
|
+
options:(ANNNavigationOptions *)options
|
|
107
|
+
defaultOptions:(ANNNavigationOptions *)defaultOptions
|
|
108
|
+
presenter:(ANNNodePresenter *)presenter
|
|
109
|
+
eventEmitter:(ANNEventEmitter *)eventEmitter
|
|
110
|
+
childViewControllers:(NSArray<UIViewController *> *)childViewControllers {
|
|
111
|
+
self = [super initWithNibName:nil bundle:nil];
|
|
112
|
+
if (self) {
|
|
113
|
+
_queue = [[ANNStackQueue alloc] initWithDisplay:self];
|
|
114
|
+
_keys = [NSMapTable weakToStrongObjectsMapTable];
|
|
115
|
+
_parking = [ANNParking new];
|
|
116
|
+
_lowerToRender = [NSMutableArray new];
|
|
117
|
+
_lowerRendering = [NSMapTable strongToStrongObjectsMapTable];
|
|
118
|
+
_lowerSettingUp = [NSHashTable weakObjectsHashTable];
|
|
119
|
+
// The stack is its own delegate, without the choice of an animation (the content swipe works); the animating
|
|
120
|
+
// delegate takes its place only while a custom animation may be needed (`updateAnimationGateWith:`).
|
|
121
|
+
_animatingDelegate = [[ANNStackAnimatingDelegate alloc] initWithStack:self];
|
|
122
|
+
self.delegate = self;
|
|
123
|
+
// `topBar.hideOnKeyboard`: the stack hides the bar as the keyboard shows and shows it again once it closed.
|
|
124
|
+
[NSNotificationCenter.defaultCenter addObserver:self
|
|
125
|
+
selector:@selector(keyboardWillShow:)
|
|
126
|
+
name:UIKeyboardWillShowNotification
|
|
127
|
+
object:nil];
|
|
128
|
+
[NSNotificationCenter.defaultCenter addObserver:self
|
|
129
|
+
selector:@selector(keyboardDidHide:)
|
|
130
|
+
name:UIKeyboardDidHideNotification
|
|
131
|
+
object:nil];
|
|
132
|
+
NSArray<UIViewController *> *entries = childViewControllers ?: @[];
|
|
133
|
+
if (entries.count > 0) {
|
|
134
|
+
[_queue setInitialEntries:entries];
|
|
135
|
+
[self stackChange:ANNStackChangeReplace toEntries:entries animated:NO plan:nil];
|
|
136
|
+
for (NSUInteger index = 0; index < entries.count; index++) {
|
|
137
|
+
[self stackEntryJoins:entries[index] first:index == 0];
|
|
138
|
+
}
|
|
139
|
+
// The top renders first and decides the readiness; the screens under it once it showed.
|
|
140
|
+
[_lowerToRender
|
|
141
|
+
addObjectsFromArray:[entries subarrayWithRange:NSMakeRange(0, entries.count - 1)]];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
[self.nodeHelper setUpWithLayoutInfo:layoutInfo
|
|
145
|
+
creator:creator
|
|
146
|
+
options:options
|
|
147
|
+
defaultOptions:defaultOptions
|
|
148
|
+
presenter:presenter
|
|
149
|
+
eventEmitter:eventEmitter];
|
|
150
|
+
_madeUp = YES;
|
|
151
|
+
return self;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
#pragma mark - The view
|
|
155
|
+
|
|
156
|
+
- (void)viewDidLoad {
|
|
157
|
+
[super viewDidLoad];
|
|
158
|
+
// A push forced the direction before the view loaded: the view takes it now.
|
|
159
|
+
if (_forcedDirection != UISemanticContentAttributeUnspecified) {
|
|
160
|
+
self.view.semanticContentAttribute = _forcedDirection;
|
|
161
|
+
}
|
|
162
|
+
[self installSwipeBackDelegates];
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// The bar shown or hidden by UIKit itself (`hidesBarsOnSwipe`, `hidesBarsOnTap`, the keyboard) lays the stack out
|
|
166
|
+
// again: the status bar of `hideWithTopBar` is asked again. UIKit's More navigation is not watched.
|
|
167
|
+
- (void)viewDidLayoutSubviews {
|
|
168
|
+
[super viewDidLayoutSubviews];
|
|
169
|
+
BOOL hidden = [ANNSystemUI barHiddenOf:self];
|
|
170
|
+
if (hidden != _barSeenHidden) {
|
|
171
|
+
_barSeenHidden = hidden;
|
|
172
|
+
[ANNSystemUI setNeedsUpdateOfGroups:ANNSystemUIGroupStatusBar];
|
|
173
|
+
}
|
|
174
|
+
[self swipeBackFollowsBar];
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Every explicit show or hide of the bar (the core's, the keyboard's return, an app's): the status bar of
|
|
178
|
+
// `hideWithTopBar` is asked again.
|
|
179
|
+
- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated {
|
|
180
|
+
BOOL changed = hidden != self.navigationBarHidden;
|
|
181
|
+
[super setNavigationBarHidden:hidden animated:animated];
|
|
182
|
+
if (changed) {
|
|
183
|
+
[ANNSystemUI setNeedsUpdateOfGroups:ANNSystemUIGroupStatusBar];
|
|
184
|
+
}
|
|
185
|
+
[self swipeBackFollowsBar];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
- (void)viewWillAppear:(BOOL)animated {
|
|
189
|
+
[super viewWillAppear:animated];
|
|
190
|
+
[self installSwipeBackDelegates];
|
|
191
|
+
// The first top's own `animations.pop`: the delegate is right before the stack first shows.
|
|
192
|
+
[self updateAnimationGateAfterMerge];
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// The top showed: the lower screens of a stack made with several make their content now.
|
|
196
|
+
- (void)viewDidAppear:(BOOL)animated {
|
|
197
|
+
[super viewDidAppear:animated];
|
|
198
|
+
// A stack off screen at a change of the scene's direction takes the new swipe edge as it shows.
|
|
199
|
+
if ([ANNAppDirection navigationMissedSceneDirection:self]) {
|
|
200
|
+
[self dropForcedDirection];
|
|
201
|
+
}
|
|
202
|
+
[self renderLowerEntriesWhenShown];
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// A root's `viewDidAppear:` comes as the window takes it, while the root's transition still drives it (the dissolve):
|
|
206
|
+
// the top's `DidAppear` comes at that transition's end, and the lower screens after it.
|
|
207
|
+
- (void)renderLowerEntriesWhenShown {
|
|
208
|
+
if (_lowerToRender.count == 0 || self.nodeHelper.destroyed || !self.viewIfLoaded.window) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (![ANNAppearanceDispatcher isAppearanceDriven:self]) {
|
|
212
|
+
[self renderLowerEntriesNow];
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
__weak ANNStackController *weakSelf = self;
|
|
216
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)),
|
|
217
|
+
dispatch_get_main_queue(), ^{
|
|
218
|
+
[weakSelf renderLowerEntriesWhenShown];
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// The stack left the screen (its tab, a full-screen modal over it): what waits for its screen runs now. Not when it
|
|
223
|
+
// goes with its container (a new root, a modal dismissed): its destroy rejects what waits then.
|
|
224
|
+
- (void)viewDidDisappear:(BOOL)animated {
|
|
225
|
+
[super viewDidDisappear:animated];
|
|
226
|
+
if (![self goesWithItsContainer]) {
|
|
227
|
+
[_queue stackWentOffScreen];
|
|
228
|
+
// The tabs check the tab's `popToRootOnBlur` (disappeared and no longer selected).
|
|
229
|
+
UIViewController *parent = self.layoutParent;
|
|
230
|
+
if ([parent respondsToSelector:@selector(childDidDisappear:)]) {
|
|
231
|
+
[(id<ANNLayoutProtocol>)parent childDidDisappear:self];
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
- (BOOL)goesWithItsContainer {
|
|
237
|
+
if ([ANNAppearanceDispatcher isAppearanceDriven:self]) {
|
|
238
|
+
return YES;
|
|
239
|
+
}
|
|
240
|
+
for (UIViewController *node = self; node; node = node.parentViewController) {
|
|
241
|
+
if (node.isBeingDismissed || node.isMovingFromParentViewController) {
|
|
242
|
+
return YES;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return NO;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Each swipe back gets the stack's delegate over UIKit's, with the bars' swipe waiting for it.
|
|
249
|
+
- (void)installSwipeBackDelegates {
|
|
250
|
+
UIGestureRecognizer *barSwipe = self.barHideOnSwipeGestureRecognizer;
|
|
251
|
+
UIGestureRecognizer *edge = self.interactivePopGestureRecognizer;
|
|
252
|
+
_edgeSwipeDelegate = [InteractivePopGestureDelegate installOn:edge
|
|
253
|
+
stack:self
|
|
254
|
+
content:NO
|
|
255
|
+
barSwipe:barSwipe];
|
|
256
|
+
if (@available(iOS 26.0, *)) {
|
|
257
|
+
UIGestureRecognizer *content = self.interactiveContentPopGestureRecognizer;
|
|
258
|
+
_contentSwipeDelegate = [InteractivePopGestureDelegate installOn:content
|
|
259
|
+
stack:self
|
|
260
|
+
content:YES
|
|
261
|
+
barSwipe:barSwipe];
|
|
262
|
+
}
|
|
263
|
+
[self updateSwipeBack];
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// UIKit's More navigation shows the stack's screens: its swipes take the stack's `popGesture` and hold, and its bars'
|
|
267
|
+
// swipe waits for them, as on the stack's own navigation.
|
|
268
|
+
- (void)installSwipeBackDelegatesOn:(UINavigationController *)moreNavigation {
|
|
269
|
+
UIGestureRecognizer *barSwipe = moreNavigation.barHideOnSwipeGestureRecognizer;
|
|
270
|
+
UIGestureRecognizer *edge = moreNavigation.interactivePopGestureRecognizer;
|
|
271
|
+
_moreEdgeSwipeDelegate = [InteractivePopGestureDelegate installOn:edge
|
|
272
|
+
stack:self
|
|
273
|
+
content:NO
|
|
274
|
+
barSwipe:barSwipe];
|
|
275
|
+
if (@available(iOS 26.0, *)) {
|
|
276
|
+
UIGestureRecognizer *content = moreNavigation.interactiveContentPopGestureRecognizer;
|
|
277
|
+
_moreContentSwipeDelegate = [InteractivePopGestureDelegate installOn:content
|
|
278
|
+
stack:self
|
|
279
|
+
content:YES
|
|
280
|
+
barSwipe:barSwipe];
|
|
281
|
+
}
|
|
282
|
+
[self updateSwipeBack];
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
#pragma mark - Entries and keys
|
|
286
|
+
|
|
287
|
+
- (UIViewController *)entryOf:(UIViewController *)node {
|
|
288
|
+
for (UIViewController *entry = node; entry; entry = entry.layoutParent) {
|
|
289
|
+
if (entry.layoutParent == self) {
|
|
290
|
+
return entry;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return nil;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
- (void)setKey:(NSString *)key ofEntry:(UIViewController *)entry {
|
|
297
|
+
if (key.length > 0) {
|
|
298
|
+
[_keys setObject:key forKey:entry];
|
|
299
|
+
} else {
|
|
300
|
+
[_keys removeObjectForKey:entry];
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
- (UIViewController *)entryWithKey:(NSString *)key {
|
|
305
|
+
for (UIViewController *entry in _queue.entries.reverseObjectEnumerator) {
|
|
306
|
+
if ([[_keys objectForKey:entry] isEqualToString:key]) {
|
|
307
|
+
return entry;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return nil;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
#pragma mark - ANNLayoutProtocol
|
|
314
|
+
|
|
315
|
+
// The top of what shows: a screen that waits for its render isn't the current child yet. Safe before the queue exists
|
|
316
|
+
// (the helper's setup asks it during init).
|
|
317
|
+
- (UIViewController *)getCurrentChild {
|
|
318
|
+
return _queue.shown.lastObject;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
- (NSArray<UIViewController *> *)layoutChildren {
|
|
322
|
+
return _queue.heldNodes ?: @[];
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// The top renders; the screens under it make their content once it showed. It takes no ready callback: the waits of a
|
|
326
|
+
// root and of a modal wait on the screens it shows.
|
|
327
|
+
- (void)render {
|
|
328
|
+
[[self getCurrentChild] render];
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
- (UIViewController *)systemUIChild {
|
|
332
|
+
return [self getCurrentChild];
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// UIKit doesn't pass the deferred edges from a stack to its screen: the stack does.
|
|
336
|
+
- (UIViewController *)childViewControllerForScreenEdgesDeferringSystemGestures {
|
|
337
|
+
UIViewController *top = [self getCurrentChild];
|
|
338
|
+
return top ?: [super childViewControllerForScreenEdgesDeferringSystemGestures];
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// The stack gives the status bar's questions to the screen on top, not to its bar's style (`statusBar.style`): UIKit's
|
|
342
|
+
// top when it is the stack's own, so that the status bar follows the screen a swipe back reveals along the swipe; else
|
|
343
|
+
// the stack's current child. The home indicator and the vertical bars UIKit passes itself (F13).
|
|
344
|
+
- (nullable UIViewController *)statusBarChild {
|
|
345
|
+
UIViewController *top = self.topViewController;
|
|
346
|
+
if (top && [self isOwnViewController:top]) {
|
|
347
|
+
return top;
|
|
348
|
+
}
|
|
349
|
+
return [self systemUIChild];
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
- (UIViewController *)childViewControllerForStatusBarStyle {
|
|
353
|
+
return [self statusBarChild];
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
- (UIViewController *)childViewControllerForStatusBarHidden {
|
|
357
|
+
return [self statusBarChild];
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// UIKit's navigation controller doesn't ask its top for the orientations (F3): the stack answers what its top
|
|
361
|
+
// answers, and its own resolved options while it has none.
|
|
362
|
+
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
|
|
363
|
+
UIViewController *child = [self statusBarChild];
|
|
364
|
+
if (child) {
|
|
365
|
+
return child.supportedInterfaceOrientations;
|
|
366
|
+
}
|
|
367
|
+
ANNNodePresenter *presenter = self.presenter;
|
|
368
|
+
if (presenter && _madeUp) {
|
|
369
|
+
return [presenter supportedOrientationsForOptions:[self resolveOptionsWithDefault]];
|
|
370
|
+
}
|
|
371
|
+
return [super supportedInterfaceOrientations];
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// The stack's own merge: its options, what it shows (the swipes, the screens' frames when a bar rule changed), then its
|
|
375
|
+
// parent without the groups the stack keeps.
|
|
376
|
+
- (void)mergeOptions:(ANNNavigationOptions *)options {
|
|
377
|
+
[self.nodeHelper mergeOwnOptions:options];
|
|
378
|
+
[self.presenter mergeOptions:options resolvedOptions:[self resolveOptionsWithDefault]];
|
|
379
|
+
if (ANNOptionsChangeScreenBars(options)) {
|
|
380
|
+
for (UIViewController *entry in _queue.shown) {
|
|
381
|
+
[self updateRootLayoutOf:entry];
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
// The top's `animations.pop` may change with the stack's options.
|
|
385
|
+
if (options.animations.hasValue) {
|
|
386
|
+
[self updateAnimationGateAfterMerge];
|
|
387
|
+
}
|
|
388
|
+
[self.layoutParent mergeChildOptions:[self optionsForParent:options] child:self];
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// Only the top's merge reaches what the stack shows; every merge goes on up without the bar, the stack's animations and
|
|
392
|
+
// the FAB, which the stack takes from its top and doesn't pass on.
|
|
393
|
+
- (void)mergeChildOptions:(ANNNavigationOptions *)options child:(UIViewController *)child {
|
|
394
|
+
UIViewController *top = [self getCurrentChild];
|
|
395
|
+
if (top && (child == top || child == ANNStackOptionsScreen(top))) {
|
|
396
|
+
if (options.popGesture.hasValue) {
|
|
397
|
+
[self updateSwipeBack];
|
|
398
|
+
}
|
|
399
|
+
// The top's own item took its part of the merge; the parts the stack shares follow the top's resolved options
|
|
400
|
+
// now, the visibilities only when the merge names them, and the screens lay out again when a bar showed or
|
|
401
|
+
// hid (correction 8).
|
|
402
|
+
[self applySharedBarAnimated:YES visibility:ANNSharedBarVisibilityOfMerge(options)];
|
|
403
|
+
if (options.animations.hasValue) {
|
|
404
|
+
[self updateAnimationGateAfterMerge];
|
|
405
|
+
}
|
|
406
|
+
// The stack's view takes the top's `layout.backgroundColor` over its own.
|
|
407
|
+
if (options.layout.backgroundColor.hasValue) {
|
|
408
|
+
[self applyBackground];
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
[self.layoutParent mergeChildOptions:[self optionsForParent:options] child:self];
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
- (void)applyBackground {
|
|
415
|
+
ANNNodePresenter *presenter = self.presenter;
|
|
416
|
+
if ([presenter isKindOfClass:ANNStackPresenter.class]) {
|
|
417
|
+
[(ANNStackPresenter *)presenter applyBackground:[self resolveOptionsWithDefault]];
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
- (ANNNavigationOptions *)optionsForParent:(ANNNavigationOptions *)options {
|
|
422
|
+
ANNNavigationOptions *up = [options copy];
|
|
423
|
+
up.topBar = [ANNTopBarOptions new];
|
|
424
|
+
up.animations = [ANNAnimationOptions new];
|
|
425
|
+
up.fab = [ANNFabOptions new];
|
|
426
|
+
return up;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// Once: the queue's waiting, running and queued commands reject, nothing waits any more, every node the stack holds is
|
|
430
|
+
// destroyed. A coordinator's completion that comes later finds its operation ended.
|
|
431
|
+
- (void)destroy {
|
|
432
|
+
if (![self.nodeHelper markDestroyed]) {
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
_pendingPlan = nil;
|
|
436
|
+
[self stopLowerRendering];
|
|
437
|
+
NSArray<UIViewController *> *nodes = [_queue destroyQueue];
|
|
438
|
+
// A custom transition running now ends at its end state and completes, so that UIKit isn't left half way (8); the
|
|
439
|
+
// queue is gone first, so its end steps don't run.
|
|
440
|
+
[_runningAnimator cancel];
|
|
441
|
+
for (UIViewController *entry in [self parkedEntries]) {
|
|
442
|
+
[self stackUnpark:entry];
|
|
443
|
+
}
|
|
444
|
+
[self.nodeHelper unregisterNode];
|
|
445
|
+
for (UIViewController *node in nodes) {
|
|
446
|
+
@try {
|
|
447
|
+
[node destroy];
|
|
448
|
+
} @catch (NSException *exception) {
|
|
449
|
+
RCTLogWarn(@"[ApexNavigation] could not destroy the screen '%@': %@",
|
|
450
|
+
node.layoutInfo.componentId ?: @"", exception.reason ?: exception.name);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
#pragma mark - The user's back
|
|
456
|
+
|
|
457
|
+
- (void)userGoBackTo:(UIViewController *)target {
|
|
458
|
+
ANNAssertMainQueue();
|
|
459
|
+
if (self.nodeHelper.destroyed || !self.eventEmitter.isCurrent) {
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
NSArray<UIViewController *> *entries = _queue.entries;
|
|
463
|
+
// One entry (a waiting `setStackRoot` put one screen): the user's back does nothing here (C2).
|
|
464
|
+
if (entries.count < 2) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
UIViewController *to = target ?: entries[entries.count - 2];
|
|
468
|
+
if ([entries indexOfObjectIdenticalTo:to] == NSNotFound || to == entries.lastObject) {
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
if ([self sendHoldEvent]) {
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
[_queue cutTo:to answer:nil value:nil what:@"go back" componentId:nil source:nil silent:NO];
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
- (void)userPopToRoot {
|
|
478
|
+
[self userGoBackTo:_queue.entries.firstObject];
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
- (void)popToRootSilently {
|
|
482
|
+
ANNAssertMainQueue();
|
|
483
|
+
NSArray<UIViewController *> *entries = _queue.entries;
|
|
484
|
+
if (self.nodeHelper.destroyed || entries.count < 2) {
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
[_queue cutTo:entries.firstObject
|
|
488
|
+
answer:nil
|
|
489
|
+
value:nil
|
|
490
|
+
what:@"go back"
|
|
491
|
+
componentId:nil
|
|
492
|
+
source:nil
|
|
493
|
+
silent:YES];
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// The hold: read at the attempt from the screen the user sees, with the options of the stack and the defaults; its
|
|
497
|
+
// event has the back button's own id or `ApexNavigation.back`.
|
|
498
|
+
- (BOOL)sendHoldEvent {
|
|
499
|
+
UIViewController *top = [self getCurrentChild];
|
|
500
|
+
if (!top) {
|
|
501
|
+
return NO;
|
|
502
|
+
}
|
|
503
|
+
UIViewController *screen = ANNStackOptionsScreen(top);
|
|
504
|
+
ANNTopBarBackButtonOptions *backButton = [screen resolveOptionsWithDefault].topBar.backButton;
|
|
505
|
+
if ([backButton.popStackOnPress withDefault:YES]) {
|
|
506
|
+
return NO;
|
|
507
|
+
}
|
|
508
|
+
NSString *buttonId = [backButton.identifier withDefault:nil];
|
|
509
|
+
if (buttonId.length == 0) {
|
|
510
|
+
buttonId = ANNBackButtonDefaultId;
|
|
511
|
+
}
|
|
512
|
+
NSString *componentId = screen.layoutInfo.componentId;
|
|
513
|
+
if (componentId) {
|
|
514
|
+
[screen.eventEmitter sendOnNavigationButtonPressed:componentId buttonId:buttonId];
|
|
515
|
+
}
|
|
516
|
+
return YES;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
#pragma mark - UIKit's pops into the stack
|
|
520
|
+
|
|
521
|
+
- (BOOL)isSwipingBack {
|
|
522
|
+
UINavigationController *navigation = self.shownNavigationController;
|
|
523
|
+
if (ANNIsActive(navigation.interactivePopGestureRecognizer)) {
|
|
524
|
+
return YES;
|
|
525
|
+
}
|
|
526
|
+
if (@available(iOS 26.0, *)) {
|
|
527
|
+
if (ANNIsActive(navigation.interactiveContentPopGestureRecognizer)) {
|
|
528
|
+
return YES;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
return NO;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// A pop UIKit asks for itself (the history menu, the tab bar's second tap) whose removed view controllers are all
|
|
535
|
+
// entries of this stack is the user's back; the swipe UIKit runs and anything else (UIKit's split view moving its
|
|
536
|
+
// navigation controllers) go to UIKit unchanged.
|
|
537
|
+
- (BOOL)takesUIKitPopTo:(UIViewController *)target {
|
|
538
|
+
if (_coreCalls > 0 || [self isSwipingBack] || [self stackRunningTransition]) {
|
|
539
|
+
return NO;
|
|
540
|
+
}
|
|
541
|
+
NSArray<UIViewController *> *viewControllers = self.viewControllers;
|
|
542
|
+
NSArray<UIViewController *> *shown = _queue.shown;
|
|
543
|
+
NSUInteger index = [viewControllers indexOfObjectIdenticalTo:target];
|
|
544
|
+
if (index == NSNotFound || index + 1 >= viewControllers.count) {
|
|
545
|
+
return NO;
|
|
546
|
+
}
|
|
547
|
+
for (NSUInteger at = index; at < viewControllers.count; at++) {
|
|
548
|
+
if ([shown indexOfObjectIdenticalTo:viewControllers[at]] == NSNotFound) {
|
|
549
|
+
return NO;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
[self userGoBackTo:target];
|
|
553
|
+
return YES;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
// UIKit's interactive pop of the swipe comes here, at moments the gesture's state doesn't tell (the simulator showed a
|
|
557
|
+
// cancelled swipe taken as a back): `popViewControllerAnimated:` always goes to UIKit. An interactive transition it
|
|
558
|
+
// starts is the swipe; anything else is a pop of UIKit's own the stack follows (`followUIKitTransition`). The back
|
|
559
|
+
// button reaches the stack through `backAction` (iOS 16+) and `navigationBar:shouldPopItem:` (iOS 15), the history
|
|
560
|
+
// menu through `popToViewController:animated:`.
|
|
561
|
+
- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
|
|
562
|
+
UIViewController *popped = [super popViewControllerAnimated:animated];
|
|
563
|
+
if (_coreCalls == 0) {
|
|
564
|
+
[self followUIKitTransition];
|
|
565
|
+
}
|
|
566
|
+
return popped;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
- (NSArray<UIViewController *> *)popToViewController:(UIViewController *)viewController
|
|
570
|
+
animated:(BOOL)animated {
|
|
571
|
+
if ([self takesUIKitPopTo:viewController]) {
|
|
572
|
+
return nil;
|
|
573
|
+
}
|
|
574
|
+
NSArray<UIViewController *> *popped = [super popToViewController:viewController
|
|
575
|
+
animated:animated];
|
|
576
|
+
if (_coreCalls == 0) {
|
|
577
|
+
[self followUIKitTransition];
|
|
578
|
+
}
|
|
579
|
+
return popped;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
- (NSArray<UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated {
|
|
583
|
+
NSArray<UIViewController *> *viewControllers = self.viewControllers;
|
|
584
|
+
if (viewControllers.count >= 2 && [self takesUIKitPopTo:viewControllers.firstObject]) {
|
|
585
|
+
return nil;
|
|
586
|
+
}
|
|
587
|
+
NSArray<UIViewController *> *popped = [super popToRootViewControllerAnimated:animated];
|
|
588
|
+
if (_coreCalls == 0) {
|
|
589
|
+
[self followUIKitTransition];
|
|
590
|
+
}
|
|
591
|
+
return popped;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
// A change of UIKit's list the core didn't ask for: an interactive one is the swipe, which the queue takes when at
|
|
595
|
+
// rest; any other (a swipe UIKit runs while the queue is busy, a pop of UIKit's own) is followed at its end, so the
|
|
596
|
+
// stack's lists lose what UIKit's list lost (`ScreenPopped`, destroy). Once per transition; without a transition at
|
|
597
|
+
// once.
|
|
598
|
+
- (void)followUIKitTransition {
|
|
599
|
+
id<UIViewControllerTransitionCoordinator> coordinator = [self stackRunningTransition];
|
|
600
|
+
if (!coordinator) {
|
|
601
|
+
[self followUIKitList];
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
if (coordinator == _seenTransition) {
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
_seenTransition = coordinator;
|
|
608
|
+
if (coordinator.isInteractive || [self isSwipingBack]) {
|
|
609
|
+
UIViewController *from =
|
|
610
|
+
[coordinator viewControllerForKey:UITransitionContextFromViewControllerKey];
|
|
611
|
+
UIViewController *to =
|
|
612
|
+
[coordinator viewControllerForKey:UITransitionContextToViewControllerKey];
|
|
613
|
+
if (from && to && [_queue swipeBeganFrom:from revealing:to]) {
|
|
614
|
+
// The revealed screen's will-appear ran; UIKit hasn't laid it out for the transition yet.
|
|
615
|
+
[self swipeBackStarts:to leaving:from on:self];
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
__weak ANNStackController *weakSelf = self;
|
|
620
|
+
[self stackWhenTransitionEnds:^(BOOL cancelled) {
|
|
621
|
+
ANNStackController *stack = weakSelf;
|
|
622
|
+
if (stack && !stack.nodeHelper.destroyed) {
|
|
623
|
+
[stack followUIKitList];
|
|
624
|
+
}
|
|
625
|
+
}];
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
// UIKit's list of the stack is what the stack shows; an empty list of a stack that has entries tells nothing (its
|
|
629
|
+
// screens are in UIKit's More navigation).
|
|
630
|
+
- (void)followUIKitList {
|
|
631
|
+
NSArray<UIViewController *> *viewControllers = self.viewControllers;
|
|
632
|
+
if (viewControllers.count == 0 && _queue.shown.count > 0) {
|
|
633
|
+
return;
|
|
634
|
+
}
|
|
635
|
+
[_queue uikitShows:viewControllers];
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
#pragma mark - More
|
|
639
|
+
|
|
640
|
+
- (UINavigationController *)shownNavigationController {
|
|
641
|
+
UIViewController *parent = _queue.shown.firstObject.parentViewController;
|
|
642
|
+
if (parent && parent != self && !parent.isLayoutNode &&
|
|
643
|
+
[parent isKindOfClass:UINavigationController.class]) {
|
|
644
|
+
return (UINavigationController *)parent;
|
|
645
|
+
}
|
|
646
|
+
return self;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
- (void)moreNavigationWillShow:(UINavigationController *)moreNavigation {
|
|
650
|
+
_moreNavigation = moreNavigation;
|
|
651
|
+
if (!self.nodeHelper.destroyed) {
|
|
652
|
+
[self installSwipeBackDelegatesOn:moreNavigation];
|
|
653
|
+
if ([ANNAppDirection navigationMissedSceneDirection:moreNavigation]) {
|
|
654
|
+
[ANNAppDirection followSceneDirectionIn:moreNavigation];
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
if (_coreCalls > 0 || self.nodeHelper.destroyed) {
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
// The stack's shared parts of the bar go onto the More navigation, which shows its screens now.
|
|
661
|
+
[self applySharedBarIfTopChangedAnimated:YES];
|
|
662
|
+
__weak ANNStackController *weakSelf = self;
|
|
663
|
+
__weak UINavigationController *weakMore = moreNavigation;
|
|
664
|
+
id<UIViewControllerTransitionCoordinator> coordinator = moreNavigation.transitionCoordinator;
|
|
665
|
+
// From one of the stack's own screens it is the user's back or swipe inside the tab; from the More list it is UIKit
|
|
666
|
+
// opening the tab, which with the tab API brings only the stack's first screen.
|
|
667
|
+
UIViewController *from =
|
|
668
|
+
[coordinator viewControllerForKey:UITransitionContextFromViewControllerKey];
|
|
669
|
+
BOOL opens = ![self isOwnViewController:from];
|
|
670
|
+
// The user's swipe back inside the tab: UIKit's More navigation runs it, with the tabs as its delegate.
|
|
671
|
+
UIViewController *to = [coordinator viewControllerForKey:UITransitionContextToViewControllerKey];
|
|
672
|
+
NSArray<UIViewController *> *shown = _queue.shown;
|
|
673
|
+
if (coordinator.isInteractive && from && to &&
|
|
674
|
+
[shown indexOfObjectIdenticalTo:from] != NSNotFound &&
|
|
675
|
+
[shown indexOfObjectIdenticalTo:to] != NSNotFound) {
|
|
676
|
+
[self swipeBackStarts:to leaving:from on:moreNavigation];
|
|
677
|
+
}
|
|
678
|
+
void (^follow)(BOOL) = ^(BOOL cancelled) {
|
|
679
|
+
ANNStackController *stack = weakSelf;
|
|
680
|
+
UINavigationController *more = weakMore;
|
|
681
|
+
if (cancelled || !stack || !more) {
|
|
682
|
+
return;
|
|
683
|
+
}
|
|
684
|
+
if (opens) {
|
|
685
|
+
[stack showScreensOnMoreNavigation:more];
|
|
686
|
+
} else {
|
|
687
|
+
[stack followMoreNavigation:more];
|
|
688
|
+
}
|
|
689
|
+
};
|
|
690
|
+
void (^completion)(id<UIViewControllerTransitionCoordinatorContext>) =
|
|
691
|
+
^(id<UIViewControllerTransitionCoordinatorContext> context) {
|
|
692
|
+
follow(context.isCancelled);
|
|
693
|
+
};
|
|
694
|
+
if (coordinator && [coordinator animateAlongsideTransition:nil completion:completion]) {
|
|
695
|
+
return;
|
|
696
|
+
}
|
|
697
|
+
follow(NO);
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
- (void)forgetSharedBar {
|
|
701
|
+
_sharedBarScreen = nil;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
- (void)stackDidLeaveScreen {
|
|
705
|
+
if (!self.nodeHelper.destroyed && !self.viewIfLoaded.window) {
|
|
706
|
+
[_queue stackWentOffScreen];
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
// UIKit opened the tab from the More list with the stack's first screen only: the screens the stack keeps above it go
|
|
711
|
+
// back onto the More navigation at once, so that the tab shows where the user left it.
|
|
712
|
+
- (void)showScreensOnMoreNavigation:(UINavigationController *)moreNavigation {
|
|
713
|
+
NSArray<UIViewController *> *shown = _queue.shown;
|
|
714
|
+
NSArray<UIViewController *> *viewControllers = moreNavigation.viewControllers;
|
|
715
|
+
NSUInteger index = shown.firstObject
|
|
716
|
+
? [viewControllers indexOfObjectIdenticalTo:shown.firstObject]
|
|
717
|
+
: NSNotFound;
|
|
718
|
+
if (self.nodeHelper.destroyed || index == NSNotFound) {
|
|
719
|
+
return;
|
|
720
|
+
}
|
|
721
|
+
NSUInteger onMore = viewControllers.count - index;
|
|
722
|
+
if (onMore >= shown.count) {
|
|
723
|
+
[self followMoreNavigation:moreNavigation];
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
726
|
+
for (NSUInteger offset = 0; offset < onMore; offset++) {
|
|
727
|
+
if (viewControllers[index + offset] != shown[offset]) {
|
|
728
|
+
[self followMoreNavigation:moreNavigation];
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
NSArray<UIViewController *> *above =
|
|
733
|
+
[shown subarrayWithRange:NSMakeRange(onMore, shown.count - onMore)];
|
|
734
|
+
for (UIViewController *entry in above) {
|
|
735
|
+
if (entry.parentViewController) {
|
|
736
|
+
return;
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
_coreCalls++;
|
|
740
|
+
@try {
|
|
741
|
+
[moreNavigation setViewControllers:[viewControllers arrayByAddingObjectsFromArray:above]
|
|
742
|
+
animated:NO];
|
|
743
|
+
} @finally {
|
|
744
|
+
_coreCalls--;
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
// A back or a swipe the user made inside the tab: the stack's first screen is still on the More navigation, and what
|
|
749
|
+
// left it leaves the stack (`ScreenPopped`, destroy). Anything else is UIKit taking the screens back: nothing changes.
|
|
750
|
+
- (void)followMoreNavigation:(UINavigationController *)moreNavigation {
|
|
751
|
+
if (self.nodeHelper.destroyed) {
|
|
752
|
+
return;
|
|
753
|
+
}
|
|
754
|
+
UIViewController *first = _queue.shown.firstObject;
|
|
755
|
+
NSArray<UIViewController *> *viewControllers = moreNavigation.viewControllers;
|
|
756
|
+
NSUInteger index = first ? [viewControllers indexOfObjectIdenticalTo:first] : NSNotFound;
|
|
757
|
+
if (index == NSNotFound) {
|
|
758
|
+
return;
|
|
759
|
+
}
|
|
760
|
+
NSRange range = NSMakeRange(index, viewControllers.count - index);
|
|
761
|
+
[_queue uikitShows:[viewControllers subarrayWithRange:range]];
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
#pragma mark - UINavigationBarDelegate
|
|
765
|
+
|
|
766
|
+
// iOS 15 has no `backAction`: the back button's tap reaches the stack here. A pop of UIKit's own (the core's, the
|
|
767
|
+
// swipe, a history menu pop that went on) has taken its view controller off already, so the bar has more items than
|
|
768
|
+
// the stack has view controllers then; the tap is the case where it doesn't.
|
|
769
|
+
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {
|
|
770
|
+
if (@available(iOS 16.0, *)) {
|
|
771
|
+
} else {
|
|
772
|
+
BOOL tapped = _coreCalls == 0 && ![self isSwipingBack] && ![self stackRunningTransition] &&
|
|
773
|
+
self.viewControllers.count >= navigationBar.items.count;
|
|
774
|
+
if (tapped) {
|
|
775
|
+
// The pop goes on the next turn, once the bar is done asking: one turn, not a wait.
|
|
776
|
+
__weak ANNStackController *weakSelf = self;
|
|
777
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
778
|
+
[weakSelf userGoBackTo:nil];
|
|
779
|
+
});
|
|
780
|
+
return NO;
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
SEL shouldPopItem = @selector(navigationBar:shouldPopItem:);
|
|
784
|
+
if ([UINavigationController instancesRespondToSelector:shouldPopItem]) {
|
|
785
|
+
return [super navigationBar:navigationBar shouldPopItem:item];
|
|
786
|
+
}
|
|
787
|
+
return YES;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
#pragma mark - UINavigationControllerDelegate
|
|
791
|
+
|
|
792
|
+
// UIKit starts the interactive pop of the swipe here: from now to the coordinator's completion the swipe is the
|
|
793
|
+
// queue's operation. A pop the core itself asked for comes here too, inside its own call.
|
|
794
|
+
- (void)navigationController:(UINavigationController *)navigationController
|
|
795
|
+
willShowViewController:(UIViewController *)viewController
|
|
796
|
+
animated:(BOOL)animated {
|
|
797
|
+
if (_coreCalls > 0) {
|
|
798
|
+
return;
|
|
799
|
+
}
|
|
800
|
+
[self followUIKitTransition];
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
// Each appearance of a top screen: what the stack shows follows its options (the swipes by its `popGesture`,
|
|
804
|
+
// `popGesture`; the bar's shared parts, at rest now).
|
|
805
|
+
- (void)navigationController:(UINavigationController *)navigationController
|
|
806
|
+
didShowViewController:(UIViewController *)viewController
|
|
807
|
+
animated:(BOOL)animated {
|
|
808
|
+
// UIKit may make the content swipe after the stack appeared.
|
|
809
|
+
[self installSwipeBackDelegates];
|
|
810
|
+
[self.presenter applyOptions:[self resolveOptionsWithDefault]];
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
#pragma mark - The custom transitions
|
|
814
|
+
|
|
815
|
+
// UIKit asks while it starts the change the queue asked for: the queue's plan when the operation and the arriving
|
|
816
|
+
// entry are the plan's (the back button and the commands go through the queue, so its plan covers them); nil for
|
|
817
|
+
// anything else — UIKit's own pops, the interactive swipe (UIKit never asks for it), a zoom alone.
|
|
818
|
+
- (id<UIViewControllerAnimatedTransitioning>)
|
|
819
|
+
animatorForOperation:(UINavigationControllerOperation)operation
|
|
820
|
+
from:(UIViewController *)from
|
|
821
|
+
to:(UIViewController *)to {
|
|
822
|
+
ANNTransitionPlan *plan = _pendingPlan;
|
|
823
|
+
if (!plan || operation == UINavigationControllerOperationNone || to != plan.toNode ||
|
|
824
|
+
[self isSwipingBack]) {
|
|
825
|
+
return nil;
|
|
826
|
+
}
|
|
827
|
+
BOOL matches = _pendingChange == ANNStackChangeReplace ||
|
|
828
|
+
(_pendingChange == ANNStackChangePush &&
|
|
829
|
+
operation == UINavigationControllerOperationPush) ||
|
|
830
|
+
(_pendingChange == ANNStackChangePop &&
|
|
831
|
+
operation == UINavigationControllerOperationPop);
|
|
832
|
+
if (!matches) {
|
|
833
|
+
return nil;
|
|
834
|
+
}
|
|
835
|
+
_pendingPlan = nil;
|
|
836
|
+
ANNTransitionAnimator *animator = [[ANNTransitionAnimator alloc] initWithPlan:plan];
|
|
837
|
+
_runningAnimator = animator;
|
|
838
|
+
return animator;
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
// The animating delegate while a custom animation may be needed: a change with its own plan now, or a top whose
|
|
842
|
+
// `animations.pop` is its own; the stack itself otherwise. UIKit reads the delegate's methods when it is set, so it is
|
|
843
|
+
// set again at each change.
|
|
844
|
+
- (void)updateAnimationGateWith:(ANNTransitionPlan *)plan {
|
|
845
|
+
BOOL needed = plan != nil;
|
|
846
|
+
if (!needed) {
|
|
847
|
+
UIViewController *top = [self getCurrentChild];
|
|
848
|
+
needed = top && [ANNAnimationRules
|
|
849
|
+
stackIsOwn:[top resolveOptionsWithDefault].animations.pop];
|
|
850
|
+
}
|
|
851
|
+
id<UINavigationControllerDelegate> delegate =
|
|
852
|
+
needed ? (id<UINavigationControllerDelegate>)_animatingDelegate : self;
|
|
853
|
+
if (self.delegate != delegate) {
|
|
854
|
+
self.delegate = delegate;
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
// After an operation or a merge: never while a transition of the stack runs (its end does it); a turn later when one
|
|
859
|
+
// still runs as the operation ends.
|
|
860
|
+
- (void)updateAnimationGateAfterMerge {
|
|
861
|
+
if ([self stackRunningTransition]) {
|
|
862
|
+
return;
|
|
863
|
+
}
|
|
864
|
+
[self updateAnimationGateWith:nil];
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
- (void)updateAnimationGateAtEnd {
|
|
868
|
+
[self updateAnimationGateAtEndTriesLeft:ANNGateRecomputeTries];
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
// While a transition of the stack still runs, the recompute waits for its coordinator's completion and runs a turn
|
|
872
|
+
// after it; a coordinator that keeps answering is asked again, a bounded number of turns.
|
|
873
|
+
- (void)updateAnimationGateAtEndTriesLeft:(NSUInteger)triesLeft {
|
|
874
|
+
if (self.nodeHelper.destroyed) {
|
|
875
|
+
return;
|
|
876
|
+
}
|
|
877
|
+
id<UIViewControllerTransitionCoordinator> coordinator = [self stackRunningTransition];
|
|
878
|
+
if (!coordinator || triesLeft == 0) {
|
|
879
|
+
[self updateAnimationGateWith:nil];
|
|
880
|
+
return;
|
|
881
|
+
}
|
|
882
|
+
if (_gateUpdateScheduled) {
|
|
883
|
+
return;
|
|
884
|
+
}
|
|
885
|
+
_gateUpdateScheduled = YES;
|
|
886
|
+
__weak ANNStackController *weakSelf = self;
|
|
887
|
+
dispatch_block_t later = ^{
|
|
888
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
889
|
+
ANNStackController *stack = weakSelf;
|
|
890
|
+
if (!stack) {
|
|
891
|
+
return;
|
|
892
|
+
}
|
|
893
|
+
stack->_gateUpdateScheduled = NO;
|
|
894
|
+
[stack updateAnimationGateAtEndTriesLeft:triesLeft - 1];
|
|
895
|
+
});
|
|
896
|
+
};
|
|
897
|
+
void (^completion)(id<UIViewControllerTransitionCoordinatorContext>) =
|
|
898
|
+
^(id<UIViewControllerTransitionCoordinatorContext> context) {
|
|
899
|
+
later();
|
|
900
|
+
};
|
|
901
|
+
if (![coordinator animateAlongsideTransition:nil completion:completion]) {
|
|
902
|
+
later();
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
// The iOS 18 zoom of a push: only for an animated push without an own animation of the stack (own animations win), with
|
|
907
|
+
// `zoom.enabled` not false and a non-empty `fromId` whose view is on the screen the push covers and in a window. The
|
|
908
|
+
// pushed screen keeps it, so UIKit zooms back at its pop.
|
|
909
|
+
- (void)zoomPush:(UIViewController *)pushed covered:(UIViewController *)covered {
|
|
910
|
+
if (@available(iOS 18.0, *)) {
|
|
911
|
+
if (!pushed || !covered || ![self isOwnViewController:covered]) {
|
|
912
|
+
return;
|
|
913
|
+
}
|
|
914
|
+
ANNZoomTransitionOptions *zoom = [pushed resolveOptionsWithDefault].animations.push.zoom;
|
|
915
|
+
NSString *fromId = [zoom.fromId withDefault:nil];
|
|
916
|
+
if (![zoom.enabled withDefault:YES] || ![fromId isKindOfClass:NSString.class] ||
|
|
917
|
+
fromId.length == 0) {
|
|
918
|
+
return;
|
|
919
|
+
}
|
|
920
|
+
__weak UIViewController *weakCovered = covered;
|
|
921
|
+
[ANNZoomAnchor zoom:pushed
|
|
922
|
+
fromId:fromId
|
|
923
|
+
sourceScreens:^NSArray<UIViewController *> * {
|
|
924
|
+
UIViewController *source = weakCovered;
|
|
925
|
+
return source ? source.shownComponentViewControllers : @[];
|
|
926
|
+
}];
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
#pragma mark - The swipes back
|
|
931
|
+
|
|
932
|
+
- (BOOL)swipeBackIsUIKits:(UIGestureRecognizer *)recognizer {
|
|
933
|
+
UIViewController *top = self.topViewController;
|
|
934
|
+
if (top != nil && top != [self getCurrentChild]) {
|
|
935
|
+
return YES;
|
|
936
|
+
}
|
|
937
|
+
BOOL own = recognizer == self.interactivePopGestureRecognizer;
|
|
938
|
+
if (@available(iOS 26.0, *)) {
|
|
939
|
+
own = own || recognizer == self.interactiveContentPopGestureRecognizer;
|
|
940
|
+
}
|
|
941
|
+
return !own && _queue.shown.count < 2;
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
- (BOOL)hasOneEntry {
|
|
945
|
+
return _queue.entries.count < 2;
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
- (BOOL)swipeBackMayBegin {
|
|
949
|
+
return !self.nodeHelper.destroyed && self.eventEmitter.isCurrent && _queue.entries.count >= 2 &&
|
|
950
|
+
_queue.shown.count >= 2 && _queue.isAtRest;
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
// Both swipes may ask for one touch: the hold's event goes once per attempt.
|
|
954
|
+
- (BOOL)holdsSwipeBack {
|
|
955
|
+
UITouch *touch = _swipeTouch;
|
|
956
|
+
if (touch && touch == _heldTouch) {
|
|
957
|
+
UIViewController *top = [self getCurrentChild];
|
|
958
|
+
ANNNavigationOptions *options = [ANNStackOptionsScreen(top) resolveOptionsWithDefault];
|
|
959
|
+
return ![options.topBar.backButton.popStackOnPress withDefault:YES];
|
|
960
|
+
}
|
|
961
|
+
BOOL held = [self sendHoldEvent];
|
|
962
|
+
if (held) {
|
|
963
|
+
_heldTouch = touch;
|
|
964
|
+
}
|
|
965
|
+
return held;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
- (BOOL)backIsHeld {
|
|
969
|
+
UIViewController *top = [self getCurrentChild];
|
|
970
|
+
ANNNavigationOptions *options = [ANNStackOptionsScreen(top) resolveOptionsWithDefault];
|
|
971
|
+
return top && ![options.topBar.backButton.popStackOnPress withDefault:YES];
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
- (void)swipeBackReceivesTouch:(UITouch *)touch {
|
|
975
|
+
_swipeTouch = touch;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
- (void)updateSwipeBack {
|
|
979
|
+
UIViewController *top = [self getCurrentChild];
|
|
980
|
+
id value = top ? [[ANNStackOptionsScreen(top) resolveOptionsWithDefault].popGesture get] : nil;
|
|
981
|
+
BOOL isBool = [value isKindOfClass:NSNumber.class];
|
|
982
|
+
// `false` turns both off, `'edge'` keeps only the edge swipe; before iOS 26 there is no content swipe.
|
|
983
|
+
BOOL edge = !(isBool && ![value boolValue]);
|
|
984
|
+
BOOL content = !value || (isBool && [value boolValue]);
|
|
985
|
+
_edgeSwipeDelegate.enabled = edge;
|
|
986
|
+
_moreEdgeSwipeDelegate.enabled = edge;
|
|
987
|
+
_contentSwipeDelegate.enabled = content;
|
|
988
|
+
_moreContentSwipeDelegate.enabled = content;
|
|
989
|
+
[self swipeBackFollowsBar];
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
- (void)swipeBackFollowsBar {
|
|
993
|
+
BOOL hidden = [ANNSystemUI barHiddenOf:self.shownNavigationController];
|
|
994
|
+
_edgeSwipeDelegate.barHidden = hidden;
|
|
995
|
+
_contentSwipeDelegate.barHidden = hidden;
|
|
996
|
+
_moreEdgeSwipeDelegate.barHidden = hidden;
|
|
997
|
+
_moreContentSwipeDelegate.barHidden = hidden;
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
#pragma mark - The split view
|
|
1001
|
+
|
|
1002
|
+
- (void)setChildren:(NSArray<UIViewController *> *)children
|
|
1003
|
+
fromViewController:(UIViewController *)fromViewController
|
|
1004
|
+
animated:(BOOL)animated
|
|
1005
|
+
completion:(ANNTransitionCompletionBlock)completion
|
|
1006
|
+
rejection:(ANNTransitionRejectionBlock)rejection {
|
|
1007
|
+
ANNAssertMainQueue();
|
|
1008
|
+
NSString *fromId =
|
|
1009
|
+
fromViewController.layoutInfo.componentId ?: self.layoutInfo.componentId ?: @"";
|
|
1010
|
+
if (self.nodeHelper.destroyed) {
|
|
1011
|
+
rejection([ANNErrorTexts screenNotShown:fromId], nil);
|
|
1012
|
+
return;
|
|
1013
|
+
}
|
|
1014
|
+
if (children.count == 0) {
|
|
1015
|
+
rejection([ANNErrorTexts noScreensForStack:fromId], nil);
|
|
1016
|
+
return;
|
|
1017
|
+
}
|
|
1018
|
+
NSString *what = [NSString stringWithFormat:@"set the stack of the screen '%@'", fromId];
|
|
1019
|
+
[_queue replaceWith:children
|
|
1020
|
+
animated:animated
|
|
1021
|
+
waits:NO
|
|
1022
|
+
answer:nil
|
|
1023
|
+
what:what
|
|
1024
|
+
componentId:fromId
|
|
1025
|
+
source:nil
|
|
1026
|
+
completion:completion
|
|
1027
|
+
rejection:rejection];
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
#pragma mark - ANNStackDisplay
|
|
1031
|
+
|
|
1032
|
+
- (UIViewController *)stackViewController {
|
|
1033
|
+
return self;
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
// In More the More navigation is what shows the screens.
|
|
1037
|
+
- (BOOL)stackIsOnScreen {
|
|
1038
|
+
return self.shownNavigationController.viewIfLoaded.window != nil &&
|
|
1039
|
+
![ANNPendingLayers isWaitingToShow:self];
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
// Only the stack's own transitions (a push, a pop, a replace of its view controllers, the interactive pop): a
|
|
1043
|
+
// presentation or a dismissal over it or of it never makes it wait (no new wait after a tap). In More, the More
|
|
1044
|
+
// navigation's transition of the stack's screens (its `CATransaction` never completes there).
|
|
1045
|
+
- (id<UIViewControllerTransitionCoordinator>)stackRunningTransition {
|
|
1046
|
+
UINavigationController *navigation = self.shownNavigationController;
|
|
1047
|
+
id<UIViewControllerTransitionCoordinator> coordinator =
|
|
1048
|
+
navigation.viewIfLoaded.window ? navigation.transitionCoordinator : nil;
|
|
1049
|
+
if (!coordinator) {
|
|
1050
|
+
return nil;
|
|
1051
|
+
}
|
|
1052
|
+
UIViewController *from =
|
|
1053
|
+
[coordinator viewControllerForKey:UITransitionContextFromViewControllerKey];
|
|
1054
|
+
UIViewController *to =
|
|
1055
|
+
[coordinator viewControllerForKey:UITransitionContextToViewControllerKey];
|
|
1056
|
+
return [self isOwnViewController:from] || [self isOwnViewController:to] ? coordinator : nil;
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
- (BOOL)isOwnViewController:(UIViewController *)viewController {
|
|
1060
|
+
if (!viewController || viewController == self) {
|
|
1061
|
+
return NO;
|
|
1062
|
+
}
|
|
1063
|
+
return viewController.parentViewController == self ||
|
|
1064
|
+
[self.viewControllers indexOfObjectIdenticalTo:viewController] != NSNotFound ||
|
|
1065
|
+
[_queue.heldNodes indexOfObjectIdenticalTo:viewController] != NSNotFound;
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
- (void)stackChange:(ANNStackChange)change
|
|
1069
|
+
toEntries:(NSArray<UIViewController *> *)entries
|
|
1070
|
+
animated:(BOOL)animated
|
|
1071
|
+
plan:(ANNTransitionPlan *)plan {
|
|
1072
|
+
// The bar a push starts from: its bottom, when it shows without a large title.
|
|
1073
|
+
CGFloat lowerBarBottom = -1;
|
|
1074
|
+
UINavigationController *navigation = [self navigationForChange:change];
|
|
1075
|
+
UIViewController *coveredTop = navigation.topViewController;
|
|
1076
|
+
// The More navigation is UIKit's, with the tabs' delegate: its transitions stay UIKit's.
|
|
1077
|
+
ANNTransitionPlan *ownPlan = animated && navigation == self ? plan : nil;
|
|
1078
|
+
// UIKit asks the delegate at the stack's next layout, after this call: the plan and the delegate are in place
|
|
1079
|
+
// before it.
|
|
1080
|
+
_pendingPlan = ownPlan;
|
|
1081
|
+
_pendingChange = change;
|
|
1082
|
+
if (_madeUp) {
|
|
1083
|
+
[self updateAnimationGateWith:ownPlan];
|
|
1084
|
+
}
|
|
1085
|
+
// Each push sets the direction of the navigation it runs on before UIKit's change, so that the transition and the
|
|
1086
|
+
// swipe back take its edge: React Native's, or the scene's with the app's direction on iOS 17+.
|
|
1087
|
+
if (change == ANNStackChangePush) {
|
|
1088
|
+
[self forceDirection:ANNAppDirection.pushDirection on:navigation];
|
|
1089
|
+
}
|
|
1090
|
+
// Own animations win over the zoom, also where UIKit plays them (More).
|
|
1091
|
+
if (change == ANNStackChangePush && animated && !plan) {
|
|
1092
|
+
[self zoomPush:entries.lastObject covered:coveredTop];
|
|
1093
|
+
}
|
|
1094
|
+
// UIKit asks for no transition object for the pop of a screen it zoomed: a command's own pop drops the zoom of the
|
|
1095
|
+
// screen that leaves right before the call (design 24).
|
|
1096
|
+
if (@available(iOS 18.0, *)) {
|
|
1097
|
+
if (change == ANNStackChangePop && ownPlan.overridesZoom &&
|
|
1098
|
+
coveredTop.preferredTransition && [self isOwnViewController:coveredTop]) {
|
|
1099
|
+
coveredTop.preferredTransition = nil;
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
if (change == ANNStackChangePush && animated) {
|
|
1103
|
+
lowerBarBottom = [self lowerBarBottomOf:navigation leaving:coveredTop];
|
|
1104
|
+
}
|
|
1105
|
+
// The revealed screen's large title takes its place for the transition before UIKit lays the screen out for it.
|
|
1106
|
+
if (change == ANNStackChangePop && animated) {
|
|
1107
|
+
[self popReveals:entries.lastObject leaving:coveredTop on:navigation];
|
|
1108
|
+
}
|
|
1109
|
+
_coreCalls++;
|
|
1110
|
+
@try {
|
|
1111
|
+
if (navigation != self) {
|
|
1112
|
+
// The tab is open from More: its screens are on the More navigation, over the More list.
|
|
1113
|
+
[self moreNavigation:navigation change:change toEntries:entries animated:animated];
|
|
1114
|
+
} else {
|
|
1115
|
+
switch (change) {
|
|
1116
|
+
case ANNStackChangePush:
|
|
1117
|
+
[super pushViewController:entries.lastObject animated:animated];
|
|
1118
|
+
break;
|
|
1119
|
+
case ANNStackChangePop:
|
|
1120
|
+
[self popTo:entries.lastObject animated:animated];
|
|
1121
|
+
break;
|
|
1122
|
+
case ANNStackChangeReplace:
|
|
1123
|
+
[super setViewControllers:entries animated:animated];
|
|
1124
|
+
break;
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
} @finally {
|
|
1128
|
+
_coreCalls--;
|
|
1129
|
+
}
|
|
1130
|
+
// The bar's shared parts first, before UIKit starts the transition: UIKit starts it at the next layout of the
|
|
1131
|
+
// stack, and a bar shown or hidden after that start doesn't go along with it (`topBar.visible`).
|
|
1132
|
+
[self barTransitionStartedBy:change];
|
|
1133
|
+
// UIKit gives the new top its frame and safe area only inside the transition, a few milliseconds later; its content
|
|
1134
|
+
// would render and lay out without the bar's room and keep it (the rows under the bar). A layout of the stack right
|
|
1135
|
+
// after the call gives the final frame, safe area and bar at once; the screen takes them into its root frame and
|
|
1136
|
+
// padding now.
|
|
1137
|
+
UINavigationController *shown = self.shownNavigationController;
|
|
1138
|
+
if (shown.viewIfLoaded.window) {
|
|
1139
|
+
[shown.view layoutIfNeeded];
|
|
1140
|
+
UIViewController *top = entries.lastObject;
|
|
1141
|
+
if (top) {
|
|
1142
|
+
[self updateRootLayoutOf:top];
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
if (lowerBarBottom >= 0 && shown.viewIfLoaded.window) {
|
|
1146
|
+
UIViewController *topScreen = ANNStackOptionsScreen(entries.lastObject);
|
|
1147
|
+
ANNTopBarPresenter *topBar = [ANNTopBarPresenter presenterOfScreen:topScreen];
|
|
1148
|
+
[topBar shownFromLowerBarWithBottom:lowerBarBottom];
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
// The bottom of the bar a transition leaves, in the navigation's coordinates, when that bar shows and has no large
|
|
1153
|
+
// title; -1 otherwise.
|
|
1154
|
+
- (CGFloat)lowerBarBottomOf:(UINavigationController *)navigation
|
|
1155
|
+
leaving:(nullable UIViewController *)leaving {
|
|
1156
|
+
if (!leaving || navigation.navigationBarHidden || ![self isOwnViewController:leaving] ||
|
|
1157
|
+
ANNLargeTitleCanShow([ANNStackOptionsScreen(leaving) resolveOptionsWithDefault])) {
|
|
1158
|
+
return -1;
|
|
1159
|
+
}
|
|
1160
|
+
return CGRectGetMaxY(navigation.navigationBar.frame);
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
// A pop or a swipe back starts, before UIKit lays the revealed screen out: the leaving screen first (its title and
|
|
1164
|
+
// band in its own place), then the revealed screen hears of the bar it starts from, as it is now (its bottom, whether
|
|
1165
|
+
// its screen has a large title, whether it is clear at its edge).
|
|
1166
|
+
- (void)popReveals:(UIViewController *)revealed
|
|
1167
|
+
leaving:(nullable UIViewController *)leaving
|
|
1168
|
+
on:(UINavigationController *)navigation {
|
|
1169
|
+
UIViewController *revealedScreen = ANNStackOptionsScreen(revealed);
|
|
1170
|
+
ANNTopBarPresenter *topBar = [ANNTopBarPresenter presenterOfScreen:revealedScreen];
|
|
1171
|
+
// The revealed title's place first: the leaving screen clears its edge look only when the revealed one draws its
|
|
1172
|
+
// band too, or the bar row over the revealed screen would be clear.
|
|
1173
|
+
BOOL revealedHosts = [topBar revealedByPop];
|
|
1174
|
+
ANNPopBar bar = {.bottom = -1, .largeTitle = NO, .clearAtEdge = NO};
|
|
1175
|
+
BOOL ownLeaving = [self isOwnViewController:leaving] ||
|
|
1176
|
+
(leaving && [_queue.shown indexOfObjectIdenticalTo:leaving] != NSNotFound);
|
|
1177
|
+
if (leaving && !navigation.navigationBarHidden && ownLeaving) {
|
|
1178
|
+
UIViewController *leavingScreen = ANNStackOptionsScreen(leaving);
|
|
1179
|
+
ANNTopBarPresenter *leavingBar = [ANNTopBarPresenter presenterOfScreen:leavingScreen];
|
|
1180
|
+
[leavingBar leavesByPopClearingEdge:revealedHosts];
|
|
1181
|
+
bar.bottom = CGRectGetMaxY(navigation.navigationBar.frame);
|
|
1182
|
+
bar.largeTitle = ANNLargeTitleCanShow([leavingScreen resolveOptionsWithDefault]);
|
|
1183
|
+
bar.clearAtEdge = [leavingBar clearsBarAtEdge];
|
|
1184
|
+
}
|
|
1185
|
+
[topBar revealedByPopFrom:bar];
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
// UIKit's swipe back started (on the stack's navigation or on UIKit's More navigation): as a pop, and a swipe given up
|
|
1189
|
+
// gives the screen that stays what it had.
|
|
1190
|
+
- (void)swipeBackStarts:(UIViewController *)revealed
|
|
1191
|
+
leaving:(UIViewController *)leaving
|
|
1192
|
+
on:(UINavigationController *)navigation {
|
|
1193
|
+
[self popReveals:revealed leaving:leaving on:navigation];
|
|
1194
|
+
__weak ANNTopBarPresenter *leavingBar =
|
|
1195
|
+
[ANNTopBarPresenter presenterOfScreen:ANNStackOptionsScreen(leaving)];
|
|
1196
|
+
[self stackWhenTransitionEnds:^(BOOL cancelled) {
|
|
1197
|
+
if (cancelled) {
|
|
1198
|
+
[leavingBar popGivenUp];
|
|
1199
|
+
}
|
|
1200
|
+
}];
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
- (void)forceDirection:(UISemanticContentAttribute)direction
|
|
1204
|
+
on:(UINavigationController *)navigation {
|
|
1205
|
+
if (navigation == self) {
|
|
1206
|
+
_forcedDirection = direction;
|
|
1207
|
+
}
|
|
1208
|
+
UINavigationBar *bar = navigation.navigationBar;
|
|
1209
|
+
if (bar.semanticContentAttribute != direction) {
|
|
1210
|
+
bar.semanticContentAttribute = direction;
|
|
1211
|
+
}
|
|
1212
|
+
UIView *view = navigation.viewIfLoaded;
|
|
1213
|
+
if (view && view.semanticContentAttribute != direction) {
|
|
1214
|
+
view.semanticContentAttribute = direction;
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
- (void)dropForcedDirection {
|
|
1219
|
+
_forcedDirection = UISemanticContentAttributeUnspecified;
|
|
1220
|
+
[ANNAppDirection followSceneDirectionIn:self];
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1223
|
+
// One screen back is UIKit's pop of its top, which plays the zoom back of a zoomed screen (also at a
|
|
1224
|
+
// `pop()`); more screens back, the pop to the target. Inside the core's call: not taken as UIKit's own pop.
|
|
1225
|
+
- (void)popTo:(UIViewController *)target animated:(BOOL)animated {
|
|
1226
|
+
NSArray<UIViewController *> *viewControllers = self.viewControllers;
|
|
1227
|
+
NSUInteger count = viewControllers.count;
|
|
1228
|
+
if (count >= 2 && viewControllers[count - 2] == target) {
|
|
1229
|
+
[super popViewControllerAnimated:animated];
|
|
1230
|
+
return;
|
|
1231
|
+
}
|
|
1232
|
+
[super popToViewController:target animated:animated];
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
// The navigation the change runs on: the More navigation while it shows the stack's screens (the stack's own list is
|
|
1236
|
+
// empty then), else the stack. A replace's new screens are on no navigation yet: the More navigation that still holds
|
|
1237
|
+
// the stack's first screen over its list is the one.
|
|
1238
|
+
- (UINavigationController *)navigationForChange:(ANNStackChange)change {
|
|
1239
|
+
UINavigationController *navigation = self.shownNavigationController;
|
|
1240
|
+
if (navigation != self) {
|
|
1241
|
+
_moreNavigation = navigation;
|
|
1242
|
+
return navigation;
|
|
1243
|
+
}
|
|
1244
|
+
UINavigationController *more = _moreNavigation;
|
|
1245
|
+
NSArray<UIViewController *> *moreList = more.viewControllers;
|
|
1246
|
+
if (change == ANNStackChangeReplace && more && self.viewControllers.count == 0 &&
|
|
1247
|
+
moreList.count >= 2 && moreList[1].layoutParent == self) {
|
|
1248
|
+
return more;
|
|
1249
|
+
}
|
|
1250
|
+
return self;
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
- (void)moreNavigation:(UINavigationController *)more
|
|
1254
|
+
change:(ANNStackChange)change
|
|
1255
|
+
toEntries:(NSArray<UIViewController *> *)entries
|
|
1256
|
+
animated:(BOOL)animated {
|
|
1257
|
+
switch (change) {
|
|
1258
|
+
case ANNStackChangePush:
|
|
1259
|
+
[more pushViewController:entries.lastObject animated:animated];
|
|
1260
|
+
break;
|
|
1261
|
+
case ANNStackChangePop:
|
|
1262
|
+
[more popToViewController:entries.lastObject animated:animated];
|
|
1263
|
+
break;
|
|
1264
|
+
case ANNStackChangeReplace: {
|
|
1265
|
+
UIViewController *list = more.viewControllers.firstObject;
|
|
1266
|
+
NSArray<UIViewController *> *shown =
|
|
1267
|
+
list ? [@[ list ] arrayByAddingObjectsFromArray:entries] : entries;
|
|
1268
|
+
[more setViewControllers:shown animated:animated];
|
|
1269
|
+
break;
|
|
1270
|
+
}
|
|
1271
|
+
}
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
// Right after the UIKit call, while its coordinator exists: the bar's shared parts move with the transition (conflict
|
|
1275
|
+
// 1), and on iOS 26 the title of a screen a push shows keeps the color of the window's style to its end (never on a pop
|
|
1276
|
+
// or the swipe).
|
|
1277
|
+
- (void)barTransitionStartedBy:(ANNStackChange)change {
|
|
1278
|
+
if (!self.presenter) {
|
|
1279
|
+
return;
|
|
1280
|
+
}
|
|
1281
|
+
[self applySharedBarIfTopChangedAnimated:YES];
|
|
1282
|
+
if (change != ANNStackChangePush) {
|
|
1283
|
+
return;
|
|
1284
|
+
}
|
|
1285
|
+
id<UIViewControllerTransitionCoordinator> coordinator = [self stackRunningTransition];
|
|
1286
|
+
// In a tab of More the More navigation shows the screens, not the stack's own view.
|
|
1287
|
+
UIWindow *window = self.shownNavigationController.viewIfLoaded.window;
|
|
1288
|
+
UIViewController *top = [self barTopEntry];
|
|
1289
|
+
if (coordinator && coordinator.isAnimated && !coordinator.isInteractive && window && top) {
|
|
1290
|
+
ANNTopBarPresenter *topBar =
|
|
1291
|
+
[ANNTopBarPresenter presenterOfScreen:ANNStackOptionsScreen(top)];
|
|
1292
|
+
[topBar pinTitleColorAlong:coordinator traits:window.traitCollection];
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
#pragma mark - The bar
|
|
1297
|
+
|
|
1298
|
+
// The entry the bar shows: UIKit's top when it is one of the stack's (also the screen a swipe reveals; the More
|
|
1299
|
+
// navigation's in More), else the stack's current child.
|
|
1300
|
+
- (nullable UIViewController *)barTopEntry {
|
|
1301
|
+
UIViewController *top = self.shownNavigationController.topViewController;
|
|
1302
|
+
if (top && [self isOwnViewController:top]) {
|
|
1303
|
+
return top;
|
|
1304
|
+
}
|
|
1305
|
+
return [self getCurrentChild];
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
- (void)applySharedBarIfTopChangedAnimated:(BOOL)animated {
|
|
1309
|
+
UIViewController *top = [self barTopEntry];
|
|
1310
|
+
UIViewController *screen = top ? ANNStackOptionsScreen(top) : nil;
|
|
1311
|
+
BOOL changed = screen != _sharedBarScreen;
|
|
1312
|
+
[self applySharedBarAnimated:animated
|
|
1313
|
+
visibility:changed ? ANNSharedBarVisibilityAll : ANNSharedBarVisibilityNone];
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
- (void)applySharedBarAnimated:(BOOL)animated visibility:(ANNSharedBarVisibility)visibility {
|
|
1317
|
+
ANNNodePresenter *nodePresenter = self.presenter;
|
|
1318
|
+
ANNStackPresenter *presenter = [nodePresenter isKindOfClass:ANNStackPresenter.class]
|
|
1319
|
+
? (ANNStackPresenter *)nodePresenter
|
|
1320
|
+
: nil;
|
|
1321
|
+
UIViewController *top = [self barTopEntry];
|
|
1322
|
+
if (!presenter || !top || self.nodeHelper.destroyed) {
|
|
1323
|
+
return;
|
|
1324
|
+
}
|
|
1325
|
+
UIViewController *screen = ANNStackOptionsScreen(top);
|
|
1326
|
+
if (visibility == ANNSharedBarVisibilityAll) {
|
|
1327
|
+
_sharedBarScreen = screen;
|
|
1328
|
+
}
|
|
1329
|
+
[presenter applySharedBar:[screen resolveOptionsWithDefault]
|
|
1330
|
+
ofScreen:screen
|
|
1331
|
+
animated:animated
|
|
1332
|
+
coordinator:animated ? [self stackRunningTransition] : nil
|
|
1333
|
+
visibility:visibility];
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
- (void)updateRootLayoutOfShownEntries {
|
|
1337
|
+
for (UIViewController *entry in _queue.shown) {
|
|
1338
|
+
[self updateRootLayoutOf:entry];
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
|
|
1342
|
+
// The keyboard shows: the bar hides when the screen on top has `topBar.hideOnKeyboard` in its resolved options, the
|
|
1343
|
+
// stack is in a window with nothing presented over it, and the bar shows (`topBar.hideOnKeyboard`). The value is read
|
|
1344
|
+
// at each keyboard, so it never outlives the screen that set it. UIKit's `hidesBarsWhenKeyboardAppears` is not used:
|
|
1345
|
+
// once on, it kept hiding the bar after it was set back to `NO`. The navigation that shows the screens has the bar: the
|
|
1346
|
+
// stack's own, or UIKit's More navigation in a tab opened from More.
|
|
1347
|
+
- (void)keyboardWillShow:(NSNotification *)notification {
|
|
1348
|
+
UINavigationController *navigation = self.shownNavigationController;
|
|
1349
|
+
if (!navigation.viewIfLoaded.window || navigation.presentedViewController ||
|
|
1350
|
+
navigation.navigationBarHidden || self.nodeHelper.destroyed) {
|
|
1351
|
+
return;
|
|
1352
|
+
}
|
|
1353
|
+
UIViewController *top = [self barTopEntry];
|
|
1354
|
+
ANNTopBarOptions *topBar = [ANNStackOptionsScreen(top) resolveOptionsWithDefault].topBar;
|
|
1355
|
+
if (!top || ![topBar.hideOnKeyboard withDefault:NO]) {
|
|
1356
|
+
return;
|
|
1357
|
+
}
|
|
1358
|
+
_keyboardHidBarOf = navigation;
|
|
1359
|
+
[navigation setNavigationBarHidden:YES animated:YES];
|
|
1360
|
+
// UIKit's keyboard hiding took the toolbar too, and didn't give it back: so does the stack; the toolbar comes back
|
|
1361
|
+
// at the next appearance of a screen with one, as before.
|
|
1362
|
+
if (!navigation.toolbarHidden) {
|
|
1363
|
+
[navigation setToolbarHidden:YES animated:YES];
|
|
1364
|
+
}
|
|
1365
|
+
// The stack's own navigation marks it in its override; UIKit's More navigation doesn't (`hideWithTopBar`).
|
|
1366
|
+
if (navigation != self) {
|
|
1367
|
+
[ANNSystemUI setNeedsUpdateOfGroups:ANNSystemUIGroupStatusBar];
|
|
1368
|
+
[self swipeBackFollowsBar];
|
|
1369
|
+
}
|
|
1370
|
+
[self updateRootLayoutOfShownEntries];
|
|
1371
|
+
}
|
|
1372
|
+
|
|
1373
|
+
// The keyboard closed: a bar the stack hid for it comes back when the stack is in a window, the bar is still hidden
|
|
1374
|
+
// and the screen on top doesn't hide it itself.
|
|
1375
|
+
- (void)keyboardDidHide:(NSNotification *)notification {
|
|
1376
|
+
UINavigationController *navigation = self.shownNavigationController;
|
|
1377
|
+
UINavigationController *hidBarOf = _keyboardHidBarOf;
|
|
1378
|
+
_keyboardHidBarOf = nil;
|
|
1379
|
+
if (!navigation.viewIfLoaded.window || hidBarOf != navigation ||
|
|
1380
|
+
!navigation.navigationBarHidden || self.nodeHelper.destroyed) {
|
|
1381
|
+
return;
|
|
1382
|
+
}
|
|
1383
|
+
UIViewController *top = [self barTopEntry];
|
|
1384
|
+
ANNTopBarOptions *topBar = [ANNStackOptionsScreen(top) resolveOptionsWithDefault].topBar;
|
|
1385
|
+
if (!top || ![topBar.visible withDefault:YES]) {
|
|
1386
|
+
return;
|
|
1387
|
+
}
|
|
1388
|
+
[navigation setNavigationBarHidden:NO animated:YES];
|
|
1389
|
+
// The stack's own navigation marks it in its override; UIKit's More navigation doesn't (`hideWithTopBar`).
|
|
1390
|
+
if (navigation != self) {
|
|
1391
|
+
[ANNSystemUI setNeedsUpdateOfGroups:ANNSystemUIGroupStatusBar];
|
|
1392
|
+
[self swipeBackFollowsBar];
|
|
1393
|
+
}
|
|
1394
|
+
[self updateRootLayoutOfShownEntries];
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
// The end of every transition is its coordinator's completion, never `CATransaction`'s: without a coordinator (no
|
|
1398
|
+
// animation, no window) at once. In the More tab the screens are in the More navigation, whose coordinator ends them
|
|
1399
|
+
// (`stackRunningTransition`).
|
|
1400
|
+
- (void)stackWhenTransitionEnds:(void (^)(BOOL cancelled))ended {
|
|
1401
|
+
__block BOOL called = NO;
|
|
1402
|
+
void (^once)(BOOL) = ^(BOOL cancelled) {
|
|
1403
|
+
if (called) {
|
|
1404
|
+
return;
|
|
1405
|
+
}
|
|
1406
|
+
called = YES;
|
|
1407
|
+
ended(cancelled);
|
|
1408
|
+
};
|
|
1409
|
+
id<UIViewControllerTransitionCoordinator> coordinator = [self stackRunningTransition];
|
|
1410
|
+
// At the end of a zoom UIKit runs the completion in a block of its animation queue: the end steps, which stop the
|
|
1411
|
+
// content of what left, go to the main queue first.
|
|
1412
|
+
void (^completion)(id<UIViewControllerTransitionCoordinatorContext>) =
|
|
1413
|
+
^(id<UIViewControllerTransitionCoordinatorContext> context) {
|
|
1414
|
+
BOOL cancelled = context.isCancelled;
|
|
1415
|
+
if (RCTIsMainQueue()) {
|
|
1416
|
+
once(cancelled);
|
|
1417
|
+
} else {
|
|
1418
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
1419
|
+
once(cancelled);
|
|
1420
|
+
});
|
|
1421
|
+
}
|
|
1422
|
+
};
|
|
1423
|
+
if (coordinator && [coordinator animateAlongsideTransition:nil completion:completion]) {
|
|
1424
|
+
return;
|
|
1425
|
+
}
|
|
1426
|
+
once(NO);
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1429
|
+
// The screen waits in the window at the stack's size, under UIKit's container view ( `ANNParking`): it isn't a child of
|
|
1430
|
+
// anything there, gets no touches, is hidden from accessibility, and its appearance is driven, so UIKit's callbacks
|
|
1431
|
+
// report nothing for it. Each path that ends the wait gives the view back as it was; UIKit's push of the entry
|
|
1432
|
+
// re-parents it in the same turn, so its departure is not ended here.
|
|
1433
|
+
- (void)stackPark:(UIViewController *)entry {
|
|
1434
|
+
[_parking park:entry inView:self.shownNavigationController.view];
|
|
1435
|
+
}
|
|
1436
|
+
|
|
1437
|
+
- (void)stackUnpark:(UIViewController *)entry {
|
|
1438
|
+
[_parking unpark:entry endingDeparture:NO];
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
- (NSArray<UIViewController *> *)parkedEntries {
|
|
1442
|
+
return _parking.parkedNodes;
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
// The back button of every entry but the first: `backAction` (iOS 16+) asks the hold, else goes back. A native screen's
|
|
1446
|
+
// item is the app's view controller's: the action goes there. The screen's root frame is set for the stack it joins.
|
|
1447
|
+
- (void)stackEntryJoins:(UIViewController *)entry first:(BOOL)first {
|
|
1448
|
+
[self updateBackActionOf:entry first:first];
|
|
1449
|
+
[self updateRootLayoutOf:entry];
|
|
1450
|
+
}
|
|
1451
|
+
|
|
1452
|
+
- (void)updateBackActionOf:(UIViewController *)entry {
|
|
1453
|
+
NSArray<UIViewController *> *shown = _queue.shown;
|
|
1454
|
+
NSUInteger index = [shown indexOfObjectIdenticalTo:entry];
|
|
1455
|
+
// An entry not in the list yet joins on top of it.
|
|
1456
|
+
[self updateBackActionOf:entry first:index == NSNotFound ? shown.count == 0 : index == 0];
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
- (void)updateBackActionOf:(UIViewController *)entry first:(BOOL)first {
|
|
1460
|
+
if (@available(iOS 16.0, *)) {
|
|
1461
|
+
UINavigationItem *item = entry.navigationItem;
|
|
1462
|
+
BOOL hasLeftButtons = item.leftBarButtonItems.count > 0;
|
|
1463
|
+
for (UIBarButtonItemGroup *group in item.leadingItemGroups) {
|
|
1464
|
+
hasLeftButtons = hasLeftButtons || group.barButtonItems.count > 0;
|
|
1465
|
+
}
|
|
1466
|
+
// UIKit makes a back button for a back action where the item has none, so an item that hides its back button
|
|
1467
|
+
// (`topBar.backButton.visible: false`) has no action either.
|
|
1468
|
+
if (first || hasLeftButtons || item.hidesBackButton) {
|
|
1469
|
+
item.backAction = nil;
|
|
1470
|
+
return;
|
|
1471
|
+
}
|
|
1472
|
+
if (!item.backAction) {
|
|
1473
|
+
__weak ANNStackController *weakSelf = self;
|
|
1474
|
+
item.backAction = [UIAction actionWithHandler:^(UIAction *action) {
|
|
1475
|
+
[weakSelf userGoBackTo:nil];
|
|
1476
|
+
}];
|
|
1477
|
+
}
|
|
1478
|
+
}
|
|
1479
|
+
}
|
|
1480
|
+
|
|
1481
|
+
- (void)stackEntriesWillMove {
|
|
1482
|
+
[self stopLowerRendering];
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
- (void)stackRenderLowerEntries:(NSArray<UIViewController *> *)entries {
|
|
1486
|
+
[_lowerToRender addObjectsFromArray:entries];
|
|
1487
|
+
[self renderLowerEntriesNow];
|
|
1488
|
+
}
|
|
1489
|
+
|
|
1490
|
+
- (void)stackOperationEnded {
|
|
1491
|
+
[self updateSwipeBack];
|
|
1492
|
+
// The plan UIKit never asked for goes (no window, no layout), the zoom anchors of the transition go, and the
|
|
1493
|
+
// delegate follows the new top.
|
|
1494
|
+
_pendingPlan = nil;
|
|
1495
|
+
[ANNZoomAnchor transitionEndedInStack:self];
|
|
1496
|
+
[self updateAnimationGateAtEnd];
|
|
1497
|
+
// After every operation, also those whose top got no appearance (off screen, a cancelled swipe, UIKit's own pops),
|
|
1498
|
+
// the bar's shared parts are the top's again; its visibilities only when the top is another screen than the one
|
|
1499
|
+
// they were set for (a cancelled swipe), never over a bar the user hid.
|
|
1500
|
+
[self applySharedBarIfTopChangedAnimated:NO];
|
|
1501
|
+
UIViewController *top = [self getCurrentChild];
|
|
1502
|
+
// Inside a layer that waits to show (a root's `setRoot`), its wait follows the new top; a modal's hold follows the
|
|
1503
|
+
// screen it shows now: a screen covered or popped holds no more.
|
|
1504
|
+
[ANNShownScreens changedIn:self];
|
|
1505
|
+
// A sheet or a modal sized to its content takes the height of the new top.
|
|
1506
|
+
if (top != _lastTop) {
|
|
1507
|
+
_lastTop = top;
|
|
1508
|
+
if (self.viewIfLoaded.window) {
|
|
1509
|
+
[ANNSheetPresenter stackDidShowScreenInModal:self];
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1514
|
+
#pragma mark - Lower screens
|
|
1515
|
+
|
|
1516
|
+
// Each lower screen makes its content in the window, under the top, and leaves the stack's view when its content is
|
|
1517
|
+
// ready or after 0.5 s; it waits for nobody, and no `markReady`. A cut or a replace takes them out before it calls
|
|
1518
|
+
// UIKit.
|
|
1519
|
+
- (void)renderLowerEntriesNow {
|
|
1520
|
+
if (!self.viewIfLoaded.window || [ANNPendingLayers isWaitingToShow:self] ||
|
|
1521
|
+
self.nodeHelper.destroyed || _lowerToRender.count == 0) {
|
|
1522
|
+
return;
|
|
1523
|
+
}
|
|
1524
|
+
NSArray<UIViewController *> *entries = [_lowerToRender copy];
|
|
1525
|
+
[_lowerToRender removeAllObjects];
|
|
1526
|
+
NSArray<UIViewController *> *shown = _queue.shown;
|
|
1527
|
+
for (UIViewController *entry in entries) {
|
|
1528
|
+
if ([shown indexOfObjectIdenticalTo:entry] == NSNotFound || entry == shown.lastObject ||
|
|
1529
|
+
entry.isViewLoaded || [_lowerRendering objectForKey:entry]) {
|
|
1530
|
+
continue;
|
|
1531
|
+
}
|
|
1532
|
+
[self renderLowerEntry:entry];
|
|
1533
|
+
}
|
|
1534
|
+
}
|
|
1535
|
+
|
|
1536
|
+
- (void)renderLowerEntry:(UIViewController *)entry {
|
|
1537
|
+
NSNumber *number = @(++_lowerNumber);
|
|
1538
|
+
[_lowerRendering setObject:number forKey:entry];
|
|
1539
|
+
__weak ANNStackController *weakSelf = self;
|
|
1540
|
+
__weak UIViewController *weakEntry = entry;
|
|
1541
|
+
[entry setReadyHandler:^{
|
|
1542
|
+
[weakSelf lowerEntry:weakEntry renderedWithNumber:number];
|
|
1543
|
+
}
|
|
1544
|
+
forKey:ANNLowerRenderReadyKey];
|
|
1545
|
+
// Parking loads the view, and a native screen is ready inside that load: the readiness test below ends it.
|
|
1546
|
+
[_lowerSettingUp addObject:entry];
|
|
1547
|
+
@try {
|
|
1548
|
+
[self stackPark:entry];
|
|
1549
|
+
[entry render];
|
|
1550
|
+
} @catch (NSException *exception) {
|
|
1551
|
+
RCTLogWarn(@"[ApexNavigation] could not render the screen '%@': %@",
|
|
1552
|
+
entry.layoutInfo.componentId ?: @"", exception.reason ?: exception.name);
|
|
1553
|
+
[_lowerSettingUp removeObject:entry];
|
|
1554
|
+
[self lowerEntry:entry renderedWithNumber:number];
|
|
1555
|
+
return;
|
|
1556
|
+
}
|
|
1557
|
+
[_lowerSettingUp removeObject:entry];
|
|
1558
|
+
[self updateRootLayoutOf:entry];
|
|
1559
|
+
if (ANNStackEntryIsReady(entry)) {
|
|
1560
|
+
[self lowerEntry:entry renderedWithNumber:number];
|
|
1561
|
+
return;
|
|
1562
|
+
}
|
|
1563
|
+
int64_t delay = (int64_t)(ANNLowerScreenRenderLimit * NSEC_PER_SEC);
|
|
1564
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay), dispatch_get_main_queue(), ^{
|
|
1565
|
+
[weakSelf lowerEntry:weakEntry renderedWithNumber:number];
|
|
1566
|
+
});
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
- (void)lowerEntry:(UIViewController *)entry renderedWithNumber:(NSNumber *)number {
|
|
1570
|
+
if (!entry || [_lowerSettingUp containsObject:entry] ||
|
|
1571
|
+
![[_lowerRendering objectForKey:entry] isEqualToNumber:number]) {
|
|
1572
|
+
return;
|
|
1573
|
+
}
|
|
1574
|
+
[_lowerRendering removeObjectForKey:entry];
|
|
1575
|
+
[entry removeReadyHandlerForKey:ANNLowerRenderReadyKey];
|
|
1576
|
+
[self stackUnpark:entry];
|
|
1577
|
+
}
|
|
1578
|
+
|
|
1579
|
+
- (void)stopLowerRendering {
|
|
1580
|
+
NSMutableArray<UIViewController *> *entries = [NSMutableArray new];
|
|
1581
|
+
for (UIViewController *entry in _lowerRendering.keyEnumerator) {
|
|
1582
|
+
[entries addObject:entry];
|
|
1583
|
+
}
|
|
1584
|
+
for (UIViewController *entry in entries) {
|
|
1585
|
+
[self lowerEntry:entry renderedWithNumber:[_lowerRendering objectForKey:entry]];
|
|
1586
|
+
}
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
#pragma mark - Helpers
|
|
1590
|
+
|
|
1591
|
+
- (void)updateRootLayoutOf:(UIViewController *)entry {
|
|
1592
|
+
for (ANNComponentViewController *screen in ANNStackScreensOfEntry(entry)) {
|
|
1593
|
+
[screen updateRootLayout];
|
|
1594
|
+
}
|
|
1595
|
+
}
|
|
1596
|
+
|
|
1597
|
+
@end
|