@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
package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt
ADDED
|
@@ -0,0 +1,1269 @@
|
|
|
1
|
+
package dev.apexnative.navigation.viewcontrollers.modal
|
|
2
|
+
|
|
3
|
+
import dev.apexnative.navigation.options.DefaultOptions
|
|
4
|
+
import dev.apexnative.navigation.options.LayoutAnimation
|
|
5
|
+
import dev.apexnative.navigation.options.ModalAnimationOptions
|
|
6
|
+
import dev.apexnative.navigation.options.Options
|
|
7
|
+
import dev.apexnative.navigation.options.SheetDetent
|
|
8
|
+
import dev.apexnative.navigation.options.ViewAnimationOptions
|
|
9
|
+
import dev.apexnative.navigation.react.CommandAnswer
|
|
10
|
+
import dev.apexnative.navigation.react.CommandListener
|
|
11
|
+
import dev.apexnative.navigation.react.ErrorTexts
|
|
12
|
+
import dev.apexnative.navigation.react.events.AppearanceDispatcher
|
|
13
|
+
import dev.apexnative.navigation.viewcontrollers.component.Readiness
|
|
14
|
+
import dev.apexnative.navigation.viewcontrollers.component.RenderWait
|
|
15
|
+
import dev.apexnative.navigation.viewcontrollers.modal.ModalRecord.Dismissal
|
|
16
|
+
import dev.apexnative.navigation.viewcontrollers.modal.ModalRecord.State
|
|
17
|
+
import dev.apexnative.navigation.viewcontrollers.navigator.RootCoordinator
|
|
18
|
+
import dev.apexnative.navigation.viewcontrollers.navigator.WaitingLayer
|
|
19
|
+
import dev.apexnative.navigation.viewcontrollers.stack.StackController
|
|
20
|
+
import dev.apexnative.navigation.viewcontrollers.viewcontroller.ViewController
|
|
21
|
+
import dev.apexnative.navigation.views.animations.AnimationRules
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* The modals of one activity: one [ModalRecord] per modal, in the order of their shows, the newest last. Every rule
|
|
25
|
+
* about modals is a move of one record, applied when the step runs;
|
|
26
|
+
* nothing else keeps a list of modals: the navigator, the navigation state, back and the reload ask here.
|
|
27
|
+
*
|
|
28
|
+
* A modal is made, joins the modals layer at the top, unseen, and waits for its screens with the core's one wait
|
|
29
|
+
* ([RenderWait], `animations.showModal.enter.waitForRender` unset — the content and the bars' components at most
|
|
30
|
+
* [WAIT_LIMIT_MILLIS] together; `true` — as long as it takes, the bars 0.5 s after; `false` — not at all). Then it
|
|
31
|
+
* shows, once every older waiting modal showed or went (N1): `ComponentWillAppear` of its screens, its slide up (or the
|
|
32
|
+
* Material sheet's motion), then the layer under it leaves its layer when the modal covers it, and the end steps of a
|
|
33
|
+
* transition. Android has no gate: transitions overlap.
|
|
34
|
+
*
|
|
35
|
+
* The views, the readiness of the screens and the clock are given ([Views], [Readiness], the scheduler), so the table
|
|
36
|
+
* runs in unit tests. Main thread only.
|
|
37
|
+
*
|
|
38
|
+
* The steps that come later (the wait's timers and readiness signals, the end of the targets' wait, an animator's end,
|
|
39
|
+
* the sheet's callbacks, back of the user) run under no runner: each goes through one guard ([guarded]), and a
|
|
40
|
+
* failure there ends the record it concerns by its own failure path, rejects what waits for it with its error text and
|
|
41
|
+
* lets the modals that wait go on (ARCHITECTURE.md section 5).
|
|
42
|
+
*/
|
|
43
|
+
internal class ModalCoordinator(
|
|
44
|
+
private val views: Views,
|
|
45
|
+
private val readiness: Readiness,
|
|
46
|
+
private val scheduler: AppearanceDispatcher.Scheduler,
|
|
47
|
+
private val host: Host,
|
|
48
|
+
) : RootCoordinator.ModalsOverRoot {
|
|
49
|
+
/** What the modals ask of their activity's navigation. */
|
|
50
|
+
interface Host {
|
|
51
|
+
/** The root the modals lie over; none before the first `setRoot` (the splash is under them then). */
|
|
52
|
+
val root: ViewController<*>?
|
|
53
|
+
|
|
54
|
+
/** The node with [id] in the activity's registry; none. */
|
|
55
|
+
fun find(id: String): ViewController<*>?
|
|
56
|
+
|
|
57
|
+
/** Whether the activity can be seen (at least started): animations play only then, as frames come only then. */
|
|
58
|
+
fun isSeen(): Boolean
|
|
59
|
+
|
|
60
|
+
/** [layer] waits to show from now on (`Navigator.addWaitingLayer`). */
|
|
61
|
+
fun addWaitingLayer(layer: WaitingLayer)
|
|
62
|
+
|
|
63
|
+
/** [layer] no longer waits to show. */
|
|
64
|
+
fun removeWaitingLayer(layer: WaitingLayer)
|
|
65
|
+
|
|
66
|
+
/** What back does may have changed (`BackCallbackState.update`). */
|
|
67
|
+
fun backChanged()
|
|
68
|
+
|
|
69
|
+
/** Writes [text] to the log. */
|
|
70
|
+
fun log(text: String)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** The views of the modals layer and of the root layer under it. Main thread only. */
|
|
74
|
+
interface Views {
|
|
75
|
+
/**
|
|
76
|
+
* The record's container joins the modals layer at the top, waiting: transparent, without touches, unseen by
|
|
77
|
+
* accessibility, with its root's view in it (a sheet's at the sheet's full height). It may throw: nothing of
|
|
78
|
+
* it stays then.
|
|
79
|
+
*/
|
|
80
|
+
fun place(record: ModalRecord)
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* The record shows with [options] (resolved): its container visible, its slide up when [animated] — or
|
|
84
|
+
* [motion], an animation of its own —, at once otherwise and while nobody [seen] it; a sheet's root view goes
|
|
85
|
+
* into a Material sheet that slides to its first detent ([events] hear the user), whatever the options' own.
|
|
86
|
+
* [onEnd] once it is in place, at most once. The function returned stops it where it is, without [onEnd]; a
|
|
87
|
+
* screen under it that its [motion] moved goes back to rest then.
|
|
88
|
+
*/
|
|
89
|
+
fun present(
|
|
90
|
+
record: ModalRecord,
|
|
91
|
+
options: Options,
|
|
92
|
+
animated: Boolean,
|
|
93
|
+
seen: Boolean,
|
|
94
|
+
events: ModalSheet.Events,
|
|
95
|
+
onEnd: () -> Unit,
|
|
96
|
+
motion: Motion?,
|
|
97
|
+
): () -> Unit
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* The record leaves: its slide down (or [motion]) when [animated] and [seen], a sheet's when [seen]; as
|
|
101
|
+
* [present].
|
|
102
|
+
*/
|
|
103
|
+
fun dismiss(
|
|
104
|
+
record: ModalRecord,
|
|
105
|
+
animated: Boolean,
|
|
106
|
+
seen: Boolean,
|
|
107
|
+
onEnd: () -> Unit,
|
|
108
|
+
motion: Motion?,
|
|
109
|
+
): () -> Unit
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The wait of the record's show for the targets of [animation]'s elements in its screens (and in [under]'s),
|
|
113
|
+
* as a stack's, while [waiting] holds; [done] once, not after the function returned stopped it.
|
|
114
|
+
*/
|
|
115
|
+
fun awaitTargets(
|
|
116
|
+
record: ModalRecord,
|
|
117
|
+
animation: ModalAnimationOptions,
|
|
118
|
+
under: ViewController<*>?,
|
|
119
|
+
waiting: () -> Boolean,
|
|
120
|
+
done: () -> Unit,
|
|
121
|
+
): () -> Unit {
|
|
122
|
+
done()
|
|
123
|
+
return {}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** The record's views leave (a sheet's `remove()`); the modals layer hides when it holds none. */
|
|
127
|
+
fun remove(record: ModalRecord)
|
|
128
|
+
|
|
129
|
+
/** The record's show was stopped: its views stand where it ends (a sheet's goes on as its view is shown). */
|
|
130
|
+
fun settle(record: ModalRecord)
|
|
131
|
+
|
|
132
|
+
/** The record's container leaves the modals layer: a modal over it covers it. */
|
|
133
|
+
fun takeOut(record: ModalRecord)
|
|
134
|
+
|
|
135
|
+
/** The record's container comes back into the modals layer, at the place of [at], else at the top. */
|
|
136
|
+
fun putBack(record: ModalRecord, at: ModalRecord?)
|
|
137
|
+
|
|
138
|
+
/** [root]'s view leaves the root layer: a modal over it covers it. */
|
|
139
|
+
fun takeOutRoot(root: ViewController<*>)
|
|
140
|
+
|
|
141
|
+
/** [root]'s view comes back into the root layer. */
|
|
142
|
+
fun putBackRoot(root: ViewController<*>)
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* The record goes with [oldRoot]: its container moves into the root layer right above the old root's view
|
|
146
|
+
* (under the new root), and leaves with the old root's part of the transition.
|
|
147
|
+
*/
|
|
148
|
+
fun carry(record: ModalRecord, oldRoot: ViewController<*>?)
|
|
149
|
+
|
|
150
|
+
/** New [options] (resolved) of the record: its `testID`s, its sheet's `update` ([move]: to its selection). */
|
|
151
|
+
fun update(record: ModalRecord, options: Options, move: Boolean)
|
|
152
|
+
|
|
153
|
+
/** The colors of the record's own views again (a light/dark switch). */
|
|
154
|
+
fun repaint(record: ModalRecord) = Unit
|
|
155
|
+
|
|
156
|
+
/** The record's views lay out again (the activity resumed). */
|
|
157
|
+
fun requestLayout(record: ModalRecord) = Unit
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* A show or a dismissal of the modal's own: [side] plays on the modal (the show's `enter`, the dismissal's `exit`),
|
|
162
|
+
* or it fades ([fades]: in at a show, out at a dismissal, 300 ms) around elements; with neither it doesn't move —
|
|
163
|
+
* it appears on the first frame, or stands to the end and goes. [underSide] plays on [under], the layer under it
|
|
164
|
+
* (the show's `exit`, the dismissal's `enter`). [elements]: the animation's elements from [from] to [to] (only with
|
|
165
|
+
* a layer under it).
|
|
166
|
+
*/
|
|
167
|
+
class Motion(
|
|
168
|
+
val side: ViewAnimationOptions?,
|
|
169
|
+
val fades: Boolean,
|
|
170
|
+
val under: ViewController<*>?,
|
|
171
|
+
val underSide: ViewAnimationOptions?,
|
|
172
|
+
val elements: LayoutAnimation?,
|
|
173
|
+
val from: ViewController<*>?,
|
|
174
|
+
val to: ViewController<*>?,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
// A `dismissAllModals` on its way.
|
|
178
|
+
private class Batch(val answer: CommandAnswer?) {
|
|
179
|
+
var members: List<ModalRecord> = emptyList()
|
|
180
|
+
// The record that leaves with its animation; none: they all go at once.
|
|
181
|
+
var top: ModalRecord? = null
|
|
182
|
+
// The modals it reports, and the screen the event names (the topmost counted record's).
|
|
183
|
+
var count = 0
|
|
184
|
+
var screen: ViewController<*>? = null
|
|
185
|
+
// The layer it reveals, when that had disappeared.
|
|
186
|
+
var revealed: ViewController<*>? = null
|
|
187
|
+
// The `dismissAllModals` that came during it and found nothing else (N6).
|
|
188
|
+
val later = mutableListOf<CommandAnswer>()
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
private val records = mutableListOf<ModalRecord>()
|
|
192
|
+
private val batches = mutableListOf<Batch>()
|
|
193
|
+
// The records that go with the old root of a `setRoot` in its transition (row 13), and the answers they hold.
|
|
194
|
+
private val carried = mutableListOf<ModalRecord>()
|
|
195
|
+
private val carriedAnswers = mutableListOf<CommandAnswer>()
|
|
196
|
+
// The root's view is out of the root layer: a modal covers it.
|
|
197
|
+
private var rootOut = false
|
|
198
|
+
// The ids of the modals that closed while no command waits for them: the user closed them (a drag, the scrim,
|
|
199
|
+
// back) or they were dismissed from below a modal that stays. `dismissModal` with one resolves.
|
|
200
|
+
private val closedAnswerable = HashMap<String, String>()
|
|
201
|
+
// A setRoot takes the modals now: one that waits goes, and none starts to show meanwhile.
|
|
202
|
+
private var taking = false
|
|
203
|
+
|
|
204
|
+
/** Every modal not gone, bottom to top. */
|
|
205
|
+
val modals: List<ModalRecord>
|
|
206
|
+
get() = records.toList()
|
|
207
|
+
|
|
208
|
+
/** The layout the user sees among the modals: the top modal that shows or comes in; none. */
|
|
209
|
+
val visibleLayout: ViewController<*>?
|
|
210
|
+
get() = records.lastOrNull { it.effective == State.Presenting || it.effective == State.Shown }?.root
|
|
211
|
+
|
|
212
|
+
/** The tops of the modals not gone, bottom to top: what the repaint walks. */
|
|
213
|
+
fun layers(): List<ViewController<*>> = records.map { it.root }
|
|
214
|
+
|
|
215
|
+
/** The modal [node] is in; none for a node of the root, an overlay, or no modal. */
|
|
216
|
+
fun recordOf(node: ViewController<*>): ModalRecord? {
|
|
217
|
+
val top = topOf(node)
|
|
218
|
+
return records.firstOrNull { it.root === top }
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* [node] is in a modal of the old root of a `setRoot` on its way (`setRoot` step 3): commands by its id answer "not
|
|
223
|
+
* shown", though it is still on screen.
|
|
224
|
+
*/
|
|
225
|
+
fun isWithOldRoot(node: ViewController<*>): Boolean {
|
|
226
|
+
val top = topOf(node)
|
|
227
|
+
return records.any { it.root === top && it.state == State.WithOldRoot } || carried.any { it.root === top }
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Commands.
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* `showModal` after its checks: [make] makes the tree; the modal is the top at once, waiting (`showModal` step 2),
|
|
234
|
+
* and [answer] resolves with its root's id after its show. A failure to make or place it goes to the caller, which
|
|
235
|
+
* rejects; nothing of it stays then.
|
|
236
|
+
*/
|
|
237
|
+
fun show(make: () -> ViewController<*>, answer: CommandAnswer) {
|
|
238
|
+
start(make, answer, null)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* A modal of a `setRoot`'s layout: made now, shown without animation unless [animated] (the last modal, with its
|
|
243
|
+
* `animations.showModal`); [done] once it showed or went. A failure is logged and skipped. The function returned
|
|
244
|
+
* stops the step while the modal waits (a newer `setRoot`): it goes without a word.
|
|
245
|
+
*/
|
|
246
|
+
fun showInChain(id: String, make: () -> ViewController<*>, animated: Boolean, done: () -> Unit): () -> Unit {
|
|
247
|
+
val record = try {
|
|
248
|
+
start(make, null, ModalRecord.Chain(animated, done))
|
|
249
|
+
} catch (e: Throwable) {
|
|
250
|
+
val reason = ErrorTexts.reasonOf(e)
|
|
251
|
+
host.log("[ApexNavigation] setRoot: ${ErrorTexts.couldNot("show the screen '$id'", reason)}")
|
|
252
|
+
done()
|
|
253
|
+
return {}
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
record.chain = null
|
|
257
|
+
if (record.state == State.Waiting) cancel(record, null, reports = false)
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* `dismissModal` after its shared steps: the record of [componentId], Android's rule of the last modal without a
|
|
263
|
+
* root, [options] merged into the modal's visible screen, the animation of the command's screen with its parents
|
|
264
|
+
* and the defaults, then the record's move (row 4).
|
|
265
|
+
*/
|
|
266
|
+
fun dismiss(componentId: String, options: Options?, answer: CommandAnswer) {
|
|
267
|
+
val node = host.find(componentId)
|
|
268
|
+
val record = when (val found = lookup(componentId, node)) {
|
|
269
|
+
Lookup.NotShown -> return answer.reject(ErrorTexts.screenNotShown(componentId))
|
|
270
|
+
Lookup.NotInModal -> return answer.reject(ErrorTexts.notInModal(componentId))
|
|
271
|
+
is Lookup.Closed -> return answer.resolve(found.rootId)
|
|
272
|
+
is Lookup.Found -> found.record
|
|
273
|
+
}
|
|
274
|
+
when (record.state) {
|
|
275
|
+
State.WithOldRoot, State.Gone -> return answer.reject(ErrorTexts.screenNotShown(componentId))
|
|
276
|
+
State.ClosedBelow -> return answer.resolve(record.rootId)
|
|
277
|
+
else -> Unit
|
|
278
|
+
}
|
|
279
|
+
if (isLastWithoutRoot(record)) return answer.reject(ErrorTexts.modalWithoutRoot(componentId))
|
|
280
|
+
options?.let { mergeInto(record, it) }
|
|
281
|
+
val from = node?.takeUnless { it.isDestroyed } ?: record.root
|
|
282
|
+
val animation = from.resolveCurrentOptions(DefaultOptions.current).animations.dismissModal
|
|
283
|
+
request(record, Dismissal(answer, AnimationRules.dismissAnimated(animation), byUser = false, animation))
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* `dismissAllModals` after its shared steps: [options] merge into the top modal's visible screen and its
|
|
288
|
+
* `animations.dismissModal` decides the animation of the top one; every modal goes in one batch with one
|
|
289
|
+
* `ANN.ModalDismissed`; the answer is `''`. A value of [options] that can't be read ([unreadablePath]) rejects
|
|
290
|
+
* before anything changes, with the id of the top modal's visible screen.
|
|
291
|
+
*/
|
|
292
|
+
fun dismissAll(options: Options?, unreadablePath: String?, answer: CommandAnswer) {
|
|
293
|
+
val members = records.filter { it.batch == null && it.state in BATCHED }
|
|
294
|
+
if (members.isEmpty()) {
|
|
295
|
+
// Nothing else to take: the second one answers with the running batch (N6), else at once.
|
|
296
|
+
val running = batches.lastOrNull()
|
|
297
|
+
if (running != null) running.later += answer else answer.resolve("")
|
|
298
|
+
return
|
|
299
|
+
}
|
|
300
|
+
val top = topRecord() ?: members.last()
|
|
301
|
+
if (unreadablePath != null) {
|
|
302
|
+
val screen = AppearanceDispatcher.visibleNode(top.root)
|
|
303
|
+
return answer.reject(ErrorTexts.unreadableOption(unreadablePath, screen.id))
|
|
304
|
+
}
|
|
305
|
+
options?.let { mergeInto(top, it) }
|
|
306
|
+
val animation = top.root.resolveShownOptions(DefaultOptions.current).animations.dismissModal
|
|
307
|
+
startBatch(members, answer, AnimationRules.dismissAnimated(animation), animation)
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Back.
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Back after JavaScript's listeners: the top modal that waits, comes in or shows, first — its content goes back if
|
|
314
|
+
* it can; else `hardwareBackButton.dismissModalOnPress` of its options at this moment: `true` closes it as
|
|
315
|
+
* `dismissModal` of its root, without a promise; `false` sends `ANN.NavigationButtonPressed` with
|
|
316
|
+
* `ApexNavigation.hardwareBackButton`. Null without such a modal: back goes to the root. False when back isn't
|
|
317
|
+
* taken: the only modal over no root.
|
|
318
|
+
*/
|
|
319
|
+
fun handleBack(listener: CommandListener): Boolean? {
|
|
320
|
+
val record = backTarget() ?: return null
|
|
321
|
+
val what = "go back from the screen '${record.rootId}'"
|
|
322
|
+
// Only a failure of the modal's own dismissal ends the modal; one of its content's back or of the event leaves
|
|
323
|
+
// it as it was (a modal that waits or comes in goes on with its show).
|
|
324
|
+
var dismissal: Dismissal? = null
|
|
325
|
+
logged(what) {
|
|
326
|
+
if (record.root.handleBack(listener)) return true
|
|
327
|
+
if (holdsBack(record)) {
|
|
328
|
+
AppearanceDispatcher.navigationButtonPressed(
|
|
329
|
+
AppearanceDispatcher.visibleNode(record.root),
|
|
330
|
+
StackController.HARDWARE_BACK_BUTTON_ID,
|
|
331
|
+
)
|
|
332
|
+
return true
|
|
333
|
+
}
|
|
334
|
+
if (isLastWithoutRoot(record)) return false
|
|
335
|
+
val animation = record.root.resolveCurrentOptions(DefaultOptions.current).animations.dismissModal
|
|
336
|
+
dismissal = Dismissal(null, AnimationRules.dismissAnimated(animation), byUser = true, animation)
|
|
337
|
+
}
|
|
338
|
+
val taken = dismissal ?: return true
|
|
339
|
+
try {
|
|
340
|
+
request(record, taken)
|
|
341
|
+
} catch (e: Throwable) {
|
|
342
|
+
fail(record, e, what)
|
|
343
|
+
}
|
|
344
|
+
return true
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/** The mirror of [handleBack], without acting; null without a modal to ask. */
|
|
348
|
+
fun canHandleBack(): Boolean? {
|
|
349
|
+
val record = backTarget() ?: return null
|
|
350
|
+
return record.root.canHandleBack() || holdsBack(record) || !isLastWithoutRoot(record)
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Options.
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* A `mergeOptions` went into [node] (`mergeOptions` step 5): when it is in a modal, the modal's sheet takes its
|
|
357
|
+
* options again (it re-reads the resolved ones at any merge) and its `testID`s apply again.
|
|
358
|
+
*/
|
|
359
|
+
fun optionsMergedInto(node: ViewController<*>) {
|
|
360
|
+
val record = recordOf(node) ?: return
|
|
361
|
+
if (record.root.isDestroyed) return
|
|
362
|
+
views.update(record, record.root.resolveShownOptions(DefaultOptions.current), move = true)
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* A stack or the tabs of [node] changed the screen they show (`Navigator.shownScreensChanged`): a modal's sheet
|
|
367
|
+
* takes the hold of the new screen, without moving.
|
|
368
|
+
*/
|
|
369
|
+
fun visibleScreenChanged(node: ViewController<*>) {
|
|
370
|
+
val record = recordOf(node) ?: return
|
|
371
|
+
if (record.state == State.Waiting || record.root.isDestroyed) return
|
|
372
|
+
views.update(record, record.root.resolveShownOptions(DefaultOptions.current), move = false)
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/** The colors of the modals' own views again, after a light/dark switch. */
|
|
376
|
+
fun repaint() {
|
|
377
|
+
records.forEach(views::repaint)
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/** The activity resumed: the modals lay out again; nothing is sent. */
|
|
381
|
+
fun onResume() {
|
|
382
|
+
records.forEach(views::requestLayout)
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// A `setRoot` (RootCoordinator.ModalsOverRoot).
|
|
386
|
+
|
|
387
|
+
// A modal still waiting would only show over the root that goes: cancelled; the others go with the old
|
|
388
|
+
// root and commands don't find them; a dismissal finishes on its own.
|
|
389
|
+
override fun rootAccepted() = whileTaking {
|
|
390
|
+
for (record in records.toList()) {
|
|
391
|
+
when (record.state) {
|
|
392
|
+
State.Waiting -> cancel(record, null, reports = false)
|
|
393
|
+
State.Presenting, State.Shown, State.ClosedBelow -> {
|
|
394
|
+
record.takeIds()
|
|
395
|
+
record.before = record.state
|
|
396
|
+
record.state = State.WithOldRoot
|
|
397
|
+
}
|
|
398
|
+
else -> Unit
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
host.backChanged()
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// The `setRoot` that took them ended without replacing the root.
|
|
405
|
+
override fun rootKept() {
|
|
406
|
+
records.filter { it.state == State.WithOldRoot }.forEach { it.state = it.before }
|
|
407
|
+
host.backChanged()
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// Every modal goes with the old root; one that waits is cancelled. Their views go into the root layer over
|
|
411
|
+
// the old root (put back first when a modal covered it), and leave with its part of the transition.
|
|
412
|
+
override fun rootReplaced(old: ViewController<*>?) = whileTaking {
|
|
413
|
+
if (rootOut && old != null) views.putBackRoot(old)
|
|
414
|
+
rootOut = false
|
|
415
|
+
for (batch in batches) {
|
|
416
|
+
batch.answer?.let(carriedAnswers::add)
|
|
417
|
+
carriedAnswers += batch.later
|
|
418
|
+
}
|
|
419
|
+
batches.clear()
|
|
420
|
+
for (record in records.toList()) {
|
|
421
|
+
if (record.state == State.Waiting) {
|
|
422
|
+
cancel(record, null, reports = false)
|
|
423
|
+
continue
|
|
424
|
+
}
|
|
425
|
+
record.stopAnimation?.invoke()
|
|
426
|
+
record.stopAnimation = null
|
|
427
|
+
if (!record.root.isDestroyed) record.root.onLeaveStarted()
|
|
428
|
+
views.carry(record, old)
|
|
429
|
+
carried += record
|
|
430
|
+
}
|
|
431
|
+
records.clear()
|
|
432
|
+
host.backChanged()
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// The transition that replaced the root ended (or was cut): the modals that went with it are destroyed after it,
|
|
436
|
+
// their shown screens' DidDisappear first, without `ANN.ModalDismissed`; what waited for them resolves.
|
|
437
|
+
override fun replacedRootGone() {
|
|
438
|
+
val taken = carried.toList()
|
|
439
|
+
carried.clear()
|
|
440
|
+
for (record in taken) {
|
|
441
|
+
views.remove(record)
|
|
442
|
+
record.state = State.Gone
|
|
443
|
+
if (!record.root.isDestroyed) record.root.destroy()
|
|
444
|
+
answerAll(record)
|
|
445
|
+
}
|
|
446
|
+
val answers = carriedAnswers.toList()
|
|
447
|
+
carriedAnswers.clear()
|
|
448
|
+
answers.forEach { it.resolve("") }
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* The activity's layers go (12): JavaScript reloads (nothing is sent, nothing answers: the generation moved) or the
|
|
453
|
+
* activity is destroyed (the destroy events; shows and the commands that wait resolve with their roots' ids, open
|
|
454
|
+
* point 5). A `setRoot`'s chain gets nothing: the root coordinator answers it.
|
|
455
|
+
*/
|
|
456
|
+
fun destroyAll() {
|
|
457
|
+
val all = records.toList() + carried
|
|
458
|
+
records.clear()
|
|
459
|
+
carried.clear()
|
|
460
|
+
for (record in all) {
|
|
461
|
+
stopWaits(record)
|
|
462
|
+
host.removeWaitingLayer(record)
|
|
463
|
+
record.stopAnimation?.invoke()
|
|
464
|
+
record.stopAnimation = null
|
|
465
|
+
views.remove(record)
|
|
466
|
+
record.state = State.Gone
|
|
467
|
+
record.chain = null
|
|
468
|
+
if (!record.root.isDestroyed) record.root.destroy()
|
|
469
|
+
answerAll(record)
|
|
470
|
+
}
|
|
471
|
+
val answers = batches.flatMap { listOfNotNull(it.answer) + it.later } + carriedAnswers
|
|
472
|
+
batches.clear()
|
|
473
|
+
carriedAnswers.clear()
|
|
474
|
+
answers.forEach { it.resolve("") }
|
|
475
|
+
closedAnswerable.clear()
|
|
476
|
+
rootOut = false
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
// The show (3, 4).
|
|
480
|
+
|
|
481
|
+
private fun start(make: () -> ViewController<*>, answer: CommandAnswer?, chain: ModalRecord.Chain?): ModalRecord {
|
|
482
|
+
val root = make()
|
|
483
|
+
val record: ModalRecord
|
|
484
|
+
val options: Options
|
|
485
|
+
try {
|
|
486
|
+
options = root.resolveShownOptions(DefaultOptions.current)
|
|
487
|
+
// A sheet or not is decided before the root's view is made: its screens keep no room for the status bar.
|
|
488
|
+
val sheet = ModalRecord.isSheet(options)
|
|
489
|
+
root.shownAsSheet = sheet
|
|
490
|
+
record = ModalRecord(root, sheet)
|
|
491
|
+
} catch (e: Throwable) {
|
|
492
|
+
root.destroy()
|
|
493
|
+
throw e
|
|
494
|
+
}
|
|
495
|
+
// A waiting layer before its views join the window: what is in it isn't on screen from its first layout.
|
|
496
|
+
record.screensChanged = { screensChanged(record) }
|
|
497
|
+
host.addWaitingLayer(record)
|
|
498
|
+
try {
|
|
499
|
+
views.place(record)
|
|
500
|
+
} catch (e: Throwable) {
|
|
501
|
+
host.removeWaitingLayer(record)
|
|
502
|
+
root.destroy()
|
|
503
|
+
throw e
|
|
504
|
+
}
|
|
505
|
+
record.takeIds()
|
|
506
|
+
record.ids.forEach { closedAnswerable.remove(it) }
|
|
507
|
+
record.showAnswer = answer
|
|
508
|
+
record.chain = chain
|
|
509
|
+
records += record
|
|
510
|
+
// From here the record is listed: a failure ends it by its own path (the show rejects, the chain goes on),
|
|
511
|
+
// so no record stays waiting and the modals after it don't hang.
|
|
512
|
+
guarded(record) {
|
|
513
|
+
host.backChanged()
|
|
514
|
+
await(record, options)
|
|
515
|
+
}
|
|
516
|
+
return record
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
// The one wait of the core with the root's values: the screens the modal shows and, with `together` tabs, those it
|
|
520
|
+
// doesn't, within their own limit.
|
|
521
|
+
private fun await(record: ModalRecord, options: Options) {
|
|
522
|
+
val waitForRender = options.animations.showModal.enter.waitForRender
|
|
523
|
+
val unset = !waitForRender.isTrue && !waitForRender.isFalse
|
|
524
|
+
// Without `waitForRender` the targets of its elements wait within the same 0.5 s.
|
|
525
|
+
if (unset) record.cancelLimit = scheduler.schedule(WAIT_LIMIT_MILLIS) { record.overLimit = true }
|
|
526
|
+
val wait = RenderWait(
|
|
527
|
+
readiness = readiness,
|
|
528
|
+
scheduler = scheduler,
|
|
529
|
+
limitMillis = if (unset) WAIT_LIMIT_MILLIS else null,
|
|
530
|
+
bar = if (waitForRender.isTrue) RenderWait.Bar.AfterContent else RenderWait.Bar.WithinLimit,
|
|
531
|
+
countsUnknownContent = false,
|
|
532
|
+
step = { work -> guarded(record, work) },
|
|
533
|
+
onEnd = { guarded(record) { ready(record) } },
|
|
534
|
+
)
|
|
535
|
+
record.wait = wait
|
|
536
|
+
if (waitForRender.isFalse) {
|
|
537
|
+
wait.start(emptyList())
|
|
538
|
+
} else {
|
|
539
|
+
wait.start(RenderWait.waitedScreens(record.root), RenderWait.unseenScreens(record.root))
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// A stack of the waiting modal changed its top: the wait follows the screens it shows now.
|
|
544
|
+
private fun screensChanged(record: ModalRecord) {
|
|
545
|
+
if (record.state != State.Waiting) return
|
|
546
|
+
val wait = record.wait ?: return
|
|
547
|
+
guarded(record) { wait.retake(RenderWait.waitedScreens(record.root), RenderWait.unseenScreens(record.root)) }
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// Its wait ended; with elements, then the wait for their targets, hidden still.
|
|
551
|
+
private fun ready(record: ModalRecord) {
|
|
552
|
+
if (record.state != State.Waiting) return
|
|
553
|
+
record.wait = null
|
|
554
|
+
if (!record.targetsAwaited && awaitsTargets(record)) return awaitTargets(record)
|
|
555
|
+
record.cancelLimit()
|
|
556
|
+
record.isReady = true
|
|
557
|
+
presentReady()
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
// A modal not shown as a sheet, whose show animates with elements over a layer under it: unless `waitForRender:
|
|
561
|
+
// false`, its show waits for their targets too.
|
|
562
|
+
private fun awaitsTargets(record: ModalRecord): Boolean {
|
|
563
|
+
if (record.isSheet || record.chain?.animated == false || !host.isSeen()) return false
|
|
564
|
+
val animation = record.root.resolveShownOptions(DefaultOptions.current).animations.showModal
|
|
565
|
+
return AnimationRules.showAnimated(animation) && AnimationRules.hasElements(animation) &&
|
|
566
|
+
!animation.enter.waitForRender.isFalse && nodeOf(layerUnder(record)) != null
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
private fun awaitTargets(record: ModalRecord) {
|
|
570
|
+
record.targetsAwaited = true
|
|
571
|
+
val animation = record.root.resolveShownOptions(DefaultOptions.current).animations.showModal
|
|
572
|
+
var stopped = false
|
|
573
|
+
val stop = views.awaitTargets(
|
|
574
|
+
record,
|
|
575
|
+
animation,
|
|
576
|
+
nodeOf(layerUnder(record)),
|
|
577
|
+
waiting = { !stopped && record.state == State.Waiting && !record.overLimit },
|
|
578
|
+
) {
|
|
579
|
+
if (stopped) return@awaitTargets
|
|
580
|
+
stopped = true
|
|
581
|
+
record.stopTargets = null
|
|
582
|
+
guarded(record) { ready(record) }
|
|
583
|
+
}
|
|
584
|
+
if (!stopped) {
|
|
585
|
+
record.stopTargets = {
|
|
586
|
+
stopped = true
|
|
587
|
+
stop()
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
// What a record waits for stops: its screens, the targets of its elements, the limit.
|
|
593
|
+
private fun stopWaits(record: ModalRecord) {
|
|
594
|
+
record.wait?.cancel()
|
|
595
|
+
record.wait = null
|
|
596
|
+
record.stopTargets?.invoke()
|
|
597
|
+
record.stopTargets = null
|
|
598
|
+
record.cancelLimit()
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// N1: a ready modal shows once every older waiting one showed or went.
|
|
602
|
+
private fun presentReady() {
|
|
603
|
+
if (taking) return
|
|
604
|
+
for (record in records.toList()) {
|
|
605
|
+
if (record.state != State.Waiting) continue
|
|
606
|
+
if (!record.isReady) return
|
|
607
|
+
present(record)
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
// W → P: the decisions of the show, WillAppear of its screens, its animation.
|
|
612
|
+
private fun present(record: ModalRecord) {
|
|
613
|
+
host.removeWaitingLayer(record)
|
|
614
|
+
record.state = State.Presenting
|
|
615
|
+
try {
|
|
616
|
+
val options = record.root.resolveShownOptions(DefaultOptions.current)
|
|
617
|
+
record.coversUnder = ModalRecord.coversUnder(record.isSheet, options)
|
|
618
|
+
val animation = options.animations.showModal
|
|
619
|
+
val animated = (record.chain?.animated ?: true) && AnimationRules.showAnimated(animation)
|
|
620
|
+
// Its own animation over the layer under it; a sheet has only its Material motion.
|
|
621
|
+
val motion = if (animated && !record.isSheet) motionOf(animation, record, showing = true) else null
|
|
622
|
+
AppearanceDispatcher.beginTransition(listOf(record.root))
|
|
623
|
+
var ended = false
|
|
624
|
+
val stop = views.present(record, options, animated, host.isSeen(), SheetEvents(record), {
|
|
625
|
+
ended = true
|
|
626
|
+
guarded(record) { presented(record) }
|
|
627
|
+
}, motion)
|
|
628
|
+
if (!ended) record.stopAnimation = stop
|
|
629
|
+
} catch (e: Throwable) {
|
|
630
|
+
failed(record, e)
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
// The show couldn't be made, or a later step of it failed: the modal goes as a cancel, the show rejects (the chain
|
|
635
|
+
// logs and goes on), the layer it took out comes back, and the modals that wait go on. Its views and its root go
|
|
636
|
+
// each on their own: a part that fails again doesn't keep the rest from running.
|
|
637
|
+
private fun failed(record: ModalRecord, e: Throwable) {
|
|
638
|
+
val text = ErrorTexts.couldNot("show the screen '${record.rootId}'", ErrorTexts.reasonOf(e))
|
|
639
|
+
val under = layerUnder(record)
|
|
640
|
+
runCatching { record.stopAnimation?.invoke() }
|
|
641
|
+
record.stopAnimation = null
|
|
642
|
+
runCatching { stopWaits(record) }
|
|
643
|
+
record.state = State.Gone
|
|
644
|
+
val listed = records.remove(record)
|
|
645
|
+
host.removeWaitingLayer(record)
|
|
646
|
+
runCatching { views.remove(record) }
|
|
647
|
+
runCatching { if (!record.root.isDestroyed) record.root.destroy() }
|
|
648
|
+
if (record.showAnswer == null && record.chain == null) host.log("[ApexNavigation] $text")
|
|
649
|
+
record.showAnswer?.reject(text)
|
|
650
|
+
record.showAnswer = null
|
|
651
|
+
record.chain?.let {
|
|
652
|
+
record.chain = null
|
|
653
|
+
host.log("[ApexNavigation] setRoot: $text")
|
|
654
|
+
it.done()
|
|
655
|
+
}
|
|
656
|
+
record.answers.forEach { it.resolve(record.rootId) }
|
|
657
|
+
record.waitingDismissals.forEach { it.answer?.resolve(record.rootId) }
|
|
658
|
+
if (listed) runCatching { revealIfUncovered(under) }
|
|
659
|
+
host.backChanged()
|
|
660
|
+
presentReady()
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
// A later step of a dismissal failed (its end, the close of a modal below, back): the modal goes as at that end,
|
|
664
|
+
// without the events not sent yet; what waits for it rejects, the layer it took out comes back, and the modals that
|
|
665
|
+
// wait go on.
|
|
666
|
+
private fun dismissFailed(record: ModalRecord, e: Throwable) {
|
|
667
|
+
val text = ErrorTexts.couldNot("dismiss the modal of the screen '${record.rootId}'", ErrorTexts.reasonOf(e))
|
|
668
|
+
val listed = record in records
|
|
669
|
+
val under = layerUnder(record)
|
|
670
|
+
runCatching { record.stopAnimation?.invoke() }
|
|
671
|
+
record.stopAnimation = null
|
|
672
|
+
runCatching { stopWaits(record) }
|
|
673
|
+
if (record.ending?.byUser == true) record.ids.forEach { closedAnswerable[it] = record.rootId }
|
|
674
|
+
record.state = State.Gone
|
|
675
|
+
records.remove(record)
|
|
676
|
+
host.removeWaitingLayer(record)
|
|
677
|
+
runCatching { views.remove(record) }
|
|
678
|
+
runCatching { if (!record.root.isDestroyed) record.root.destroy() }
|
|
679
|
+
val answers = listOfNotNull(record.showAnswer) + record.answers +
|
|
680
|
+
record.waitingDismissals.mapNotNull { it.answer }
|
|
681
|
+
record.showAnswer = null
|
|
682
|
+
record.answers.clear()
|
|
683
|
+
record.waitingDismissals.clear()
|
|
684
|
+
if (answers.none { !it.isAnswered }) host.log("[ApexNavigation] $text")
|
|
685
|
+
answers.forEach { it.reject(text) }
|
|
686
|
+
record.chain?.let {
|
|
687
|
+
record.chain = null
|
|
688
|
+
it.done()
|
|
689
|
+
}
|
|
690
|
+
if (listed) runCatching { revealIfUncovered(under) }
|
|
691
|
+
host.backChanged()
|
|
692
|
+
presentReady()
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
// The show ended. The layer under leaves its layer when the modal covers it; DidDisappear of its
|
|
696
|
+
// screens, DidAppear of the modal's, the state, the answer. In a `setRoot`'s chain: no answer, no state of its own.
|
|
697
|
+
// A modal a `setRoot` took while it came in ends its show the same way and stays taken.
|
|
698
|
+
private fun presented(record: ModalRecord) {
|
|
699
|
+
record.stopAnimation = null
|
|
700
|
+
if (record.effective != State.Presenting) return
|
|
701
|
+
move(record, State.Shown)
|
|
702
|
+
val hiding = ArrayList<ViewController<*>>(1)
|
|
703
|
+
if (record.coversUnder) {
|
|
704
|
+
var under = layerUnder(record)
|
|
705
|
+
// A modal under it still coming in ends its show at its place first (its DidAppear, its answer): out of
|
|
706
|
+
// the window its slide or its sheet's settle would end unseen or never (a hung show).
|
|
707
|
+
// Under its own guard: a failure there ends that modal, and this one goes on.
|
|
708
|
+
if (under != null && under.effective == State.Presenting) {
|
|
709
|
+
val lower: ModalRecord = under
|
|
710
|
+
guarded(lower) {
|
|
711
|
+
lower.stopAnimation?.invoke()
|
|
712
|
+
views.settle(lower)
|
|
713
|
+
presented(lower)
|
|
714
|
+
}
|
|
715
|
+
under = layerUnder(record)
|
|
716
|
+
}
|
|
717
|
+
if (under == null) {
|
|
718
|
+
host.root?.let {
|
|
719
|
+
if (!rootOut) views.takeOutRoot(it)
|
|
720
|
+
rootOut = true
|
|
721
|
+
hiding += it
|
|
722
|
+
}
|
|
723
|
+
} else {
|
|
724
|
+
if (!under.isOut) views.takeOut(under)
|
|
725
|
+
under.isOut = true
|
|
726
|
+
hiding += under.root
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
// The answer and the chain stay on the record until the events went: a failure among them still answers.
|
|
730
|
+
val answer = record.showAnswer
|
|
731
|
+
val chain = record.chain
|
|
732
|
+
AppearanceDispatcher.endTransition(
|
|
733
|
+
hiding = hiding,
|
|
734
|
+
showing = listOf(record.root),
|
|
735
|
+
events = null,
|
|
736
|
+
answer = answer,
|
|
737
|
+
value = record.rootId,
|
|
738
|
+
reportsState = chain == null,
|
|
739
|
+
)
|
|
740
|
+
record.showAnswer = null
|
|
741
|
+
record.chain = null
|
|
742
|
+
// The chain and a dismissal that waited for the show go on whatever back's update does: they are no longer on
|
|
743
|
+
// the record, nothing else would start them.
|
|
744
|
+
try {
|
|
745
|
+
host.backChanged()
|
|
746
|
+
} finally {
|
|
747
|
+
chain?.done?.invoke()
|
|
748
|
+
// A `setRoot` took it: commands wait for the old root (row 13), back and the user act as on a shown modal.
|
|
749
|
+
val next = when (record.state) {
|
|
750
|
+
State.Shown -> record.waitingDismissals.removeFirstOrNull()
|
|
751
|
+
State.WithOldRoot -> record.waitingDismissals.firstOrNull { it.byUser }
|
|
752
|
+
?.also(record.waitingDismissals::remove)
|
|
753
|
+
else -> null
|
|
754
|
+
}
|
|
755
|
+
next?.let { request(record, it) }
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
// A record a `setRoot` took keeps being taken: its own move goes to the state it has under it.
|
|
760
|
+
private fun move(record: ModalRecord, state: State) {
|
|
761
|
+
if (record.state == State.WithOldRoot) record.before = state else record.state = state
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
// The table, row 4 (a command) and rows 6, 7 (the user, back): what a dismissal does in each state, when it runs.
|
|
765
|
+
private fun request(record: ModalRecord, dismissal: Dismissal) {
|
|
766
|
+
when (record.effective) {
|
|
767
|
+
State.Waiting -> cancel(record, dismissal, reports = true)
|
|
768
|
+
State.Presenting -> record.waitingDismissals += dismissal
|
|
769
|
+
State.Shown -> if (isTop(record)) beginDismissal(record, dismissal) else closeBelow(record, dismissal)
|
|
770
|
+
State.Dismissing -> dismissal.answer?.let(record.answers::add)
|
|
771
|
+
State.ClosedBelow -> dismissal.answer?.resolve(record.rootId)
|
|
772
|
+
State.WithOldRoot, State.Gone -> dismissal.answer?.reject(ErrorTexts.screenNotShown(record.rootId))
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
// (e) W → X: the wait stops, its views leave, its root goes without events (no WillAppear went); the layer under
|
|
777
|
+
// isn't touched. The show resolves first, then — for a dismissal or back — one `ANN.ModalDismissed`, then the
|
|
778
|
+
// dismissal's answer.
|
|
779
|
+
private fun cancel(record: ModalRecord, dismissal: Dismissal?, reports: Boolean) {
|
|
780
|
+
val under = layerUnder(record)
|
|
781
|
+
stopWaits(record)
|
|
782
|
+
host.removeWaitingLayer(record)
|
|
783
|
+
record.state = State.Gone
|
|
784
|
+
records.remove(record)
|
|
785
|
+
views.remove(record)
|
|
786
|
+
val screen = AppearanceDispatcher.visibleNode(record.root)
|
|
787
|
+
record.showAnswer?.resolve(record.rootId)
|
|
788
|
+
record.showAnswer = null
|
|
789
|
+
record.chain?.let {
|
|
790
|
+
record.chain = null
|
|
791
|
+
it.done()
|
|
792
|
+
}
|
|
793
|
+
if (reports) {
|
|
794
|
+
record.reported = true
|
|
795
|
+
AppearanceDispatcher.modalDismissed(screen, 1)
|
|
796
|
+
}
|
|
797
|
+
if (dismissal?.byUser == true) record.ids.forEach { closedAnswerable[it] = record.rootId }
|
|
798
|
+
if (!record.root.isDestroyed) record.root.destroy()
|
|
799
|
+
dismissal?.answer?.resolve(record.rootId)
|
|
800
|
+
revealIfUncovered(under)
|
|
801
|
+
host.backChanged()
|
|
802
|
+
presentReady()
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
// A layer a modal closed below kept out stays out while modals are over it; once none is (the last one above was
|
|
806
|
+
// cancelled while it waited), it comes back with its appearance.
|
|
807
|
+
private fun revealIfUncovered(layer: ModalRecord?) {
|
|
808
|
+
if (!isOut(layer)) return
|
|
809
|
+
val above = if (layer == null) records else records.drop(records.indexOf(layer) + 1)
|
|
810
|
+
if (above.any { it.effective in COVERING }) return
|
|
811
|
+
val node = nodeOf(layer) ?: return
|
|
812
|
+
putBack(layer, null)
|
|
813
|
+
AppearanceDispatcher.beginTransition(listOf(node))
|
|
814
|
+
AppearanceDispatcher.endTransition(emptyList(), listOf(node), null, null, null)
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
// (d) S → D: the leaving screens let go of the focus, the layer revealed comes back when it had disappeared with
|
|
818
|
+
// its WillAppear, then the animation.
|
|
819
|
+
private fun beginDismissal(record: ModalRecord, dismissal: Dismissal) {
|
|
820
|
+
move(record, State.Dismissing)
|
|
821
|
+
dismissal.answer?.let(record.answers::add)
|
|
822
|
+
record.waitingDismissals.forEach { it.answer?.let(record.answers::add) }
|
|
823
|
+
record.waitingDismissals.clear()
|
|
824
|
+
if (!record.root.isDestroyed) record.root.onLeaveStarted()
|
|
825
|
+
val revealed = layerUnder(record)
|
|
826
|
+
val wasOut = isOut(revealed)
|
|
827
|
+
if (wasOut) putBack(revealed, record)
|
|
828
|
+
val node = if (wasOut) nodeOf(revealed) else null
|
|
829
|
+
node?.let { AppearanceDispatcher.beginTransition(listOf(it)) }
|
|
830
|
+
record.ending = ModalRecord.Ending(node, dismissal.byUser)
|
|
831
|
+
if (dismissal.byUser) record.takeIds()
|
|
832
|
+
var ended = false
|
|
833
|
+
val motion = dismissal.animation?.let { motionOf(it, record, showing = false) }
|
|
834
|
+
val stop = views.dismiss(record, dismissal.animated, host.isSeen(), {
|
|
835
|
+
ended = true
|
|
836
|
+
guarded(record) { dismissed(record) }
|
|
837
|
+
}, motion)
|
|
838
|
+
if (!ended) record.stopAnimation = stop
|
|
839
|
+
host.backChanged()
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
// Its views leave, DidDisappear of its screens, DidAppear of the layer revealed, the state,
|
|
843
|
+
// `ANN.ModalDismissed` unless it went already, its content stops, the answer.
|
|
844
|
+
private fun dismissed(record: ModalRecord) {
|
|
845
|
+
record.stopAnimation = null
|
|
846
|
+
(record.batch as? Batch)?.let { return memberEnded(it, record) }
|
|
847
|
+
if (record.effective != State.Dismissing) return
|
|
848
|
+
record.state = State.Gone
|
|
849
|
+
records.remove(record)
|
|
850
|
+
views.remove(record)
|
|
851
|
+
val ending = record.ending
|
|
852
|
+
if (ending?.byUser == true) record.ids.forEach { closedAnswerable[it] = record.rootId }
|
|
853
|
+
// The answers stay on the record until the events went: a failure among them still answers them.
|
|
854
|
+
val answers = record.answers.toList()
|
|
855
|
+
AppearanceDispatcher.endTransition(
|
|
856
|
+
hiding = listOf(record.root),
|
|
857
|
+
showing = listOfNotNull(ending?.revealed),
|
|
858
|
+
events = {
|
|
859
|
+
if (!record.reported) {
|
|
860
|
+
record.reported = true
|
|
861
|
+
AppearanceDispatcher.modalDismissed(record.root, 1)
|
|
862
|
+
}
|
|
863
|
+
record.root.destroy()
|
|
864
|
+
},
|
|
865
|
+
answer = answers.firstOrNull(),
|
|
866
|
+
value = record.rootId,
|
|
867
|
+
)
|
|
868
|
+
record.answers.clear()
|
|
869
|
+
answers.drop(1).forEach { it.resolve(record.rootId) }
|
|
870
|
+
host.backChanged()
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
// (c) S → B: dismissed while a modal above it stays: reported at once, its screens go, then its exit plays unseen
|
|
874
|
+
// and its view leaves (`dismissModal` step 5).
|
|
875
|
+
private fun closeBelow(record: ModalRecord, dismissal: Dismissal) {
|
|
876
|
+
move(record, State.ClosedBelow)
|
|
877
|
+
record.takeIds()
|
|
878
|
+
// Its record may leave at once (out of the window): a later `dismissModal` of it still resolves.
|
|
879
|
+
record.ids.forEach { closedAnswerable[it] = record.rootId }
|
|
880
|
+
// The answers wait on the record until the events went: a failure among them still answers them.
|
|
881
|
+
dismissal.answer?.let(record.answers::add)
|
|
882
|
+
record.waitingDismissals.forEach { it.answer?.let(record.answers::add) }
|
|
883
|
+
record.waitingDismissals.clear()
|
|
884
|
+
val answers = record.answers.toList()
|
|
885
|
+
AppearanceDispatcher.endTransition(
|
|
886
|
+
hiding = listOf(record.root),
|
|
887
|
+
showing = emptyList(),
|
|
888
|
+
events = {
|
|
889
|
+
record.reported = true
|
|
890
|
+
AppearanceDispatcher.modalDismissed(record.root, 1)
|
|
891
|
+
record.root.destroy()
|
|
892
|
+
},
|
|
893
|
+
answer = answers.firstOrNull(),
|
|
894
|
+
value = record.rootId,
|
|
895
|
+
)
|
|
896
|
+
record.answers.clear()
|
|
897
|
+
answers.drop(1).forEach { it.resolve(record.rootId) }
|
|
898
|
+
var ended = false
|
|
899
|
+
// Out of the window under a covering modal, its exit would end unseen or never (a sheet's settle): at once.
|
|
900
|
+
val stop = views.dismiss(record, dismissal.animated, host.isSeen() && !record.isOut, {
|
|
901
|
+
ended = true
|
|
902
|
+
guarded(record) { closedBelowEnded(record) }
|
|
903
|
+
}, null)
|
|
904
|
+
if (!ended) record.stopAnimation = stop
|
|
905
|
+
host.backChanged()
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
// The unseen exit of a modal closed below ended: its view leaves, and so does the record.
|
|
909
|
+
private fun closedBelowEnded(record: ModalRecord) {
|
|
910
|
+
record.stopAnimation = null
|
|
911
|
+
if (record.effective != State.ClosedBelow || record.batch != null) return
|
|
912
|
+
record.state = State.Gone
|
|
913
|
+
records.remove(record)
|
|
914
|
+
views.remove(record)
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
// (f) The batch of `dismissAllModals`: the top one leaves with its animation, every other at once.
|
|
918
|
+
private fun startBatch(
|
|
919
|
+
members: List<ModalRecord>,
|
|
920
|
+
answer: CommandAnswer,
|
|
921
|
+
animated: Boolean,
|
|
922
|
+
animation: ModalAnimationOptions,
|
|
923
|
+
) {
|
|
924
|
+
val batch = Batch(answer)
|
|
925
|
+
batches += batch
|
|
926
|
+
batch.members = members
|
|
927
|
+
// The batch is registered from here: a failure takes it out with its members (as a later step's would), so no
|
|
928
|
+
// later `dismissAllModals` waits for it; the runner's answer then is a second one and is dropped.
|
|
929
|
+
try {
|
|
930
|
+
takeBatch(batch, members, animated, animation)
|
|
931
|
+
} catch (e: Throwable) {
|
|
932
|
+
batchFailed(batch, e)
|
|
933
|
+
throw e
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
private fun takeBatch(
|
|
938
|
+
batch: Batch,
|
|
939
|
+
members: List<ModalRecord>,
|
|
940
|
+
animated: Boolean,
|
|
941
|
+
animation: ModalAnimationOptions,
|
|
942
|
+
) {
|
|
943
|
+
val lowest = members.first()
|
|
944
|
+
val revealed = layerUnder(lowest)
|
|
945
|
+
val wasOut = isOut(revealed)
|
|
946
|
+
val counted = members.filter { it.state != State.ClosedBelow && !it.reported }
|
|
947
|
+
batch.count = counted.size
|
|
948
|
+
batch.screen = counted.lastOrNull()?.let { AppearanceDispatcher.visibleNode(it.root) }
|
|
949
|
+
// The top that leaves with its animation: one already leaving keeps its own.
|
|
950
|
+
val top = members.lastOrNull { it.state in ANIMATED_IN_BATCH }
|
|
951
|
+
batch.top = top
|
|
952
|
+
val keepsItsOwn = top?.state == State.Dismissing && top.stopAnimation != null
|
|
953
|
+
for (record in members) {
|
|
954
|
+
record.batch = batch
|
|
955
|
+
stopWaits(record)
|
|
956
|
+
host.removeWaitingLayer(record)
|
|
957
|
+
record.waitingDismissals.forEach { it.answer?.let(record.answers::add) }
|
|
958
|
+
record.waitingDismissals.clear()
|
|
959
|
+
if (record.state != State.ClosedBelow && !record.root.isDestroyed) record.root.onLeaveStarted()
|
|
960
|
+
if (record.state != State.ClosedBelow) record.state = State.Dismissing
|
|
961
|
+
if (record === top && keepsItsOwn) continue
|
|
962
|
+
record.stopAnimation?.invoke()
|
|
963
|
+
record.stopAnimation = null
|
|
964
|
+
if (record !== top) views.remove(record)
|
|
965
|
+
}
|
|
966
|
+
if (wasOut) putBack(revealed, lowest)
|
|
967
|
+
batch.revealed = if (wasOut) nodeOf(revealed) else null
|
|
968
|
+
batch.revealed?.let { AppearanceDispatcher.beginTransition(listOf(it)) }
|
|
969
|
+
// A member leaving on its own revealed that layer already (its WillAppear went): it appears at the batch's end.
|
|
970
|
+
if (!wasOut) {
|
|
971
|
+
batch.revealed = members.firstNotNullOfOrNull { it.ending?.revealed }?.takeIf { it === nodeOf(revealed) }
|
|
972
|
+
}
|
|
973
|
+
host.backChanged()
|
|
974
|
+
if (top == null) return endBatch(batch)
|
|
975
|
+
if (keepsItsOwn) return
|
|
976
|
+
var ended = false
|
|
977
|
+
// The top leaves by the dismissal's animation of the top modal over what the batch reveals.
|
|
978
|
+
val motion = motionOf(animation, top, showing = false, under = nodeOf(revealed))
|
|
979
|
+
val stop = views.dismiss(top, animated, host.isSeen(), {
|
|
980
|
+
ended = true
|
|
981
|
+
guarded(top) { dismissed(top) }
|
|
982
|
+
}, motion)
|
|
983
|
+
if (!ended) top.stopAnimation = stop
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
private fun memberEnded(batch: Batch, record: ModalRecord) {
|
|
987
|
+
if (record === batch.top && batch in batches) endBatch(batch)
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
// (f)'s end: the screens of every modal of the batch disappear, the layer revealed appears, the state, one
|
|
991
|
+
// `ANN.ModalDismissed` with the number of modals not reported before, the content stops, every show and command
|
|
992
|
+
// that waited resolves with its own root's id, then the answer `''`.
|
|
993
|
+
private fun endBatch(batch: Batch) {
|
|
994
|
+
batches.remove(batch)
|
|
995
|
+
val members = batch.members
|
|
996
|
+
// The others' views went at its start.
|
|
997
|
+
batch.top?.let(views::remove)
|
|
998
|
+
for (record in members) {
|
|
999
|
+
record.stopAnimation?.invoke()
|
|
1000
|
+
record.stopAnimation = null
|
|
1001
|
+
record.state = State.Gone
|
|
1002
|
+
records.remove(record)
|
|
1003
|
+
}
|
|
1004
|
+
AppearanceDispatcher.endTransition(
|
|
1005
|
+
hiding = members.map { it.root }.filterNot { it.isDestroyed },
|
|
1006
|
+
showing = listOfNotNull(batch.revealed),
|
|
1007
|
+
events = {
|
|
1008
|
+
if (batch.count > 0) batch.screen?.let { AppearanceDispatcher.modalDismissed(it, batch.count) }
|
|
1009
|
+
for (record in members) {
|
|
1010
|
+
record.reported = true
|
|
1011
|
+
if (!record.root.isDestroyed) record.root.destroy()
|
|
1012
|
+
}
|
|
1013
|
+
members.forEach(::answerAll)
|
|
1014
|
+
},
|
|
1015
|
+
answer = batch.answer,
|
|
1016
|
+
value = "",
|
|
1017
|
+
)
|
|
1018
|
+
batch.later.forEach { it.resolve("") }
|
|
1019
|
+
host.backChanged()
|
|
1020
|
+
presentReady()
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
// A later step of a `dismissAllModals` failed: every modal of it goes as at its end, without the events not sent
|
|
1024
|
+
// yet; what waited for each resolves as at that end, the batch's answers reject, and the modals that wait go on.
|
|
1025
|
+
private fun batchFailed(batch: Batch, e: Throwable) {
|
|
1026
|
+
val text = ErrorTexts.couldNot("dismiss all modals", ErrorTexts.reasonOf(e))
|
|
1027
|
+
batches.remove(batch)
|
|
1028
|
+
for (record in batch.members) {
|
|
1029
|
+
runCatching { record.stopAnimation?.invoke() }
|
|
1030
|
+
record.stopAnimation = null
|
|
1031
|
+
record.state = State.Gone
|
|
1032
|
+
records.remove(record)
|
|
1033
|
+
runCatching { views.remove(record) }
|
|
1034
|
+
runCatching { if (!record.root.isDestroyed) record.root.destroy() }
|
|
1035
|
+
runCatching { answerAll(record) }
|
|
1036
|
+
}
|
|
1037
|
+
val answers = listOfNotNull(batch.answer) + batch.later
|
|
1038
|
+
batch.later.clear()
|
|
1039
|
+
if (answers.none { !it.isAnswered }) host.log("[ApexNavigation] $text")
|
|
1040
|
+
answers.forEach { it.reject(text) }
|
|
1041
|
+
host.backChanged()
|
|
1042
|
+
presentReady()
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
// What waited for a record that went without its own end resolves with its root's id; a chain goes on.
|
|
1046
|
+
private fun answerAll(record: ModalRecord) {
|
|
1047
|
+
record.showAnswer?.resolve(record.rootId)
|
|
1048
|
+
record.showAnswer = null
|
|
1049
|
+
record.chain?.let {
|
|
1050
|
+
record.chain = null
|
|
1051
|
+
it.done()
|
|
1052
|
+
}
|
|
1053
|
+
record.answers.forEach { it.resolve(record.rootId) }
|
|
1054
|
+
record.answers.clear()
|
|
1055
|
+
record.waitingDismissals.forEach { it.answer?.resolve(record.rootId) }
|
|
1056
|
+
record.waitingDismissals.clear()
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
// The user (the sheet's events).
|
|
1060
|
+
|
|
1061
|
+
// The user closed the sheet (a drag down, the scrim): as back with `dismissModalOnPress: true`. While it comes in,
|
|
1062
|
+
// its show ends first, so it answers.
|
|
1063
|
+
private fun closedByTheUser(record: ModalRecord) {
|
|
1064
|
+
try {
|
|
1065
|
+
if (record.effective == State.Presenting) {
|
|
1066
|
+
record.stopAnimation?.invoke()
|
|
1067
|
+
presented(record)
|
|
1068
|
+
}
|
|
1069
|
+
if (record.effective != State.Shown) return
|
|
1070
|
+
request(record, Dismissal(null, animated = true, byUser = true))
|
|
1071
|
+
} catch (e: Throwable) {
|
|
1072
|
+
fail(record, e, "close the screen '${record.rootId}'")
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
private inner class SheetEvents(private val record: ModalRecord) : ModalSheet.Events {
|
|
1077
|
+
override fun onDetentChanged(detent: SheetDetent) {
|
|
1078
|
+
if (record.root.isDestroyed) return
|
|
1079
|
+
logged("tell the sheet's detent of the screen '${record.rootId}'") {
|
|
1080
|
+
AppearanceDispatcher.sheetDetentChanged(record.root, detent.toValue())
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
override fun onClosedByUser() = closedByTheUser(record)
|
|
1085
|
+
|
|
1086
|
+
// The user tried to close a sheet that holds them.
|
|
1087
|
+
override fun onCloseAttempted() {
|
|
1088
|
+
if (record.effective != State.Shown || record.root.isDestroyed) return
|
|
1089
|
+
logged("tell the attempt to close the screen '${record.rootId}'") {
|
|
1090
|
+
AppearanceDispatcher.modalAttemptedToDismiss(record.root)
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
// Protection (ARCHITECTURE.md section 5).
|
|
1096
|
+
|
|
1097
|
+
// A step of [record] that comes later, under no runner: a failure ends what the record was doing ([fail]).
|
|
1098
|
+
private inline fun guarded(record: ModalRecord, work: () -> Unit) {
|
|
1099
|
+
try {
|
|
1100
|
+
work()
|
|
1101
|
+
} catch (e: Throwable) {
|
|
1102
|
+
fail(record, e, "show the screen '${record.rootId}'")
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
// A failure in a later step of [record], by what it was doing: a `dismissAllModals` it is in fails as a whole
|
|
1107
|
+
// (batchFailed); a show not answered yet fails as one that couldn't be made (failed); a dismissal or a close below
|
|
1108
|
+
// on its way fails as its end (dismissFailed). A record the step left as it was stays; with no answer to give, the
|
|
1109
|
+
// failure is logged as [what].
|
|
1110
|
+
private fun fail(record: ModalRecord, e: Throwable, what: String) {
|
|
1111
|
+
(record.batch as? Batch)?.let { return batchFailed(it, e) }
|
|
1112
|
+
val showing = record.state == State.Waiting || record.effective == State.Presenting
|
|
1113
|
+
when {
|
|
1114
|
+
showing || record.showAnswer != null || record.chain != null -> failed(record, e)
|
|
1115
|
+
record.state == State.Gone || record.effective in LEAVING -> dismissFailed(record, e)
|
|
1116
|
+
else -> host.log("[ApexNavigation] ${ErrorTexts.couldNot(what, ErrorTexts.reasonOf(e))}")
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
// A callback of the user that only sends an event: a failure is logged.
|
|
1121
|
+
private inline fun logged(what: String, work: () -> Unit) {
|
|
1122
|
+
try {
|
|
1123
|
+
work()
|
|
1124
|
+
} catch (e: Throwable) {
|
|
1125
|
+
host.log("[ApexNavigation] ${ErrorTexts.couldNot(what, ErrorTexts.reasonOf(e))}")
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
// Rules across records.
|
|
1130
|
+
|
|
1131
|
+
// The record a dismissal of [node] (or of [id] without a node) concerns.
|
|
1132
|
+
private fun lookup(id: String, node: ViewController<*>?): Lookup {
|
|
1133
|
+
if (node != null) {
|
|
1134
|
+
val top = topOf(node)
|
|
1135
|
+
if (carried.any { it.root === top }) return Lookup.NotShown
|
|
1136
|
+
return records.firstOrNull { it.root === top }?.let(Lookup::Found) ?: Lookup.NotInModal
|
|
1137
|
+
}
|
|
1138
|
+
val gone = records.firstOrNull {
|
|
1139
|
+
(it.state == State.ClosedBelow || it.state == State.WithOldRoot) && id in it.ids
|
|
1140
|
+
}
|
|
1141
|
+
if (gone != null) return Lookup.Found(gone)
|
|
1142
|
+
closedAnswerable[id]?.let { return Lookup.Closed(it) }
|
|
1143
|
+
return Lookup.NotShown
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
private sealed class Lookup {
|
|
1147
|
+
object NotShown : Lookup()
|
|
1148
|
+
object NotInModal : Lookup()
|
|
1149
|
+
class Closed(val rootId: String) : Lookup()
|
|
1150
|
+
class Found(val record: ModalRecord) : Lookup()
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
// A record is the top when no record above it waits, comes in or shows; one that leaves doesn't count.
|
|
1154
|
+
private fun isTop(record: ModalRecord): Boolean =
|
|
1155
|
+
records.drop(records.indexOf(record) + 1).none { it.effective in TOP_STATES }
|
|
1156
|
+
|
|
1157
|
+
// The top record, as the commands see it; none.
|
|
1158
|
+
private fun topRecord(): ModalRecord? = records.lastOrNull { it.effective in TOP_STATES }
|
|
1159
|
+
|
|
1160
|
+
// Back goes to the top modal that waits, comes in or shows.
|
|
1161
|
+
private fun backTarget(): ModalRecord? = records.lastOrNull { it.effective in TOP_STATES }
|
|
1162
|
+
|
|
1163
|
+
// `hardwareBackButton.dismissModalOnPress: false` of the modal's options now.
|
|
1164
|
+
private fun holdsBack(record: ModalRecord): Boolean =
|
|
1165
|
+
record.root.resolveShownOptions(DefaultOptions.current).hardwareBackButton.dismissModalOnPress.isFalse
|
|
1166
|
+
|
|
1167
|
+
// The only modal that isn't closed below, with the old root or gone, over no root.
|
|
1168
|
+
private fun isLastWithoutRoot(record: ModalRecord): Boolean = host.root == null &&
|
|
1169
|
+
records.none { it !== record && it.state != State.ClosedBelow && it.state != State.WithOldRoot }
|
|
1170
|
+
|
|
1171
|
+
// The animation of a show ([showing]) or a dismissal of [record]'s own, over [under] (the layer under it); none
|
|
1172
|
+
// when [animation] has none (`AnimationRules.modalIsOwn`) or the record is a sheet. A side that doesn't play
|
|
1173
|
+
// leaves its view as it is; with elements the modal fades (by its own side only when it is a single `alpha`) and
|
|
1174
|
+
// the layer under stands.
|
|
1175
|
+
private fun motionOf(
|
|
1176
|
+
animation: ModalAnimationOptions,
|
|
1177
|
+
record: ModalRecord,
|
|
1178
|
+
showing: Boolean,
|
|
1179
|
+
under: ViewController<*>? = nodeOf(layerUnder(record)),
|
|
1180
|
+
): Motion? {
|
|
1181
|
+
if (record.isSheet || !AnimationRules.modalIsOwn(animation)) return null
|
|
1182
|
+
val modalSide = if (showing) animation.enter else animation.exit
|
|
1183
|
+
val underSide = if (showing) animation.exit else animation.enter
|
|
1184
|
+
val elements = AnimationRules.hasElements(animation)
|
|
1185
|
+
val side = if (elements) {
|
|
1186
|
+
modalSide.takeIf(AnimationRules::isSingleAlpha)
|
|
1187
|
+
} else {
|
|
1188
|
+
modalSide.takeIf(AnimationRules::sidePlays)
|
|
1189
|
+
}
|
|
1190
|
+
val screen = AppearanceDispatcher.visibleNode(record.root)
|
|
1191
|
+
return Motion(
|
|
1192
|
+
side = side,
|
|
1193
|
+
fades = elements && side == null,
|
|
1194
|
+
under = under,
|
|
1195
|
+
underSide = underSide.takeIf { !elements && under != null && AnimationRules.sidePlays(it) },
|
|
1196
|
+
elements = animation.takeIf { elements && under != null },
|
|
1197
|
+
from = if (showing) under else screen,
|
|
1198
|
+
to = if (showing) screen else under,
|
|
1199
|
+
)
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
// The layer under a record: the nearest record below it that comes in or shows; none for the root.
|
|
1203
|
+
private fun layerUnder(record: ModalRecord): ModalRecord? {
|
|
1204
|
+
val index = records.indexOf(record).let { if (it < 0) records.size else it }
|
|
1205
|
+
for (i in index - 1 downTo 0) {
|
|
1206
|
+
val below = records[i]
|
|
1207
|
+
if (below.effective == State.Presenting || below.effective == State.Shown) return below
|
|
1208
|
+
}
|
|
1209
|
+
return null
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
private fun isOut(layer: ModalRecord?): Boolean = layer?.isOut ?: (rootOut && host.root != null)
|
|
1213
|
+
|
|
1214
|
+
private fun nodeOf(layer: ModalRecord?): ViewController<*>? = layer?.root ?: host.root
|
|
1215
|
+
|
|
1216
|
+
// The layer comes back into its layer: a record's container at the place of [at], the root's view.
|
|
1217
|
+
private fun putBack(layer: ModalRecord?, at: ModalRecord?) {
|
|
1218
|
+
if (layer == null) {
|
|
1219
|
+
host.root?.let(views::putBackRoot)
|
|
1220
|
+
rootOut = false
|
|
1221
|
+
} else {
|
|
1222
|
+
views.putBack(layer, at)
|
|
1223
|
+
layer.isOut = false
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
// [options] of a command go into the modal's visible screen, as `mergeOptions` would.
|
|
1228
|
+
private fun mergeInto(record: ModalRecord, options: Options) {
|
|
1229
|
+
if (record.root.isDestroyed) return
|
|
1230
|
+
val screen = AppearanceDispatcher.visibleNode(record.root)
|
|
1231
|
+
if (screen.isDestroyed) return
|
|
1232
|
+
screen.mergeOptions(options)
|
|
1233
|
+
optionsMergedInto(screen)
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
private inline fun whileTaking(work: () -> Unit) {
|
|
1237
|
+
taking = true
|
|
1238
|
+
try {
|
|
1239
|
+
work()
|
|
1240
|
+
} finally {
|
|
1241
|
+
taking = false
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
private fun topOf(node: ViewController<*>): ViewController<*> {
|
|
1246
|
+
var current = node
|
|
1247
|
+
while (true) current = current.parentController ?: return current
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
companion object {
|
|
1251
|
+
/** How long a modal waits for its screens at most, unless `waitForRender` says otherwise. */
|
|
1252
|
+
const val WAIT_LIMIT_MILLIS = 500L
|
|
1253
|
+
|
|
1254
|
+
// What counts for the top of the modals.
|
|
1255
|
+
private val TOP_STATES = setOf(State.Waiting, State.Presenting, State.Shown)
|
|
1256
|
+
|
|
1257
|
+
// What a `dismissAllModals` takes (row 5): all but the old root's and what is gone.
|
|
1258
|
+
private val BATCHED = setOf(State.Waiting, State.Presenting, State.Shown, State.Dismissing, State.ClosedBelow)
|
|
1259
|
+
|
|
1260
|
+
// What may leave with the batch's animation.
|
|
1261
|
+
private val ANIMATED_IN_BATCH = setOf(State.Presenting, State.Shown, State.Dismissing)
|
|
1262
|
+
|
|
1263
|
+
// What keeps a layer under it covered.
|
|
1264
|
+
private val COVERING = setOf(State.Waiting, State.Presenting, State.Shown, State.Dismissing)
|
|
1265
|
+
|
|
1266
|
+
// A record on its way out: a failure of its step ends it.
|
|
1267
|
+
private val LEAVING = setOf(State.Dismissing, State.ClosedBelow)
|
|
1268
|
+
}
|
|
1269
|
+
}
|