@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,1274 @@
|
|
|
1
|
+
package dev.apexnative.navigation.viewcontrollers.stack
|
|
2
|
+
|
|
3
|
+
import dev.apexnative.navigation.options.BottomTabsEnterExitAnimationOptions
|
|
4
|
+
import dev.apexnative.navigation.options.DefaultOptions
|
|
5
|
+
import dev.apexnative.navigation.options.Options
|
|
6
|
+
import dev.apexnative.navigation.options.StackAnimationOptions
|
|
7
|
+
import dev.apexnative.navigation.options.TopBarEnterExitAnimationOptions
|
|
8
|
+
import dev.apexnative.navigation.react.CommandAnswer
|
|
9
|
+
import dev.apexnative.navigation.react.CommandListener
|
|
10
|
+
import dev.apexnative.navigation.react.ErrorTexts
|
|
11
|
+
import dev.apexnative.navigation.react.ReloadCoordinator
|
|
12
|
+
import dev.apexnative.navigation.react.events.AppearanceDispatcher
|
|
13
|
+
import dev.apexnative.navigation.viewcontrollers.bottomtabs.TabBarMotion
|
|
14
|
+
import dev.apexnative.navigation.viewcontrollers.component.Readiness
|
|
15
|
+
import dev.apexnative.navigation.viewcontrollers.component.RenderWait
|
|
16
|
+
import dev.apexnative.navigation.viewcontrollers.parent.OptionsScreen
|
|
17
|
+
import dev.apexnative.navigation.viewcontrollers.stack.StackDisplay.BarMotion
|
|
18
|
+
import dev.apexnative.navigation.viewcontrollers.stack.StackDisplay.BarVisibility
|
|
19
|
+
import dev.apexnative.navigation.viewcontrollers.stack.StackDisplay.Custom
|
|
20
|
+
import dev.apexnative.navigation.viewcontrollers.stack.StackDisplay.Elements
|
|
21
|
+
import dev.apexnative.navigation.viewcontrollers.stack.StackDisplay.Fade
|
|
22
|
+
import dev.apexnative.navigation.viewcontrollers.stack.StackDisplay.Motion
|
|
23
|
+
import dev.apexnative.navigation.viewcontrollers.viewcontroller.ViewController
|
|
24
|
+
import dev.apexnative.navigation.views.animations.AnimationRules
|
|
25
|
+
import java.util.WeakHashMap
|
|
26
|
+
|
|
27
|
+
private typealias Node = ViewController<*>
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The one queue of a stack: every command of the stack, every back of the user and every return of its container goes
|
|
31
|
+
* through it, runs by one table and answers once. It knows no views: it drives a [StackDisplay], the readiness of the
|
|
32
|
+
* screens and a clock, so the unit tests run it with fakes. Main thread only.
|
|
33
|
+
*
|
|
34
|
+
* It keeps two lists, bottom to top. [entries] is the stack as JavaScript sees it: changed at once when an operation
|
|
35
|
+
* is accepted, and every check of a later command reads it. [shown] is what the container shows, changed as each
|
|
36
|
+
* operation runs; its last is the current child. The state is "rest", "waiting" (the newest started operation, a push
|
|
37
|
+
* or a `setStackRoot`, waits for its screen to render) or "transition" (transitions run; on Android they may overlap).
|
|
38
|
+
*
|
|
39
|
+
* The table, as the state reads it: a push waits behind a waiting push and completes a waiting `setStackRoot` at
|
|
40
|
+
* once; a cut (pop, `popTo`, `popToRoot`, a key that goes back, back of the user) and a replace (`setStackRoot`, the
|
|
41
|
+
* split view's `setRoot`) interrupt a waiting push and complete a waiting `setStackRoot` at once; a cut or a replace
|
|
42
|
+
* accepted while pushes are queued interrupts those it removes; a `none` (`popTo` of the top) waits behind a waiting
|
|
43
|
+
* operation. Otherwise everything runs at once: a transition that starts takes the screens it moves over from the
|
|
44
|
+
* transitions running, which stop them where they are, and each transition ends when the last screen it still owns
|
|
45
|
+
* comes to rest, reporting only what it still owns. A running push whose screens a cut takes over ends then; a pop
|
|
46
|
+
* never does; a replace accepted while a `setStackRoot` runs completes it at once, and the end of a replace stops only
|
|
47
|
+
* the screens it destroys. Off screen or without a view, every operation runs at once, without a wait or a transition.
|
|
48
|
+
* Each end: `ANN.ComponentWillAppear` at the start; at the end `DidDisappear`, `DidAppear`, the navigation state,
|
|
49
|
+
* `ANN.ScreenPopped` of each screen that left (top to bottom), their destroys, the answer, `ANN.CommandCompleted`
|
|
50
|
+
* (`AppearanceDispatcher.endTransition`).
|
|
51
|
+
*
|
|
52
|
+
* Its waits for a screen to render are the core's one wait ([RenderWait]), on the screen it pushes or sets as the top;
|
|
53
|
+
* the readiness signals reach it through [deliver] (the stack posts them to the next turn of the main loop: a signal
|
|
54
|
+
* that comes inside a layout pass or a view's attach moves no view of the container there). A push or a
|
|
55
|
+
* `setStackRoot` with elements waits for its targets after that, a wait like the others: a cut or a replace during it
|
|
56
|
+
* interrupts the push, which moves no view into a layer.
|
|
57
|
+
*
|
|
58
|
+
* The transition is the screens' own when the options say so (`AnimationRules.stackIsOwn`): the display plays each
|
|
59
|
+
* screen's side ([StackDisplay.animateCustom]) with the same owners as the default transitions; the bar's row then
|
|
60
|
+
* changes at once, and with elements the bars show or hide at once too.
|
|
61
|
+
*/
|
|
62
|
+
internal class StackQueue(
|
|
63
|
+
display: StackDisplay,
|
|
64
|
+
private val readiness: Readiness,
|
|
65
|
+
private val scheduler: AppearanceDispatcher.Scheduler,
|
|
66
|
+
private val host: Host,
|
|
67
|
+
private val deliver: (() -> Unit) -> Unit = { it() },
|
|
68
|
+
) {
|
|
69
|
+
/** What the queue tells the stack. */
|
|
70
|
+
interface Host {
|
|
71
|
+
/** The current child (the top of [shown]) changed: a transition started, or an operation ran at once. */
|
|
72
|
+
fun currentChildChanged()
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The current child is about to change, right before [currentChildChanged]: [motion] is the default transition
|
|
76
|
+
* the bar's row goes with, none when the change comes at once or with an animation of its own; [visibility] is
|
|
77
|
+
* how the bar shows or hides when the new top wants it otherwise.
|
|
78
|
+
*/
|
|
79
|
+
fun barTransition(motion: StackDisplay.BarMotion?, visibility: BarVisibility) = Unit
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The current child is about to change, right before [barTransition]: [move] is how the transition goes, which
|
|
83
|
+
* the tab bar of tabs around the stack follows when the new top shows or hides it; [side] the transition's
|
|
84
|
+
* `bottomTabs` with [TabBarMotion.Move.Slide].
|
|
85
|
+
*/
|
|
86
|
+
fun tabBarTransition(move: TabBarMotion.Move, side: BottomTabsEnterExitAnimationOptions?) = Unit
|
|
87
|
+
|
|
88
|
+
/** [node] was accepted to show as the top (a push, the new top of a replace). */
|
|
89
|
+
fun willShow(node: Node) = Unit
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* An operation ended or was rejected: what back does may have changed. [topSettled]: the screen on top came to
|
|
93
|
+
* rest — the queue is at rest, or the operation that ended brought the current child (the FAB follows it then).
|
|
94
|
+
*/
|
|
95
|
+
fun operationEnded(topSettled: Boolean)
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Whether [node] is a React screen with a root of its own, which a push prepares when its switch is on
|
|
99
|
+
* ([StackSwitches.preparesOwnRootPushes]).
|
|
100
|
+
*/
|
|
101
|
+
fun isOwnRootScreen(node: Node): Boolean = false
|
|
102
|
+
|
|
103
|
+
/** One line for the log: a failure that has no command to answer. */
|
|
104
|
+
fun log(text: String) = Unit
|
|
105
|
+
|
|
106
|
+
/** The id the command of [kind] answers with for [entry] (`StackController.answerIdOf`). */
|
|
107
|
+
fun answerIdOf(entry: Node, kind: AnswerKind): String
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** The command an answer is for: what the stack answers with depends on it ([Host.answerIdOf]). */
|
|
111
|
+
enum class AnswerKind {
|
|
112
|
+
/** `push`. */
|
|
113
|
+
Push,
|
|
114
|
+
|
|
115
|
+
/** `setStackRoot`, and the split view's `showInColumn` through it. */
|
|
116
|
+
Replace,
|
|
117
|
+
|
|
118
|
+
/** `pop`, `popToRoot`, a key that goes back to its entry. */
|
|
119
|
+
Back,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** What shows the stack; the unit tests may give another. */
|
|
123
|
+
var display: StackDisplay = display
|
|
124
|
+
|
|
125
|
+
private val entryList = ArrayList<Node>()
|
|
126
|
+
private val shownList = ArrayList<Node>()
|
|
127
|
+
// Screens that left [shownList] and are not destroyed yet: their transition still moves them.
|
|
128
|
+
private val leavingList = ArrayList<Node>()
|
|
129
|
+
private var waiting: Op? = null
|
|
130
|
+
private val queued = ArrayDeque<Op>()
|
|
131
|
+
private val running = ArrayList<Op>()
|
|
132
|
+
// Lower screens whose content isn't made yet, and those placed in the container until it is.
|
|
133
|
+
private val unrendered = LinkedHashSet<Node>()
|
|
134
|
+
private val lowerWaits = HashMap<Node, () -> Unit>()
|
|
135
|
+
// The operation, by its sequence, whose acceptance took each entry away.
|
|
136
|
+
private val removedAt = WeakHashMap<Node, Int>()
|
|
137
|
+
private var sequence = 0
|
|
138
|
+
private var draining = false
|
|
139
|
+
// Operations end because a newer one took over all they moved (finishTakenOver).
|
|
140
|
+
private var takenOver = false
|
|
141
|
+
private var destroyed = false
|
|
142
|
+
|
|
143
|
+
/** The stack as JavaScript sees it, bottom to top. */
|
|
144
|
+
val entries: List<Node>
|
|
145
|
+
get() = entryList
|
|
146
|
+
|
|
147
|
+
/** What the stack's container shows, bottom to top. */
|
|
148
|
+
val shown: List<Node>
|
|
149
|
+
get() = shownList
|
|
150
|
+
|
|
151
|
+
/** The top of [shown]: the screen the user sees; none before the first. */
|
|
152
|
+
val currentChild: Node?
|
|
153
|
+
get() = shownList.lastOrNull()
|
|
154
|
+
|
|
155
|
+
/** The screen of the operation that waits for it to render; none. */
|
|
156
|
+
val waitingScreen: Node?
|
|
157
|
+
get() = when (val op = waiting) {
|
|
158
|
+
is PushOp -> op.node
|
|
159
|
+
is ReplaceOp -> op.top
|
|
160
|
+
else -> null
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Nothing runs, nothing waits, nothing is queued. */
|
|
164
|
+
val isAtRest: Boolean
|
|
165
|
+
get() = waiting == null && running.isEmpty() && queued.isEmpty()
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Every node the stack holds, bottom first: [entries] first (the split view reads the first screen there), then
|
|
169
|
+
* what still shows or leaves, and the nodes of operations accepted and not run yet.
|
|
170
|
+
*/
|
|
171
|
+
fun nodes(): List<Node> {
|
|
172
|
+
val nodes = LinkedHashSet<Node>(entryList)
|
|
173
|
+
nodes += shownList
|
|
174
|
+
nodes += leavingList
|
|
175
|
+
(waiting as? ReplaceOp)?.let { nodes += it.nodes }
|
|
176
|
+
queued.forEach { if (it is PushOp) nodes += it.node }
|
|
177
|
+
return nodes.toList()
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** The screens a stack is made with (a root, a tab, a modal): the last shows, the others render after it. */
|
|
181
|
+
fun setInitial(screens: List<Node>) {
|
|
182
|
+
entryList += screens
|
|
183
|
+
shownList += screens
|
|
184
|
+
unrendered += screens.dropLast(1)
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Acceptance: the lists JavaScript relies on change now; the operation runs in its turn.
|
|
188
|
+
|
|
189
|
+
/** `push` of [node], accepted: it is an entry now, and runs in its turn ([answer] with its id). */
|
|
190
|
+
fun push(node: Node, answer: CommandAnswer?, componentId: String, what: String, prepared: Boolean = false) {
|
|
191
|
+
if (destroyed) return refuse(answer, null, componentId, listOf(node))
|
|
192
|
+
entryList += node
|
|
193
|
+
host.willShow(node)
|
|
194
|
+
val op = PushOp(nextSequence(), answer, componentId, what, node, prepared)
|
|
195
|
+
// A push completes a waiting `setStackRoot` at once, whatever waits behind it.
|
|
196
|
+
(waiting as? ReplaceOp)?.let(::completeAtOnce)
|
|
197
|
+
enqueue(op)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* A cut to [target], an entry that becomes the top: every entry above it leaves. [answer] gets [value]; a back of
|
|
202
|
+
* the user has none. [silent]: no animation and no appearance events (`popToRootOnBlur`).
|
|
203
|
+
*/
|
|
204
|
+
fun cut(
|
|
205
|
+
target: Node,
|
|
206
|
+
answer: CommandAnswer?,
|
|
207
|
+
componentId: String,
|
|
208
|
+
what: String,
|
|
209
|
+
value: String?,
|
|
210
|
+
silent: Boolean = false,
|
|
211
|
+
) {
|
|
212
|
+
val index = entryList.indexOf(target)
|
|
213
|
+
if (destroyed || index < 0) return refuse(answer, null, componentId, emptyList())
|
|
214
|
+
val removed = entryList.subList(index + 1, entryList.size).toList()
|
|
215
|
+
entryList.subList(index + 1, entryList.size).clear()
|
|
216
|
+
val seq = nextSequence()
|
|
217
|
+
removed.forEach { removedAt[it] = seq }
|
|
218
|
+
interruptPushesOf(removed)
|
|
219
|
+
(waiting as? ReplaceOp)?.let(::completeAtOnce)
|
|
220
|
+
val showsAbove = target in shownList && shownList.last() !== target
|
|
221
|
+
val op = if (showsAbove) {
|
|
222
|
+
CutOp(seq, answer, componentId, what, target, value, silent)
|
|
223
|
+
} else {
|
|
224
|
+
// A cut that moves nothing more: its answer at its turn.
|
|
225
|
+
NoneOp(seq, answer, null, componentId, what, value, null)
|
|
226
|
+
}
|
|
227
|
+
enqueue(op)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* A replace of every entry by [nodes] (`setStackRoot`, the split view's `setRoot`): [animated] or not, [asPush]
|
|
232
|
+
* with the push transition; [waits] for its new top to render (not for the split view). [answer] or [listener] get
|
|
233
|
+
* the id of the new top.
|
|
234
|
+
*/
|
|
235
|
+
fun replace(
|
|
236
|
+
nodes: List<Node>,
|
|
237
|
+
animated: Boolean,
|
|
238
|
+
asPush: Boolean,
|
|
239
|
+
answer: CommandAnswer?,
|
|
240
|
+
listener: CommandListener?,
|
|
241
|
+
componentId: String,
|
|
242
|
+
what: String,
|
|
243
|
+
waits: Boolean = true,
|
|
244
|
+
) {
|
|
245
|
+
if (destroyed || nodes.isEmpty()) return refuse(answer, listener, componentId, nodes)
|
|
246
|
+
val old = entryList.toList()
|
|
247
|
+
entryList.clear()
|
|
248
|
+
entryList += nodes
|
|
249
|
+
host.willShow(nodes.last())
|
|
250
|
+
val seq = nextSequence()
|
|
251
|
+
old.forEach { if (it !in nodes) removedAt[it] = seq }
|
|
252
|
+
interruptPushesOf(old)
|
|
253
|
+
(waiting as? ReplaceOp)?.let(::completeAtOnce)
|
|
254
|
+
running.filterIsInstance<ReplaceOp>().forEach(::completeRunning)
|
|
255
|
+
enqueue(ReplaceOp(seq, answer, listener, componentId, what, nodes.toList(), animated, asPush, waits))
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* An operation that moves nothing (`popTo` of the top): [value] in its turn, decided at its acceptance (C6); it
|
|
260
|
+
* rejects only when an operation accepted before it took [target] away.
|
|
261
|
+
*/
|
|
262
|
+
fun none(value: String, target: Node?, answer: CommandAnswer?, componentId: String, what: String) {
|
|
263
|
+
if (destroyed) return refuse(answer, null, componentId, emptyList())
|
|
264
|
+
enqueue(NoneOp(nextSequence(), answer, null, componentId, what, value, target))
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// An operation that comes to a destroyed stack, or for a target that isn't an entry: it rejects, and what was made
|
|
268
|
+
// for it goes (nothing hangs).
|
|
269
|
+
private fun refuse(answer: CommandAnswer?, listener: CommandListener?, componentId: String, made: List<Node>) {
|
|
270
|
+
made.forEach { if (it !in entryList) it.destroy() }
|
|
271
|
+
val text = ErrorTexts.screenNotShown(componentId)
|
|
272
|
+
answer?.reject(text)
|
|
273
|
+
listener?.onError(text)
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* The stack went off screen (its tab unselected, a modal over it): what waits for its screen runs now as off
|
|
278
|
+
* screen, without a transition and without marking the content ready.
|
|
279
|
+
*/
|
|
280
|
+
fun wentOffScreen() {
|
|
281
|
+
val op = waiting ?: return
|
|
282
|
+
stopWaiting(op)
|
|
283
|
+
guarded(op) {
|
|
284
|
+
when (op) {
|
|
285
|
+
is PushOp -> pushAtOnce(op)
|
|
286
|
+
is ReplaceOp -> beginReplace(op, atOnce = true)
|
|
287
|
+
else -> Unit
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
drain()
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* The lower screens make their content in the window: each is placed in the container under the top until its
|
|
295
|
+
* content is ready or [LOWER_SCREEN_MILLIS] passed. Only while the stack is on screen; the others wait for its next
|
|
296
|
+
* appearance.
|
|
297
|
+
*/
|
|
298
|
+
fun renderLowerScreens() {
|
|
299
|
+
if (destroyed || !onScreen()) return
|
|
300
|
+
val top = currentChild
|
|
301
|
+
for (screen in unrendered.toList()) {
|
|
302
|
+
unrendered -= screen
|
|
303
|
+
if (screen === top || screen !in shownList || screen.isDestroyed) continue
|
|
304
|
+
protectLower(screen) { placeLower(screen) }
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* The stack is destroyed (a new root, its modal dismissed, its tab gone): what waits, what is queued and what
|
|
310
|
+
* runs rejects with `the screen '<id>' is not shown`, in the order they came; their animators stop (on a copy); a
|
|
311
|
+
* back of the user ends without a word. The nodes stay for the stack to destroy.
|
|
312
|
+
*/
|
|
313
|
+
fun destroy() {
|
|
314
|
+
if (destroyed) return
|
|
315
|
+
destroyed = true
|
|
316
|
+
val ops = ArrayList<Op>()
|
|
317
|
+
waiting?.let {
|
|
318
|
+
stopWaiting(it)
|
|
319
|
+
ops += it
|
|
320
|
+
}
|
|
321
|
+
ops += queued
|
|
322
|
+
queued.clear()
|
|
323
|
+
val transitions = running.toList()
|
|
324
|
+
running.clear()
|
|
325
|
+
for (op in transitions) {
|
|
326
|
+
op.animating.toList().forEach(display::stop)
|
|
327
|
+
op.animating.clear()
|
|
328
|
+
op.owned.clear()
|
|
329
|
+
ops += op
|
|
330
|
+
}
|
|
331
|
+
lowerWaits.values.toList().forEach { it() }
|
|
332
|
+
lowerWaits.clear()
|
|
333
|
+
for (op in ops.sortedBy { it.seq }) {
|
|
334
|
+
op.cancelLimit?.invoke()
|
|
335
|
+
if (op.done) continue
|
|
336
|
+
op.done = true
|
|
337
|
+
reject(op, ErrorTexts.screenNotShown(op.componentId))
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// The table.
|
|
342
|
+
|
|
343
|
+
private fun enqueue(op: Op) {
|
|
344
|
+
queued.addLast(op)
|
|
345
|
+
drain()
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
private fun drain() {
|
|
349
|
+
if (draining) return
|
|
350
|
+
draining = true
|
|
351
|
+
try {
|
|
352
|
+
while (!destroyed) {
|
|
353
|
+
val op = queued.firstOrNull() ?: break
|
|
354
|
+
val current = waiting
|
|
355
|
+
if (current != null) {
|
|
356
|
+
if (current is ReplaceOp && op !is NoneOp) {
|
|
357
|
+
completeAtOnce(current)
|
|
358
|
+
continue
|
|
359
|
+
}
|
|
360
|
+
if (current is PushOp && (op is CutOp || op is ReplaceOp) && current.node !in entryList) {
|
|
361
|
+
interrupt(current)
|
|
362
|
+
continue
|
|
363
|
+
}
|
|
364
|
+
break
|
|
365
|
+
}
|
|
366
|
+
queued.removeFirst()
|
|
367
|
+
start(op)
|
|
368
|
+
}
|
|
369
|
+
} finally {
|
|
370
|
+
draining = false
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
private fun start(op: Op) {
|
|
375
|
+
if (!op.isCurrent()) {
|
|
376
|
+
// The JavaScript of the command went: nothing moves, and the reset takes the stack.
|
|
377
|
+
op.done = true
|
|
378
|
+
return
|
|
379
|
+
}
|
|
380
|
+
guarded(op) {
|
|
381
|
+
when (op) {
|
|
382
|
+
is NoneOp -> runNone(op)
|
|
383
|
+
is PushOp -> startPush(op)
|
|
384
|
+
is CutOp -> startCut(op)
|
|
385
|
+
is ReplaceOp -> startReplace(op)
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// None.
|
|
391
|
+
|
|
392
|
+
private fun runNone(op: NoneOp) {
|
|
393
|
+
op.done = true
|
|
394
|
+
val target = op.target
|
|
395
|
+
val removedBy = target?.let { removedAt[it] }
|
|
396
|
+
if (target != null && target !in entryList && removedBy != null && removedBy < op.seq) {
|
|
397
|
+
reject(op, ErrorTexts.screenNotShown(op.componentId))
|
|
398
|
+
} else {
|
|
399
|
+
op.value?.let { resolve(op, it) }
|
|
400
|
+
}
|
|
401
|
+
settled()
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Push.
|
|
405
|
+
|
|
406
|
+
private fun startPush(op: PushOp) {
|
|
407
|
+
// Its node went before its turn (a completed iOS swipe; here, the defense): it resolves as interrupted (C8).
|
|
408
|
+
if (op.node !in entryList) return interrupt(op)
|
|
409
|
+
if (!onScreen()) return pushAtOnce(op)
|
|
410
|
+
val node = op.node
|
|
411
|
+
val push = resolved(node).animations.push
|
|
412
|
+
op.awaitsTargets = awaitsTargets(push, !push.enabled.isFalse)
|
|
413
|
+
val wait = when {
|
|
414
|
+
op.prepared -> Wait.Prepared
|
|
415
|
+
push.waitForRender.isTrue -> Wait.Content
|
|
416
|
+
StackSwitches.preparesOwnRootPushes && host.isOwnRootScreen(node) -> Wait.Limited
|
|
417
|
+
else -> Wait.None
|
|
418
|
+
}
|
|
419
|
+
if (wait == Wait.None) return if (op.awaitsTargets) awaitTargets(op) else beginPush(op)
|
|
420
|
+
waiting = op
|
|
421
|
+
when (wait) {
|
|
422
|
+
Wait.Prepared -> awaitPrepared(op)
|
|
423
|
+
Wait.Content -> {
|
|
424
|
+
// Then the components of the bar drawn in advance, 0.5 s at most after the content (a title or a
|
|
425
|
+
// background with its own `waitForRender: false` not).
|
|
426
|
+
display.placeWaiting(node)
|
|
427
|
+
awaitContent(op, node, limit = null, bar = RenderWait.Bar.AfterContent)
|
|
428
|
+
}
|
|
429
|
+
else -> {
|
|
430
|
+
display.placeWaiting(node)
|
|
431
|
+
awaitContent(op, node, limit = OWN_ROOT_WAIT_MILLIS, bar = RenderWait.Bar.None)
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
private fun beginPush(op: PushOp) {
|
|
437
|
+
val node = op.node
|
|
438
|
+
val covered = shownList.lastOrNull()
|
|
439
|
+
// The views first: a failure here leaves the lists as they were.
|
|
440
|
+
display.raise(node)
|
|
441
|
+
shownList += node
|
|
442
|
+
unrendered -= node
|
|
443
|
+
op.covered = covered
|
|
444
|
+
val moved = listOfNotNull(covered, node)
|
|
445
|
+
val ended = takeOver(moved, op)
|
|
446
|
+
// The arriving screen's `animations.push`; Android has no zoom.
|
|
447
|
+
val push = resolved(node).animations.push
|
|
448
|
+
val animated = display.canAnimate && !push.enabled.isFalse
|
|
449
|
+
val own = animated && AnimationRules.stackIsOwn(push)
|
|
450
|
+
val elements = own && AnimationRules.hasElements(push)
|
|
451
|
+
// The bar's row goes with the default transition only; with an animation of its own it changes at once. The tab
|
|
452
|
+
// bar moves with its screens or by its own side.
|
|
453
|
+
tellBars(animated, own, elements, push, TabBarMotion.Move.WithPush, BarMotion.Push)
|
|
454
|
+
host.currentChildChanged()
|
|
455
|
+
finishTakenOver(ended)
|
|
456
|
+
running += op
|
|
457
|
+
AppearanceDispatcher.beginTransition(listOf(node))
|
|
458
|
+
op.owned += moved
|
|
459
|
+
// Without animation the screen shows at the moment the animated one would start: not a transition.
|
|
460
|
+
if (!animated) {
|
|
461
|
+
display.rest(node)
|
|
462
|
+
return finishPush(op)
|
|
463
|
+
}
|
|
464
|
+
if (own) {
|
|
465
|
+
op.keepsEnd = true
|
|
466
|
+
return animate(op, forwardMoves(node, covered, push, elements))
|
|
467
|
+
}
|
|
468
|
+
animate(op, listOfNotNull(Move(node, Motion.PushIn, false), covered?.let { Move(it, Motion.PushCover, true) }))
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
private fun finishPush(op: PushOp) {
|
|
472
|
+
op.done = true
|
|
473
|
+
running -= op
|
|
474
|
+
val node = op.node
|
|
475
|
+
val covered = op.covered
|
|
476
|
+
val hiding = ArrayList<Node>(1)
|
|
477
|
+
if (covered != null && covered in op.owned) {
|
|
478
|
+
hiding += covered
|
|
479
|
+
// The covered screen leaves the container now, not before; its React root lives.
|
|
480
|
+
if (covered !== currentChild && covered in shownList) display.detach(covered)
|
|
481
|
+
}
|
|
482
|
+
// The screen that came by its own `enter` stays at its end values.
|
|
483
|
+
if (node in op.owned && !op.keepsEnd) display.rest(node)
|
|
484
|
+
val showing = if (node === currentChild && onScreen()) listOf(node) else emptyList()
|
|
485
|
+
AppearanceDispatcher.endTransition(hiding, showing, null, op.answer, host.answerIdOf(node, AnswerKind.Push))
|
|
486
|
+
settled(node)
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Off screen or without a view: at once, without a transition; the top appears when the stack shows.
|
|
490
|
+
private fun pushAtOnce(op: PushOp) {
|
|
491
|
+
val node = op.node
|
|
492
|
+
val covered = shownList.lastOrNull()
|
|
493
|
+
if (display.hasView) {
|
|
494
|
+
display.raise(node)
|
|
495
|
+
display.rest(node)
|
|
496
|
+
}
|
|
497
|
+
shownList += node
|
|
498
|
+
unrendered -= node
|
|
499
|
+
val ended = takeOver(listOfNotNull(covered, node), op)
|
|
500
|
+
host.tabBarTransition(TabBarMotion.Move.AtOnce, null)
|
|
501
|
+
host.barTransition(null, BarVisibility.AT_ONCE)
|
|
502
|
+
host.currentChildChanged()
|
|
503
|
+
finishTakenOver(ended)
|
|
504
|
+
if (display.hasView && covered != null) display.detach(covered)
|
|
505
|
+
op.done = true
|
|
506
|
+
val value = host.answerIdOf(node, AnswerKind.Push)
|
|
507
|
+
AppearanceDispatcher.endTransition(listOfNotNull(covered), emptyList(), null, op.answer, value)
|
|
508
|
+
settled(node)
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// A push whose screen never appeared ends: its wait ends, its screen goes without appearance events and without
|
|
512
|
+
// `ANN.ScreenPopped` (its destroy's own events go), it resolves with its id, and the screen under it is not
|
|
513
|
+
// touched. It runs outside any guard (the acceptance of a cut or a replace, the drain): a teardown that fails is
|
|
514
|
+
// logged, so the push still answers and the operation that took its screen is still queued.
|
|
515
|
+
private fun interrupt(op: PushOp) {
|
|
516
|
+
if (op.done) return
|
|
517
|
+
op.done = true
|
|
518
|
+
if (waiting === op) stopWaiting(op)
|
|
519
|
+
queued.remove(op)
|
|
520
|
+
val node = op.node
|
|
521
|
+
entryList.remove(node)
|
|
522
|
+
// The view and the node go each on their own: a view that fails to leave doesn't keep the screen alive.
|
|
523
|
+
try {
|
|
524
|
+
if (display.hasView) display.remove(node)
|
|
525
|
+
} catch (e: Throwable) {
|
|
526
|
+
val reason = ErrorTexts.couldNot("remove the view of the screen '${node.id}'", ErrorTexts.reasonOf(e))
|
|
527
|
+
host.log("[ApexNavigation] $reason")
|
|
528
|
+
}
|
|
529
|
+
try {
|
|
530
|
+
node.destroy()
|
|
531
|
+
} catch (e: Throwable) {
|
|
532
|
+
val reason = ErrorTexts.couldNot("destroy the screen '${node.id}'", ErrorTexts.reasonOf(e))
|
|
533
|
+
host.log("[ApexNavigation] $reason")
|
|
534
|
+
}
|
|
535
|
+
op.answer?.resolve(host.answerIdOf(node, AnswerKind.Push))
|
|
536
|
+
settled()
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
// Every push accepted or waiting whose screen [removed] takes away, oldest first.
|
|
540
|
+
private fun interruptPushesOf(removed: Collection<Node>) {
|
|
541
|
+
if (removed.isEmpty()) return
|
|
542
|
+
val pushes = ArrayList<PushOp>()
|
|
543
|
+
(waiting as? PushOp)?.let { if (it.node in removed) pushes += it }
|
|
544
|
+
queued.forEach { if (it is PushOp && it.node in removed) pushes += it }
|
|
545
|
+
pushes.sortedBy { it.seq }.forEach(::interrupt)
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// Cut.
|
|
549
|
+
|
|
550
|
+
private fun startCut(op: CutOp) {
|
|
551
|
+
val target = op.target
|
|
552
|
+
if (target !in shownList) {
|
|
553
|
+
// Its target went before its turn: a command rejects, a back of the user ends.
|
|
554
|
+
op.done = true
|
|
555
|
+
reject(op, ErrorTexts.screenNotShown(op.componentId))
|
|
556
|
+
return settled()
|
|
557
|
+
}
|
|
558
|
+
val index = shownList.indexOf(target)
|
|
559
|
+
val leaving = shownList.subList(index + 1, shownList.size).asReversed().toList()
|
|
560
|
+
if (leaving.isEmpty()) {
|
|
561
|
+
op.done = true
|
|
562
|
+
op.value?.let { resolve(op, it) }
|
|
563
|
+
return settled()
|
|
564
|
+
}
|
|
565
|
+
val top = leaving.first()
|
|
566
|
+
val atOnce = !onScreen()
|
|
567
|
+
val moving = running.any { target in it.animating }
|
|
568
|
+
if (display.hasView) display.reveal(target, top)
|
|
569
|
+
// The screens that leave let go of the focus (`blurOnUnmount`).
|
|
570
|
+
leaving.forEach { it.onLeaveStarted() }
|
|
571
|
+
endLowerWaits(leaving + target)
|
|
572
|
+
shownList.subList(index + 1, shownList.size).clear()
|
|
573
|
+
leavingList += leaving
|
|
574
|
+
unrendered -= target
|
|
575
|
+
unrendered.removeAll(leaving.toSet())
|
|
576
|
+
op.leaving = leaving
|
|
577
|
+
val moved = leaving + target
|
|
578
|
+
val ended = takeOver(moved, op)
|
|
579
|
+
// The leaving top's `animations.pop` decides, `enabled` too.
|
|
580
|
+
val pop = resolved(top).animations.pop
|
|
581
|
+
val animated = !atOnce && !op.silent && display.canAnimate && !pop.enabled.isFalse
|
|
582
|
+
val own = animated && AnimationRules.stackIsOwn(pop)
|
|
583
|
+
val elements = own && AnimationRules.hasElements(pop)
|
|
584
|
+
tellBars(animated, own, elements, pop, TabBarMotion.Move.WithPop, BarMotion.Pop)
|
|
585
|
+
host.currentChildChanged()
|
|
586
|
+
finishTakenOver(ended)
|
|
587
|
+
if (display.hasView) target.onViewBroughtToFront()
|
|
588
|
+
op.owned += moved
|
|
589
|
+
if (atOnce) return finishCut(op)
|
|
590
|
+
running += op
|
|
591
|
+
if (!op.silent) AppearanceDispatcher.beginTransition(listOf(target))
|
|
592
|
+
// The screens between the top and the target leave without animation.
|
|
593
|
+
leaving.drop(1).forEach(display::hide)
|
|
594
|
+
if (!animated) return finishCut(op)
|
|
595
|
+
// Its own: no wait on a pop; the leaving screen starts from where it is.
|
|
596
|
+
if (own) return animate(op, backMoves(top, target, pop, elements, moving))
|
|
597
|
+
animate(op, listOf(Move(top, Motion.PopOut, true), Move(target, Motion.PopReveal, moving)))
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
private fun finishCut(op: CutOp) {
|
|
601
|
+
op.done = true
|
|
602
|
+
running -= op
|
|
603
|
+
val target = op.target
|
|
604
|
+
if (target in op.owned && display.hasView) display.rest(target)
|
|
605
|
+
val showing = if (target === currentChild && onScreen() && !op.silent) listOf(target) else emptyList()
|
|
606
|
+
val leaving = op.leaving
|
|
607
|
+
val events = { popAndDestroy(leaving, emptyList()) }
|
|
608
|
+
AppearanceDispatcher.endTransition(leaving, showing, events, op.answer, op.value)
|
|
609
|
+
settled(target)
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
// Replace.
|
|
613
|
+
|
|
614
|
+
private fun startReplace(op: ReplaceOp) {
|
|
615
|
+
if (!onScreen() || !op.waits) return beginReplace(op, atOnce = !onScreen())
|
|
616
|
+
val top = op.top
|
|
617
|
+
val setStackRoot = resolved(top).animations.setStackRoot
|
|
618
|
+
val waitForRender = setStackRoot.waitForRender
|
|
619
|
+
// `enabled: false`: the screens stand at once, without the wait (`animations.setStackRoot.enabled`).
|
|
620
|
+
if (waitForRender.isFalse || !op.animated) return beginReplace(op, atOnce = false)
|
|
621
|
+
// Elements play as at a push and wait the same way; with `asPush` the push plays without them.
|
|
622
|
+
op.awaitsTargets = !op.asPush && awaitsTargets(setStackRoot, true)
|
|
623
|
+
waiting = op
|
|
624
|
+
display.placeWaiting(top)
|
|
625
|
+
// The components of the bar drawn in advance join the wait: within the same 0.5 s without `waitForRender`;
|
|
626
|
+
// after the content, 0.5 s at most, with `true`. The targets take what is left of the 0.5 s without it.
|
|
627
|
+
if (waitForRender.isTrue) {
|
|
628
|
+
awaitContent(op, top, limit = null, bar = RenderWait.Bar.AfterContent)
|
|
629
|
+
} else {
|
|
630
|
+
op.cancelLimit = scheduler.schedule(SET_STACK_ROOT_WAIT_MILLIS) { op.overLimit = true }
|
|
631
|
+
awaitContent(op, top, limit = SET_STACK_ROOT_WAIT_MILLIS, bar = RenderWait.Bar.WithinLimit)
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
private fun beginReplace(op: ReplaceOp, atOnce: Boolean) {
|
|
636
|
+
op.cancelLimit?.invoke()
|
|
637
|
+
val top = op.top
|
|
638
|
+
val old = shownList.toList()
|
|
639
|
+
val placed = if (display.hasView) old.filter(display::isPlaced) else emptyList()
|
|
640
|
+
if (display.hasView) display.raise(top)
|
|
641
|
+
old.forEach { it.onLeaveStarted() }
|
|
642
|
+
endLowerWaits(old)
|
|
643
|
+
shownList.clear()
|
|
644
|
+
shownList += op.nodes
|
|
645
|
+
leavingList += old
|
|
646
|
+
unrendered.removeAll(old.toSet())
|
|
647
|
+
unrendered += op.nodes.dropLast(1)
|
|
648
|
+
op.old = old
|
|
649
|
+
val moved = old + top
|
|
650
|
+
val ended = takeOver(moved, op)
|
|
651
|
+
// The new top's `animations.setStackRoot`; with `asPush` its `animations.push` without elements, which wins
|
|
652
|
+
// over a `content` of its own.
|
|
653
|
+
val animations = resolved(top).animations
|
|
654
|
+
val played: StackAnimationOptions = if (op.asPush) animations.push else animations.setStackRoot
|
|
655
|
+
val animated = !atOnce && op.animated && display.canAnimate
|
|
656
|
+
val own = animated && if (op.asPush) AnimationRules.contentIsOwn(played) else AnimationRules.stackIsOwn(played)
|
|
657
|
+
val elements = own && !op.asPush && AnimationRules.hasElements(played)
|
|
658
|
+
val motion = if (op.asPush) BarMotion.Push else BarMotion.FadeThrough
|
|
659
|
+
val system = if (op.asPush) TabBarMotion.Move.WithPush else TabBarMotion.Move.Slide
|
|
660
|
+
tellBars(animated, own, elements, played, system, motion)
|
|
661
|
+
host.currentChildChanged()
|
|
662
|
+
finishTakenOver(ended)
|
|
663
|
+
op.owned += moved
|
|
664
|
+
if (atOnce) {
|
|
665
|
+
if (display.hasView) display.rest(top)
|
|
666
|
+
return finishReplace(op)
|
|
667
|
+
}
|
|
668
|
+
running += op
|
|
669
|
+
AppearanceDispatcher.beginTransition(listOf(top))
|
|
670
|
+
if (!op.animated || !display.canAnimate) {
|
|
671
|
+
display.rest(top)
|
|
672
|
+
return finishReplace(op)
|
|
673
|
+
}
|
|
674
|
+
// Its own: the new top's `content.enter` (and the old top's `content.exit`) instead of the fade through; the
|
|
675
|
+
// other old screens hide at once. The old title's picture goes only with the fade through.
|
|
676
|
+
if (own) {
|
|
677
|
+
op.keepsEnd = true
|
|
678
|
+
placed.dropLast(1).forEach(display::hide)
|
|
679
|
+
return animate(op, forwardMoves(top, placed.lastOrNull(), played, elements))
|
|
680
|
+
}
|
|
681
|
+
if (op.asPush) {
|
|
682
|
+
placed.dropLast(1).forEach(display::hide)
|
|
683
|
+
animate(op, listOfNotNull(Move(top, Motion.PushIn, false), placed.lastOrNull()?.let {
|
|
684
|
+
Move(it, Motion.PushCover, true)
|
|
685
|
+
}))
|
|
686
|
+
} else {
|
|
687
|
+
animate(op, listOf(Move(top, Motion.FadeIn, false)) + placed.map { Move(it, Motion.FadeOut, true) })
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
private fun finishReplace(op: ReplaceOp) {
|
|
692
|
+
op.done = true
|
|
693
|
+
running -= op
|
|
694
|
+
// Its end stops the animations of the screens it destroys only: a push started after it plays on.
|
|
695
|
+
finishAll(takeOver(op.old, op))
|
|
696
|
+
val top = op.top
|
|
697
|
+
if (top in op.owned && display.hasView && !op.keepsEnd) display.rest(top)
|
|
698
|
+
val showing = if (top === currentChild && onScreen()) listOf(top) else emptyList()
|
|
699
|
+
endReplace(op, showing)
|
|
700
|
+
renderLowerScreens()
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
// A waiting `setStackRoot` that a push, a cut or a replace completes at once: no transition, its new top lies under
|
|
704
|
+
// what comes next and appears when it is seen.
|
|
705
|
+
private fun completeAtOnce(op: ReplaceOp) {
|
|
706
|
+
if (op.done) return
|
|
707
|
+
stopWaiting(op)
|
|
708
|
+
op.cancelLimit?.invoke()
|
|
709
|
+
guarded(op) {
|
|
710
|
+
val top = op.top
|
|
711
|
+
val old = shownList.toList()
|
|
712
|
+
if (display.hasView) {
|
|
713
|
+
display.raise(top)
|
|
714
|
+
display.rest(top)
|
|
715
|
+
}
|
|
716
|
+
old.forEach { it.onLeaveStarted() }
|
|
717
|
+
endLowerWaits(old)
|
|
718
|
+
shownList.clear()
|
|
719
|
+
shownList += op.nodes
|
|
720
|
+
leavingList += old
|
|
721
|
+
unrendered.removeAll(old.toSet())
|
|
722
|
+
unrendered += op.nodes.dropLast(1)
|
|
723
|
+
op.old = old
|
|
724
|
+
val ended = takeOver(old + top, op)
|
|
725
|
+
host.tabBarTransition(TabBarMotion.Move.AtOnce, null)
|
|
726
|
+
host.barTransition(null, BarVisibility.AT_ONCE)
|
|
727
|
+
host.currentChildChanged()
|
|
728
|
+
finishTakenOver(ended)
|
|
729
|
+
op.done = true
|
|
730
|
+
endReplace(op, emptyList())
|
|
731
|
+
renderLowerScreens()
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
// A running `setStackRoot` that a newer replace completes at once.
|
|
736
|
+
private fun completeRunning(op: ReplaceOp) {
|
|
737
|
+
if (op.done) return
|
|
738
|
+
op.animating.toList().forEach(display::stop)
|
|
739
|
+
op.animating.clear()
|
|
740
|
+
guarded(op) { finishReplace(op) }
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
// The end of a replace: the old screens disappear, `ANN.ScreenPopped` for each whose id no new screen takes (top to
|
|
744
|
+
// bottom), the destroys, those with a reused id last; then the answer.
|
|
745
|
+
private fun endReplace(op: ReplaceOp, showing: List<Node>) {
|
|
746
|
+
val ids = op.nodes.mapTo(HashSet()) { it.id }
|
|
747
|
+
val old = op.old.asReversed()
|
|
748
|
+
val reused = old.filter { it.id in ids }
|
|
749
|
+
val popped = old.filter { it.id !in ids }
|
|
750
|
+
val value = host.answerIdOf(op.top, AnswerKind.Replace)
|
|
751
|
+
AppearanceDispatcher.endTransition(old, showing, { popAndDestroy(popped, reused) }, op.answer, value)
|
|
752
|
+
if (!op.told) op.listener?.onSuccess(value)
|
|
753
|
+
op.told = true
|
|
754
|
+
settled(op.top)
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
// `ANN.ScreenPopped` for each of [popped], then their destroys (the content stops only after all the events), then
|
|
758
|
+
// [after], destroyed without the event.
|
|
759
|
+
private fun popAndDestroy(popped: List<Node>, after: List<Node>) {
|
|
760
|
+
popped.forEach(AppearanceDispatcher::screenPopped)
|
|
761
|
+
for (node in popped + after) {
|
|
762
|
+
leavingList -= node
|
|
763
|
+
node.destroy()
|
|
764
|
+
if (display.hasView) display.remove(node)
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
// Waits.
|
|
769
|
+
|
|
770
|
+
// The one wait (RenderWait) for [screen], the node the operation brings: at [limit] the content not ready counts
|
|
771
|
+
// as mounted; without one, `waitForRender: true` waits as long as it takes, except for content the readiness store
|
|
772
|
+
// knows nothing of after 1 s, which counts as ready (the same rule as iOS).
|
|
773
|
+
private fun awaitContent(op: Op, screen: Node, limit: Long?, bar: RenderWait.Bar) {
|
|
774
|
+
val wait = RenderWait(
|
|
775
|
+
readiness = readiness,
|
|
776
|
+
scheduler = scheduler,
|
|
777
|
+
limitMillis = limit,
|
|
778
|
+
bar = bar,
|
|
779
|
+
countsUnknownContent = true,
|
|
780
|
+
deliver = deliver,
|
|
781
|
+
step = { work -> step(op) { work() } },
|
|
782
|
+
onEnd = { endWait(op) },
|
|
783
|
+
)
|
|
784
|
+
op.wait = wait
|
|
785
|
+
op.waitedNode = screen
|
|
786
|
+
// An entry that isn't a screen (a pair) waits for the screens it shows, as a root does.
|
|
787
|
+
wait.start(RenderWait.waitedScreens(screen))
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
/**
|
|
791
|
+
* The entry [node] (a pair) changed the screens it shows: the operation that waits for it to render waits for
|
|
792
|
+
* those it shows now, and no longer for one that left the window.
|
|
793
|
+
*/
|
|
794
|
+
fun shownScreensChanged(node: Node) {
|
|
795
|
+
val op = waiting ?: return
|
|
796
|
+
if (op.waitedNode !== node) return
|
|
797
|
+
val wait = op.wait ?: return
|
|
798
|
+
step(op) { wait.retake(RenderWait.waitedScreens(node)) }
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
private fun awaitPrepared(op: PushOp) {
|
|
802
|
+
val token = Any()
|
|
803
|
+
op.waitToken = token
|
|
804
|
+
val node = op.node
|
|
805
|
+
display.awaitPrepared(
|
|
806
|
+
node,
|
|
807
|
+
waiting = { !destroyed && !op.done && op.waitToken === token && waiting === op && op.isCurrent() },
|
|
808
|
+
mounted = { step(op) { if (!readiness.isReady(node)) readiness.markReady(node) } },
|
|
809
|
+
start = { step(op) { if (waiting === op) endWait(op) } },
|
|
810
|
+
)
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
// The content is there: then the targets, when the transition has elements; else its transition.
|
|
814
|
+
private fun endWait(op: Op) {
|
|
815
|
+
stopWaiting(op)
|
|
816
|
+
when {
|
|
817
|
+
op.awaitsTargets && onScreen() -> return awaitTargets(op)
|
|
818
|
+
op is PushOp -> beginPush(op)
|
|
819
|
+
op is ReplaceOp -> beginReplace(op, atOnce = !onScreen())
|
|
820
|
+
}
|
|
821
|
+
drain()
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
// The wait for the targets of the transition's elements, behind the display: the new top renders in the container
|
|
825
|
+
// meanwhile; the screen on top now is where the elements come from.
|
|
826
|
+
private fun awaitTargets(op: Op) {
|
|
827
|
+
op.awaitsTargets = false
|
|
828
|
+
val (to, animation) = when (op) {
|
|
829
|
+
is PushOp -> op.node to resolved(op.node).animations.push
|
|
830
|
+
is ReplaceOp -> op.top to resolved(op.top).animations.setStackRoot
|
|
831
|
+
else -> return
|
|
832
|
+
}
|
|
833
|
+
waiting = op
|
|
834
|
+
if (!display.isPlaced(to)) display.placeWaiting(to)
|
|
835
|
+
val token = Any()
|
|
836
|
+
op.waitToken = token
|
|
837
|
+
val still = { !destroyed && !op.done && op.waitToken === token && waiting === op && op.isCurrent() }
|
|
838
|
+
// Without `waitForRender` a `setStackRoot`'s 0.5 s holds for its content and its targets together.
|
|
839
|
+
val from = currentChild
|
|
840
|
+
op.stopTargets = display.awaitTargets(animation, from, to, { still() && !op.overLimit }) {
|
|
841
|
+
step(op) { if (still()) endWait(op) }
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
private fun stopWaiting(op: Op) {
|
|
846
|
+
if (waiting === op) waiting = null
|
|
847
|
+
op.waitToken = null
|
|
848
|
+
op.wait?.cancel()
|
|
849
|
+
op.wait = null
|
|
850
|
+
op.stopTargets?.invoke()
|
|
851
|
+
op.stopTargets = null
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
// Lower screens.
|
|
855
|
+
|
|
856
|
+
private fun placeLower(screen: Node) {
|
|
857
|
+
display.placeLower(screen)
|
|
858
|
+
var ended = false
|
|
859
|
+
var cancelLimit: () -> Unit = {}
|
|
860
|
+
val end = {
|
|
861
|
+
if (!ended) {
|
|
862
|
+
ended = true
|
|
863
|
+
cancelLimit()
|
|
864
|
+
lowerWaits.remove(screen)
|
|
865
|
+
val moved = running.any { screen in it.owned }
|
|
866
|
+
if (!destroyed && screen !== currentChild && screen in shownList && !moved) {
|
|
867
|
+
protectLower(screen) { display.detach(screen) }
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
lowerWaits[screen] = {
|
|
872
|
+
ended = true
|
|
873
|
+
cancelLimit()
|
|
874
|
+
}
|
|
875
|
+
cancelLimit = scheduler.schedule(LOWER_SCREEN_MILLIS) { end() }
|
|
876
|
+
if (readiness.isReady(screen)) end() else readiness.whenReady(screen) { deliver { end() } }
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
// The steps of a lower screen come later than any command, under no runner: a failure is logged, the stack goes on.
|
|
880
|
+
private inline fun protectLower(screen: Node, work: () -> Unit) {
|
|
881
|
+
try {
|
|
882
|
+
work()
|
|
883
|
+
} catch (e: Throwable) {
|
|
884
|
+
val reason = ErrorTexts.couldNot("make the content of the screen '${screen.id}'", ErrorTexts.reasonOf(e))
|
|
885
|
+
host.log("[ApexNavigation] $reason")
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
// A cut or a replace reaches a lower screen still placed: its wait ends, and the operation moves its view.
|
|
890
|
+
private fun endLowerWaits(screens: List<Node>) {
|
|
891
|
+
for (screen in screens) lowerWaits.remove(screen)?.invoke()
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
// Transitions.
|
|
895
|
+
|
|
896
|
+
// The screens of [op]'s transition move; it ends with the last of them. All count before any starts, so one that
|
|
897
|
+
// ends at once doesn't end the transition early.
|
|
898
|
+
private fun animate(op: Op, moves: List<Move>) {
|
|
899
|
+
moves.forEach { op.animating += it.screen }
|
|
900
|
+
for (move in moves) {
|
|
901
|
+
if (op.done) return
|
|
902
|
+
val done = { step(op) { screenDone(op, move.screen) } }
|
|
903
|
+
val custom = move.custom
|
|
904
|
+
if (custom != null) {
|
|
905
|
+
display.animateCustom(move.screen, custom, done)
|
|
906
|
+
} else {
|
|
907
|
+
display.animate(move.screen, requireNotNull(move.motion), move.fromCurrent, done)
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
// One animator of [op] ended: the transition ends with its last (an animator cancelled counts as ended).
|
|
913
|
+
private fun screenDone(op: Op, screen: Node) {
|
|
914
|
+
if (!op.animating.remove(screen)) return
|
|
915
|
+
if (op.animating.isEmpty()) finish(op)
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
// [taker] takes [screens] over from the transitions running: they stop them where they are and own them no
|
|
919
|
+
// more. The transitions left with nothing moving end after the taker changed what shows.
|
|
920
|
+
private fun takeOver(screens: List<Node>, taker: Op): List<Op> {
|
|
921
|
+
val ended = ArrayList<Op>()
|
|
922
|
+
for (other in running.toList()) {
|
|
923
|
+
if (other === taker || other.done) continue
|
|
924
|
+
for (screen in screens) {
|
|
925
|
+
if (!other.owned.remove(screen)) continue
|
|
926
|
+
if (other.animating.remove(screen)) display.stop(screen)
|
|
927
|
+
if (other.animating.isEmpty() && other !in ended) ended += other
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
return ended
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
// The transitions a newer operation took everything from end now: the stack's top isn't settled by their end, the
|
|
934
|
+
// newer operation still moves it (its own end tells it, the bar's row stays with the newer one).
|
|
935
|
+
private fun finishTakenOver(ops: List<Op>) {
|
|
936
|
+
if (ops.isEmpty()) return
|
|
937
|
+
takenOver = true
|
|
938
|
+
try {
|
|
939
|
+
finishAll(ops)
|
|
940
|
+
} finally {
|
|
941
|
+
takenOver = false
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
private fun finishAll(ops: List<Op>) {
|
|
946
|
+
for (op in ops) {
|
|
947
|
+
if (!op.done) guarded(op) { finish(op) }
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
private fun finish(op: Op) {
|
|
952
|
+
when (op) {
|
|
953
|
+
is PushOp -> finishPush(op)
|
|
954
|
+
is CutOp -> finishCut(op)
|
|
955
|
+
is ReplaceOp -> finishReplace(op)
|
|
956
|
+
is NoneOp -> Unit
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
// Answers and protection.
|
|
961
|
+
|
|
962
|
+
private fun resolve(op: Op, value: String) {
|
|
963
|
+
op.answer?.resolve(value)
|
|
964
|
+
if (!op.told) op.listener?.onSuccess(value)
|
|
965
|
+
op.told = true
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
private fun reject(op: Op, text: String) {
|
|
969
|
+
op.answer?.reject(text)
|
|
970
|
+
if (!op.told) op.listener?.onError(text)
|
|
971
|
+
op.told = true
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
// An operation ended; [top] is the screen it brought, when it brought one.
|
|
975
|
+
private fun settled(top: Node? = null) {
|
|
976
|
+
if (destroyed) return
|
|
977
|
+
host.operationEnded(!takenOver && (isAtRest || (top != null && top === currentChild)))
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
// A step of [op] that comes later (a readiness, a limit, an animator's end): nothing once it is done, or once
|
|
981
|
+
// the JavaScript of its command went (a reload takes the stack).
|
|
982
|
+
private inline fun step(op: Op, crossinline work: () -> Unit) {
|
|
983
|
+
if (destroyed || op.done || !op.isCurrent()) return
|
|
984
|
+
guarded(op) { work() }
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
// The protection of the runner covers only a command's body: what runs later is protected here.
|
|
988
|
+
private inline fun guarded(op: Op, work: () -> Unit) {
|
|
989
|
+
try {
|
|
990
|
+
work()
|
|
991
|
+
} catch (e: Throwable) {
|
|
992
|
+
fail(op, e)
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
// A failure while [op] runs: it rejects with its error text, the nodes it made that never showed go silently, the
|
|
997
|
+
// entries are what still shows, and the queue goes on.
|
|
998
|
+
private fun fail(op: Op, e: Throwable) {
|
|
999
|
+
val text = ErrorTexts.couldNot(op.what, ErrorTexts.reasonOf(e))
|
|
1000
|
+
if (op.answer == null && op.listener == null) host.log("[ApexNavigation] $text")
|
|
1001
|
+
if (op.done) {
|
|
1002
|
+
// It failed at its end: an answer not given yet is a rejection; one given stays.
|
|
1003
|
+
destroyLeftBehind(op)
|
|
1004
|
+
if (op.answer?.isAnswered == false) op.answer.reject(text)
|
|
1005
|
+
if (!op.told) op.listener?.onError(text)
|
|
1006
|
+
op.told = true
|
|
1007
|
+
running.remove(op)
|
|
1008
|
+
settled()
|
|
1009
|
+
return drain()
|
|
1010
|
+
}
|
|
1011
|
+
op.done = true
|
|
1012
|
+
stopWaiting(op)
|
|
1013
|
+
op.cancelLimit?.invoke()
|
|
1014
|
+
queued.remove(op)
|
|
1015
|
+
running.remove(op)
|
|
1016
|
+
op.animating.toList().forEach { runCatching { display.stop(it) } }
|
|
1017
|
+
op.animating.clear()
|
|
1018
|
+
// The screens it moved that still show come to rest, as at an end: none stays faded out or moved aside.
|
|
1019
|
+
if (display.hasView) op.owned.filter { it in shownList }.forEach { runCatching { display.rest(it) } }
|
|
1020
|
+
op.owned.clear()
|
|
1021
|
+
val made = when (op) {
|
|
1022
|
+
is PushOp -> listOf(op.node)
|
|
1023
|
+
is ReplaceOp -> op.nodes
|
|
1024
|
+
else -> emptyList()
|
|
1025
|
+
}
|
|
1026
|
+
for (node in made) {
|
|
1027
|
+
if (node in shownList) continue
|
|
1028
|
+
entryList.remove(node)
|
|
1029
|
+
runCatching { if (display.hasView) display.remove(node) }
|
|
1030
|
+
runCatching { node.destroy() }
|
|
1031
|
+
}
|
|
1032
|
+
destroyLeftBehind(op)
|
|
1033
|
+
restoreEntries()
|
|
1034
|
+
reject(op, text)
|
|
1035
|
+
host.tabBarTransition(TabBarMotion.Move.AtOnce, null)
|
|
1036
|
+
host.barTransition(null, BarVisibility.AT_ONCE)
|
|
1037
|
+
host.currentChildChanged()
|
|
1038
|
+
settled()
|
|
1039
|
+
drain()
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
// A cut or a replace that failed after it took screens off what shows leaves them in [leavingList] only, where
|
|
1043
|
+
// nothing would destroy them before the stack itself: those that are no entry, don't show and no transition moves
|
|
1044
|
+
// go now, silently, their views out of the container (as iOS).
|
|
1045
|
+
private fun destroyLeftBehind(op: Op) {
|
|
1046
|
+
val left = when (op) {
|
|
1047
|
+
is CutOp -> op.leaving
|
|
1048
|
+
is ReplaceOp -> op.old
|
|
1049
|
+
else -> return
|
|
1050
|
+
}
|
|
1051
|
+
for (node in left) {
|
|
1052
|
+
if (node !in leavingList || node in entryList || node in shownList) continue
|
|
1053
|
+
if (running.any { node in it.owned }) continue
|
|
1054
|
+
leavingList -= node
|
|
1055
|
+
runCatching { if (display.hasView) display.remove(node) }
|
|
1056
|
+
runCatching { node.destroy() }
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
// The entries after a failure: what shows, then the screens of the pushes still on their way.
|
|
1061
|
+
private fun restoreEntries() {
|
|
1062
|
+
val pending = ArrayList<Node>()
|
|
1063
|
+
(waiting as? PushOp)?.let { pending += it.node }
|
|
1064
|
+
queued.forEach { if (it is PushOp) pending += it.node }
|
|
1065
|
+
val restored = (shownList + pending.filter { it !in shownList }).distinct()
|
|
1066
|
+
entryList.clear()
|
|
1067
|
+
entryList += restored
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
private fun onScreen(): Boolean = display.hasView && display.isOnScreen
|
|
1071
|
+
|
|
1072
|
+
// The options a screen shows with; a pair's are its options screen's.
|
|
1073
|
+
private fun resolved(node: Node): Options {
|
|
1074
|
+
val screen = (node as? OptionsScreen)?.optionsScreen ?: node
|
|
1075
|
+
return screen.resolveCurrentOptions(DefaultOptions.current)
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
private fun nextSequence(): Int = ++sequence
|
|
1079
|
+
|
|
1080
|
+
// A push or a `setStackRoot` that will animate waits for its elements' targets, unless `waitForRender: false`.
|
|
1081
|
+
private fun awaitsTargets(animation: StackAnimationOptions, enabled: Boolean): Boolean = enabled &&
|
|
1082
|
+
display.canAnimate && !animation.waitForRender.isFalse && AnimationRules.hasElements(animation)
|
|
1083
|
+
|
|
1084
|
+
// The bars with a change of the current child. The row goes with the default transition only; the tab bar rides
|
|
1085
|
+
// with the system's [system] move, slides with an animation of its own or a side of its own, and is where the new
|
|
1086
|
+
// top wants it at once without animation; with elements every bar changes at once.
|
|
1087
|
+
private fun tellBars(
|
|
1088
|
+
animated: Boolean,
|
|
1089
|
+
own: Boolean,
|
|
1090
|
+
elements: Boolean,
|
|
1091
|
+
animation: StackAnimationOptions,
|
|
1092
|
+
system: TabBarMotion.Move,
|
|
1093
|
+
row: BarMotion,
|
|
1094
|
+
) {
|
|
1095
|
+
val tabs = animation.bottomTabs
|
|
1096
|
+
val tabsSide = AnimationRules.barSideGiven(tabs.enter) || AnimationRules.barSideGiven(tabs.exit)
|
|
1097
|
+
val move = when {
|
|
1098
|
+
!animated || elements -> TabBarMotion.Move.AtOnce
|
|
1099
|
+
own || tabsSide -> TabBarMotion.Move.Slide
|
|
1100
|
+
else -> system
|
|
1101
|
+
}
|
|
1102
|
+
host.tabBarTransition(move, tabs.takeIf { move == TabBarMotion.Move.Slide })
|
|
1103
|
+
host.barTransition(if (animated && !own) row else null, barVisibility(animated && !elements, animation.topBar))
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
private fun barVisibility(animated: Boolean, side: TopBarEnterExitAnimationOptions): BarVisibility =
|
|
1107
|
+
if (animated) BarVisibility(true, side) else BarVisibility.AT_ONCE
|
|
1108
|
+
|
|
1109
|
+
// Push and `setStackRoot` (forward): the arriving screen plays `enter` with its alpha before any hide, the one it
|
|
1110
|
+
// covers plays `exit`; a side that doesn't play leaves its screen as it is. With elements the arriving screen fades
|
|
1111
|
+
// in (by its `enter` only when that is a single `alpha`), the other stands, and the arriving screen's animator
|
|
1112
|
+
// carries the elements.
|
|
1113
|
+
private fun forwardMoves(arriving: Node, covered: Node?, animation: StackAnimationOptions, elements: Boolean) =
|
|
1114
|
+
listOfNotNull(
|
|
1115
|
+
Move(arriving, custom = if (elements) {
|
|
1116
|
+
val side = animation.content.enter.takeIf(AnimationRules::isSingleAlpha)
|
|
1117
|
+
val fade = if (side == null) Fade.In else Fade.None
|
|
1118
|
+
Custom(side, fade, ARRIVING_ALPHA, Elements(animation, covered, arriving))
|
|
1119
|
+
} else {
|
|
1120
|
+
Custom(animation.content.enter.takeIf(AnimationRules::sidePlays), alpha = ARRIVING_ALPHA)
|
|
1121
|
+
}),
|
|
1122
|
+
covered?.let {
|
|
1123
|
+
Move(it, custom = Custom(animation.content.exit.takeIf { !elements && AnimationRules.sidePlays(it) }))
|
|
1124
|
+
},
|
|
1125
|
+
)
|
|
1126
|
+
|
|
1127
|
+
// Pop: the leaving screen plays `exit` from where it is, the revealed one `enter` from its alpha at rest — a lower
|
|
1128
|
+
// screen still rendering under the others is transparent, one a running transition still moves starts where it is;
|
|
1129
|
+
// with elements the leaving one fades out (its `exit` only when a single `alpha`) and carries them, the revealed
|
|
1130
|
+
// one stands.
|
|
1131
|
+
private fun backMoves(
|
|
1132
|
+
leaving: Node,
|
|
1133
|
+
revealed: Node,
|
|
1134
|
+
animation: StackAnimationOptions,
|
|
1135
|
+
elements: Boolean,
|
|
1136
|
+
moving: Boolean,
|
|
1137
|
+
) = listOf(
|
|
1138
|
+
Move(leaving, custom = if (elements) {
|
|
1139
|
+
val side = animation.content.exit.takeIf(AnimationRules::isSingleAlpha)
|
|
1140
|
+
Custom(side, if (side == null) Fade.Out else Fade.None, elements = Elements(animation, leaving, revealed))
|
|
1141
|
+
} else {
|
|
1142
|
+
Custom(animation.content.exit.takeIf(AnimationRules::sidePlays))
|
|
1143
|
+
}),
|
|
1144
|
+
Move(revealed, custom = Custom(
|
|
1145
|
+
animation.content.enter.takeIf { !elements && AnimationRules.sidePlays(it) },
|
|
1146
|
+
alpha = if (moving) null else ARRIVING_ALPHA,
|
|
1147
|
+
)),
|
|
1148
|
+
)
|
|
1149
|
+
|
|
1150
|
+
private enum class Wait { None, Content, Limited, Prepared }
|
|
1151
|
+
|
|
1152
|
+
// A screen a transition moves: by a default [motion] (from where it is when [fromCurrent]), or by an animation of
|
|
1153
|
+
// its own ([custom]).
|
|
1154
|
+
private class Move(
|
|
1155
|
+
val screen: Node,
|
|
1156
|
+
val motion: Motion? = null,
|
|
1157
|
+
val fromCurrent: Boolean = false,
|
|
1158
|
+
val custom: Custom? = null,
|
|
1159
|
+
)
|
|
1160
|
+
|
|
1161
|
+
private abstract class Op(
|
|
1162
|
+
val seq: Int,
|
|
1163
|
+
val answer: CommandAnswer?,
|
|
1164
|
+
val listener: CommandListener?,
|
|
1165
|
+
val componentId: String,
|
|
1166
|
+
val what: String,
|
|
1167
|
+
) {
|
|
1168
|
+
// The JavaScript the operation came from: its later steps do nothing once it went.
|
|
1169
|
+
private val generation = ReloadCoordinator.generation
|
|
1170
|
+
var done = false
|
|
1171
|
+
// The screens its transition moves, and those whose animators still run.
|
|
1172
|
+
val owned = LinkedHashSet<Node>()
|
|
1173
|
+
val animating = LinkedHashSet<Node>()
|
|
1174
|
+
// Its wait for its screen to render; the token of a prepared push's or of the targets' wait.
|
|
1175
|
+
var wait: RenderWait? = null
|
|
1176
|
+
var waitToken: Any? = null
|
|
1177
|
+
// The node its content wait waits for.
|
|
1178
|
+
var waitedNode: Node? = null
|
|
1179
|
+
// It waits for its elements' targets after its content; what stops that wait.
|
|
1180
|
+
var awaitsTargets = false
|
|
1181
|
+
var stopTargets: (() -> Unit)? = null
|
|
1182
|
+
// The limit of a `setStackRoot` without `waitForRender` passed: its targets get nothing of it any more.
|
|
1183
|
+
var overLimit = false
|
|
1184
|
+
var cancelLimit: (() -> Unit)? = null
|
|
1185
|
+
// Its screen came by an animation of its own: it stays at that animation's end values.
|
|
1186
|
+
var keepsEnd = false
|
|
1187
|
+
// The listener of a module heard its answer: it hears one only.
|
|
1188
|
+
var told = false
|
|
1189
|
+
|
|
1190
|
+
fun isCurrent(): Boolean = ReloadCoordinator.isCurrent(generation)
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
private class PushOp(
|
|
1194
|
+
seq: Int,
|
|
1195
|
+
answer: CommandAnswer?,
|
|
1196
|
+
componentId: String,
|
|
1197
|
+
what: String,
|
|
1198
|
+
val node: Node,
|
|
1199
|
+
val prepared: Boolean,
|
|
1200
|
+
) : Op(seq, answer, null, componentId, what) {
|
|
1201
|
+
var covered: Node? = null
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
private class CutOp(
|
|
1205
|
+
seq: Int,
|
|
1206
|
+
answer: CommandAnswer?,
|
|
1207
|
+
componentId: String,
|
|
1208
|
+
what: String,
|
|
1209
|
+
val target: Node,
|
|
1210
|
+
val value: String?,
|
|
1211
|
+
val silent: Boolean,
|
|
1212
|
+
) : Op(seq, answer, null, componentId, what) {
|
|
1213
|
+
var leaving: List<Node> = emptyList()
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
private class ReplaceOp(
|
|
1217
|
+
seq: Int,
|
|
1218
|
+
answer: CommandAnswer?,
|
|
1219
|
+
listener: CommandListener?,
|
|
1220
|
+
componentId: String,
|
|
1221
|
+
what: String,
|
|
1222
|
+
val nodes: List<Node>,
|
|
1223
|
+
val animated: Boolean,
|
|
1224
|
+
val asPush: Boolean,
|
|
1225
|
+
val waits: Boolean,
|
|
1226
|
+
) : Op(seq, answer, listener, componentId, what) {
|
|
1227
|
+
val top: Node
|
|
1228
|
+
get() = nodes.last()
|
|
1229
|
+
var old: List<Node> = emptyList()
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
private class NoneOp(
|
|
1233
|
+
seq: Int,
|
|
1234
|
+
answer: CommandAnswer?,
|
|
1235
|
+
listener: CommandListener?,
|
|
1236
|
+
componentId: String,
|
|
1237
|
+
what: String,
|
|
1238
|
+
val value: String?,
|
|
1239
|
+
val target: Node?,
|
|
1240
|
+
) : Op(seq, answer, listener, componentId, what)
|
|
1241
|
+
|
|
1242
|
+
companion object {
|
|
1243
|
+
/** How long the new top of a `setStackRoot` waits for its content without `waitForRender`. */
|
|
1244
|
+
const val SET_STACK_ROOT_WAIT_MILLIS = 500L
|
|
1245
|
+
|
|
1246
|
+
/**
|
|
1247
|
+
* After how long, from the start of a `waitForRender: true` wait, a screen whose id no safe area view reported
|
|
1248
|
+
* yet counts as ready.
|
|
1249
|
+
*/
|
|
1250
|
+
const val NULL_CONTENT_MILLIS = RenderWait.UNKNOWN_CONTENT_MILLIS
|
|
1251
|
+
|
|
1252
|
+
/** How long a wait goes on for the bar's components after the content, at most. */
|
|
1253
|
+
const val BAR_WAIT_MILLIS = RenderWait.BAR_PHASE_MILLIS
|
|
1254
|
+
|
|
1255
|
+
/** How long a lower screen stays placed in the container to make its content, at most. */
|
|
1256
|
+
const val LOWER_SCREEN_MILLIS = 500L
|
|
1257
|
+
|
|
1258
|
+
/** How long the push of a screen with its own root waits for its content, with the switch on. */
|
|
1259
|
+
const val OWN_ROOT_WAIT_MILLIS = 500L
|
|
1260
|
+
|
|
1261
|
+
// The alpha an arriving screen shows with: its own at rest, never the 0 of its wait.
|
|
1262
|
+
private const val ARRIVING_ALPHA = 1f
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
/**
|
|
1267
|
+
* The internal switches of the stack. [preparesOwnRootPushes]: the push of a React screen with a root of its own starts
|
|
1268
|
+
* its surface hidden in the stack at its size and insets, and starts its transition once the content rendered, 0.5 s at
|
|
1269
|
+
* most. Off by default («б»: the push starts at once); it is measured at the end on a phone.
|
|
1270
|
+
*/
|
|
1271
|
+
internal object StackSwitches {
|
|
1272
|
+
@Volatile
|
|
1273
|
+
var preparesOwnRootPushes = false
|
|
1274
|
+
}
|