@apexnative/navigation 0.0.0-stage → 1.0.0-alpha.1
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/CHANGELOG.md +8 -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 +166 -4
- package/react-native.config.js +22 -0
- package/src/ARCHITECTURE.md +289 -0
- package/src/adapters/NativeANNTurboEventEmitter.ts +15 -0
- package/src/adapters/NativeANNTurboModule.ts +100 -0
- package/src/api/app/AppRegistry.ts +57 -0
- package/src/api/app/activeApp.ts +20 -0
- package/src/api/app/createNavigation.ts +566 -0
- package/src/api/app/roots.ts +40 -0
- package/src/api/app/splash.ts +154 -0
- package/src/api/app/startFailure.tsx +39 -0
- package/src/api/arrangement/arrangementState.ts +98 -0
- package/src/api/commands/commands.ts +371 -0
- package/src/api/commands/errors.ts +99 -0
- package/src/api/commands/presentation.ts +78 -0
- package/src/api/commands/sideMenus.ts +122 -0
- package/src/api/commands/transitions.ts +133 -0
- package/src/api/context/appContext.ts +23 -0
- package/src/api/events/navigationEvents.ts +175 -0
- package/src/api/events/screenLifecycle.ts +27 -0
- package/src/api/events/tabPresses.ts +35 -0
- package/src/api/hinge/hinge.ts +84 -0
- package/src/api/hooks/appHooks.ts +37 -0
- package/src/api/hooks/screenHooks.ts +272 -0
- package/src/api/hooks/useArrangement.ts +26 -0
- package/src/api/hooks/useHinge.ts +26 -0
- package/src/api/hooks/useNavigation.ts +267 -0
- package/src/api/hooks/usePendingLink.ts +11 -0
- package/src/api/hooks/usePreview.ts +111 -0
- package/src/api/hooks/useReservedRegions.ts +26 -0
- package/src/api/hooks/useSafeAreaInsets.ts +23 -0
- package/src/api/index.ts +139 -0
- package/src/api/layout/Root.ts +113 -0
- package/src/api/layout/Screen.ts +55 -0
- package/src/api/layout/SideMenu.ts +87 -0
- package/src/api/layout/SplitView.ts +146 -0
- package/src/api/layout/Stack.ts +48 -0
- package/src/api/layout/Tabs.ts +339 -0
- package/src/api/layout/element.ts +114 -0
- package/src/api/linking/linkPaths.ts +159 -0
- package/src/api/linking/linking.ts +242 -0
- package/src/api/linking/pendingLinks.ts +37 -0
- package/src/api/linking/types.ts +130 -0
- package/src/api/navigation.ts +269 -0
- package/src/api/options/OptionsChain.ts +142 -0
- package/src/api/options/ScreenOptions.ts +81 -0
- package/src/api/options/buttons.ts +43 -0
- package/src/api/safeArea/ANNSafeAreaViewNativeComponent.ts +28 -0
- package/src/api/safeArea/screenInsets.ts +86 -0
- package/src/api/safeArea/screenRegions.ts +99 -0
- package/src/api/screens/ScreenBoundary.tsx +52 -0
- package/src/api/screens/arrangement.ts +106 -0
- package/src/api/screens/defineScreen.ts +57 -0
- package/src/api/screens/nativeScreenCalls.ts +59 -0
- package/src/api/screens/nativeScreens.ts +58 -0
- package/src/api/screens/registerScreens.tsx +364 -0
- package/src/api/slots/ANNSlotNativeComponent.ts +23 -0
- package/src/api/slots/SlotHost.tsx +64 -0
- package/src/api/state/navigationState.ts +95 -0
- package/src/api/testIDs.ts +11 -0
- package/src/api/theme/theme.ts +184 -0
- package/src/api/types.ts +95 -0
- package/src/engine/backListeners.ts +36 -0
- package/src/engine/buttons.ts +91 -0
- package/src/engine/commands.ts +469 -0
- package/src/engine/events.ts +24 -0
- package/src/engine/ids.ts +7 -0
- package/src/engine/launchState.ts +35 -0
- package/src/engine/layout.ts +247 -0
- package/src/engine/mergeOptions.ts +20 -0
- package/src/engine/native.ts +51 -0
- package/src/engine/nativeScreens.ts +263 -0
- package/src/engine/options.ts +165 -0
- package/src/engine/places.ts +205 -0
- package/src/engine/props.ts +45 -0
- package/src/engine/reactMeasures.ts +24 -0
- package/src/engine/rememberedOptions.ts +111 -0
- package/src/engine/screens.tsx +239 -0
- package/src/engine/slots.ts +191 -0
- package/src/engine/tabs.ts +95 -0
- package/src/index.ts +3 -0
- package/src/interfaces/ComponentEvents.ts +214 -0
- package/src/interfaces/Events.ts +227 -0
- package/src/interfaces/Layout.ts +161 -0
- package/src/interfaces/Options.ts +175 -0
- package/src/interfaces/options/animations.ts +480 -0
- package/src/interfaces/options/bottomTabs.ts +481 -0
- package/src/interfaces/options/buttons.ts +364 -0
- package/src/interfaces/options/common.ts +76 -0
- package/src/interfaces/options/modals.ts +217 -0
- package/src/interfaces/options/preview.ts +40 -0
- package/src/interfaces/options/sideMenu.ts +132 -0
- package/src/interfaces/options/splitView.ts +127 -0
- package/src/interfaces/options/stack.ts +110 -0
- package/src/interfaces/options/system.ts +252 -0
- package/src/interfaces/options/toolbar.ts +47 -0
- package/src/interfaces/options/topBar.ts +828 -0
|
@@ -0,0 +1,1404 @@
|
|
|
1
|
+
#import "ANNBottomTabsController.h"
|
|
2
|
+
#import "ANNAppearanceDispatcher.h"
|
|
3
|
+
#import "ANNAssert.h"
|
|
4
|
+
#import "ANNBarBackgroundComponent.h"
|
|
5
|
+
#import "ANNBottomTabsPresenter.h"
|
|
6
|
+
#import "ANNComponentViewController.h"
|
|
7
|
+
#import "ANNMoreNavigationDelegate.h"
|
|
8
|
+
#import "ANNNavigationState.h"
|
|
9
|
+
#import "ANNNodeRegistry.h"
|
|
10
|
+
#import "ANNPendingLayers.h"
|
|
11
|
+
#import "ANNScreenBars.h"
|
|
12
|
+
#import "ANNScrollToTop.h"
|
|
13
|
+
#import "ANNShownScreens.h"
|
|
14
|
+
#import "ANNStackController.h"
|
|
15
|
+
#import "ANNSystemUI.h"
|
|
16
|
+
#import "ANNTabLongPress.h"
|
|
17
|
+
#import "ANNTabsDesign.h"
|
|
18
|
+
#import "ANNTabsPreloadWindow.h"
|
|
19
|
+
#import "InteractivePopGestureDelegate.h"
|
|
20
|
+
#import <React/RCTLog.h>
|
|
21
|
+
|
|
22
|
+
// The longest the tabs drive the appearance of a switch whose new screen UIKit never shows (it is not a wait: nothing
|
|
23
|
+
// waits for it; the drive only must not stay).
|
|
24
|
+
static const NSTimeInterval ANNSwitchDriveLimit = 2;
|
|
25
|
+
|
|
26
|
+
// How long a step of `afterInitialTab` waits for its tab's root to mount before the next one starts, and how long a
|
|
27
|
+
// lent React view stays in the preload window at most without mounting.
|
|
28
|
+
static const NSTimeInterval ANNTabMountLimit = 0.5;
|
|
29
|
+
|
|
30
|
+
// The key of the tabs' ready handlers on the screens of their selected tab (`afterInitialTab`).
|
|
31
|
+
static NSString *const ANNTabsReadyKey = @"ApexNavigation.tabs";
|
|
32
|
+
|
|
33
|
+
// Whether UIKit pops the stack of a tab tapped again itself: the core answers "select" and lets it. NO would make the
|
|
34
|
+
// core pop it for every source and answer "don't" (the simulator decides).
|
|
35
|
+
static const BOOL ANNUIKitPopsOnRepeatPress = YES;
|
|
36
|
+
|
|
37
|
+
static ANNTabsAttachMode ANNAttachModeOf(ANNBottomTabsOptions *bottomTabs) {
|
|
38
|
+
NSString *mode = [bottomTabs.tabsAttachMode withDefault:nil];
|
|
39
|
+
if ([mode isEqualToString:@"afterInitialTab"]) {
|
|
40
|
+
return ANNTabsAttachModeAfterInitialTab;
|
|
41
|
+
}
|
|
42
|
+
if ([mode isEqualToString:@"onSwitchToTab"]) {
|
|
43
|
+
return ANNTabsAttachModeOnSwitchToTab;
|
|
44
|
+
}
|
|
45
|
+
return ANNTabsAttachModeTogether;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// The index as the options give it, without its fraction; NO when it is out of the tabs (one text on both platforms, a
|
|
49
|
+
// negative one too).
|
|
50
|
+
static BOOL ANNTabIndexOf(Double *value, NSUInteger count, NSUInteger *index) {
|
|
51
|
+
double given = value.get;
|
|
52
|
+
double whole = trunc(given);
|
|
53
|
+
if (whole < 0 || whole >= (double)count) {
|
|
54
|
+
RCTLogWarn(
|
|
55
|
+
@"[ApexNavigation] bottomTabs.currentTabIndex %@ is out of range: the layout has "
|
|
56
|
+
@"%lu tabs",
|
|
57
|
+
@(given), (unsigned long)count);
|
|
58
|
+
return NO;
|
|
59
|
+
}
|
|
60
|
+
*index = (NSUInteger)whole;
|
|
61
|
+
return YES;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// The stacks of a tab: the tab itself, or those inside it (a side menu's center and menus).
|
|
65
|
+
static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackController *> *stacks) {
|
|
66
|
+
if ([node isKindOfClass:ANNStackController.class]) {
|
|
67
|
+
[stacks addObject:(ANNStackController *)node];
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
for (UIViewController *child in node.layoutChildren) {
|
|
71
|
+
ANNStacksOfNode(child, stacks);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@interface ANNBottomTabsController ()
|
|
76
|
+
@property(nonatomic, readwrite) NSUInteger selectedTabIndex;
|
|
77
|
+
@end
|
|
78
|
+
|
|
79
|
+
@implementation ANNBottomTabsController {
|
|
80
|
+
NSArray<UIViewController *> *_tabs;
|
|
81
|
+
// The `UITab` of each tab, in layout order (iOS 18 and later).
|
|
82
|
+
NSArray *_uiTabs;
|
|
83
|
+
NSHashTable<UIViewController *> *_renderedTabs;
|
|
84
|
+
ANNTabsPreloadWindow *_preloadWindow;
|
|
85
|
+
NSHashTable<ANNComponentViewController *> *_lentScreens;
|
|
86
|
+
// The chain of `afterInitialTab`: started once; a destroy ends it by its number.
|
|
87
|
+
BOOL _chainStarted;
|
|
88
|
+
NSUInteger _chainNumber;
|
|
89
|
+
NSHashTable<ANNComponentViewController *> *_chainWaited;
|
|
90
|
+
// A user's press that UIKit is to finish (`didSelect…`): the tab and the one it leaves.
|
|
91
|
+
NSUInteger _pressedIndex;
|
|
92
|
+
NSUInteger _pressedPrevious;
|
|
93
|
+
// A choice from code runs UIKit's selection: its delegate calls say nothing. The tab chosen stays marked until the
|
|
94
|
+
// next turn, for the More navigation's `willShow`.
|
|
95
|
+
BOOL _selectingFromCode;
|
|
96
|
+
NSUInteger _codeChoiceIndex;
|
|
97
|
+
// `ANN.BottomTabSelected` waiting for the new tab's screen to appear: its tabs, by number.
|
|
98
|
+
BOOL _hasPendingSelected;
|
|
99
|
+
NSUInteger _pendingSelectedIndex;
|
|
100
|
+
NSUInteger _pendingSelectedPrevious;
|
|
101
|
+
NSUInteger _pendingSelectedNumber;
|
|
102
|
+
// The tab long pressed now, whose selection by UIKit at the release is cancelled.
|
|
103
|
+
NSUInteger _longPressedIndex;
|
|
104
|
+
ANNTabLongPress *_longPress;
|
|
105
|
+
ANNMoreNavigationDelegate *_moreDelegate;
|
|
106
|
+
__weak UIViewController *_moreShownTop;
|
|
107
|
+
// The tabs a repaint left for their next selection (they weren't in a window).
|
|
108
|
+
NSHashTable<UIViewController *> *_staleTabs;
|
|
109
|
+
// The switch the tabs drive: its tabs, whether it sends `Selected`, its number.
|
|
110
|
+
BOOL _switchActive;
|
|
111
|
+
NSUInteger _switchFrom;
|
|
112
|
+
NSUInteger _switchTo;
|
|
113
|
+
BOOL _switchSendsSelected;
|
|
114
|
+
NSUInteger _switchNumber;
|
|
115
|
+
// A More pick whose screen shows without a transition: `Selected` is decided as the More navigation showed it.
|
|
116
|
+
dispatch_block_t _decideAtMoreDidShow;
|
|
117
|
+
// UIKit's own look of the More navigation's bar, given back to its list.
|
|
118
|
+
UINavigationBarAppearance *_moreListAppearance;
|
|
119
|
+
__weak ANNStackController *_moreStack;
|
|
120
|
+
// Before iOS 18: whether the explicit visibility was applied once, and the core's hidden state.
|
|
121
|
+
BOOL _visibilityApplied;
|
|
122
|
+
BOOL _hiddenBeforeTabAPI;
|
|
123
|
+
// Whether the bar has laid out in a window once (its titles are measured again then).
|
|
124
|
+
BOOL _barLaidOutInWindow;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
#pragma mark - Making
|
|
128
|
+
|
|
129
|
+
- (instancetype)initWithLayoutInfo:(ANNLayoutInfo *)layoutInfo
|
|
130
|
+
creator:(id<ANNComponentViewCreator>)creator
|
|
131
|
+
options:(ANNNavigationOptions *)options
|
|
132
|
+
defaultOptions:(ANNNavigationOptions *)defaultOptions
|
|
133
|
+
presenter:(ANNNodePresenter *)presenter
|
|
134
|
+
eventEmitter:(ANNEventEmitter *)eventEmitter
|
|
135
|
+
childViewControllers:(NSArray<UIViewController *> *)childViewControllers {
|
|
136
|
+
self = [super initWithNibName:nil bundle:nil];
|
|
137
|
+
if (self) {
|
|
138
|
+
_tabs = [childViewControllers copy] ?: @[];
|
|
139
|
+
_renderedTabs = [NSHashTable weakObjectsHashTable];
|
|
140
|
+
_lentScreens = [NSHashTable weakObjectsHashTable];
|
|
141
|
+
_staleTabs = [NSHashTable weakObjectsHashTable];
|
|
142
|
+
_pressedIndex = NSNotFound;
|
|
143
|
+
_codeChoiceIndex = NSNotFound;
|
|
144
|
+
_longPressedIndex = NSNotFound;
|
|
145
|
+
_components = [[ANNReactComponentRegistry alloc] initWithCreator:creator];
|
|
146
|
+
// The tabs are every tab's parent by the layout, also where UIKit gives none (a tab of More with the tab API).
|
|
147
|
+
for (UIViewController *tab in _tabs) {
|
|
148
|
+
[tab setLayoutParentFallback:self];
|
|
149
|
+
}
|
|
150
|
+
// The first tab from the layout's own one-shot options, before the node keeps them without.
|
|
151
|
+
_selectedTabIndex = [self initialTabIndexOf:options.bottomTabs];
|
|
152
|
+
// By assignment: with an overridden getter alone UIKit calls none of the `UITab` methods.
|
|
153
|
+
self.delegate = self;
|
|
154
|
+
}
|
|
155
|
+
[self.nodeHelper setUpWithLayoutInfo:layoutInfo
|
|
156
|
+
creator:creator
|
|
157
|
+
options:options
|
|
158
|
+
defaultOptions:defaultOptions
|
|
159
|
+
presenter:presenter
|
|
160
|
+
eventEmitter:eventEmitter];
|
|
161
|
+
[self setUpTabs];
|
|
162
|
+
return self;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// `currentTabId` when a tab is or holds a layout with that id, else `currentTabIndex` in range, else the first.
|
|
166
|
+
- (NSUInteger)initialTabIndexOf:(ANNBottomTabsOptions *)bottomTabs {
|
|
167
|
+
NSString *tabId = [bottomTabs.currentTabId withDefault:nil];
|
|
168
|
+
if (tabId.length > 0) {
|
|
169
|
+
NSUInteger index = [self indexOfTabWithLayoutId:tabId];
|
|
170
|
+
if (index != NSNotFound) {
|
|
171
|
+
return index;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
NSUInteger index = 0;
|
|
175
|
+
if (bottomTabs.currentTabIndex.hasValue &&
|
|
176
|
+
ANNTabIndexOf(bottomTabs.currentTabIndex, _tabs.count, &index)) {
|
|
177
|
+
return index;
|
|
178
|
+
}
|
|
179
|
+
return 0;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// The tabs go to UIKit once their items are drawn: the attach mode and the custom row's mode first, then the items,
|
|
183
|
+
// then the tabs with the first one selected, then what needs the tabs in the bar.
|
|
184
|
+
- (void)setUpTabs {
|
|
185
|
+
ANNNavigationOptions *resolved = [self resolveOptionsWithDefault];
|
|
186
|
+
_attachMode = ANNAttachModeOf(resolved.bottomTabs);
|
|
187
|
+
_usesCustomRow = [self decideCustomRow];
|
|
188
|
+
ANNBottomTabsPresenter *presenter = [self tabsPresenter];
|
|
189
|
+
[presenter applyFirstLook];
|
|
190
|
+
if (@available(iOS 18.0, *)) {
|
|
191
|
+
_usesTabAPI = YES;
|
|
192
|
+
_uiTabs = [self makeUITabs];
|
|
193
|
+
}
|
|
194
|
+
[presenter styleItemsBeforeTabsAreSet];
|
|
195
|
+
[presenter configureSidebarAndCustomizationBeforeTabsAreSet];
|
|
196
|
+
// UIKit's calls while the tabs are set are no user's press.
|
|
197
|
+
_selectingFromCode = YES;
|
|
198
|
+
@try {
|
|
199
|
+
if (@available(iOS 18.0, *)) {
|
|
200
|
+
NSArray<UITab *> *uiTabs = _uiTabs;
|
|
201
|
+
self.tabs = uiTabs;
|
|
202
|
+
} else {
|
|
203
|
+
self.viewControllers = _tabs;
|
|
204
|
+
}
|
|
205
|
+
} @finally {
|
|
206
|
+
_selectingFromCode = NO;
|
|
207
|
+
}
|
|
208
|
+
[self selectInUIKit:_selectedTabIndex];
|
|
209
|
+
// No Edit in More: set again after every list of tabs, which may reset it.
|
|
210
|
+
self.customizableViewControllers = nil;
|
|
211
|
+
[self setUpMoreNavigation];
|
|
212
|
+
[presenter applyAfterTabsAreSet:resolved];
|
|
213
|
+
// The first shown screen's `visible: false` hides the bar before the first frame, without animation.
|
|
214
|
+
[self applyFirstVisibility];
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Mixed components fall back to the system's items; with every tab's component, the custom row.
|
|
218
|
+
- (BOOL)decideCustomRow {
|
|
219
|
+
NSUInteger withComponent = 0;
|
|
220
|
+
for (UIViewController *tab in _tabs) {
|
|
221
|
+
NSString *name = [[tab resolveOptionsWithDefault].bottomTab.component.name withDefault:nil];
|
|
222
|
+
if (name.length > 0) {
|
|
223
|
+
withComponent++;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (withComponent > 0 && withComponent < _tabs.count) {
|
|
227
|
+
RCTLogWarn(
|
|
228
|
+
@"[ApexNavigation] Mixed bottomTab.component usage detected (%lu of %lu tabs). "
|
|
229
|
+
@"All tabs must declare a component or none — falling back to native rendering for "
|
|
230
|
+
@"all tabs.",
|
|
231
|
+
(unsigned long)withComponent, (unsigned long)_tabs.count);
|
|
232
|
+
}
|
|
233
|
+
return _tabs.count > 0 && withComponent == _tabs.count;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// One `UITab` per tab, its identifier the tab's id (a new UUID without one); the first `role: 'search'` is the system's
|
|
237
|
+
// search tab (`bottomTab.role`), a later one an ordinary tab with the warning. With the custom row every role is an
|
|
238
|
+
// ordinary tab.
|
|
239
|
+
- (NSArray *)makeUITabs API_AVAILABLE(ios(18.0)) {
|
|
240
|
+
NSMutableArray<UITab *> *uiTabs = [NSMutableArray new];
|
|
241
|
+
BOOL hasSearch = NO;
|
|
242
|
+
for (UIViewController *tab in _tabs) {
|
|
243
|
+
NSString *identifier = tab.layoutInfo.componentId;
|
|
244
|
+
if (identifier.length == 0) {
|
|
245
|
+
identifier = NSUUID.UUID.UUIDString;
|
|
246
|
+
}
|
|
247
|
+
UIViewController * (^provider)(UITab *) = ^UIViewController *(UITab *uiTab) {
|
|
248
|
+
return tab;
|
|
249
|
+
};
|
|
250
|
+
NSString *role =
|
|
251
|
+
_usesCustomRow ? nil : [[tab resolveOptionsWithDefault].bottomTab.role withDefault:nil];
|
|
252
|
+
UITab *uiTab = nil;
|
|
253
|
+
if ([role isEqualToString:@"search"]) {
|
|
254
|
+
if (!hasSearch) {
|
|
255
|
+
hasSearch = YES;
|
|
256
|
+
uiTab = [[UISearchTab alloc] initWithViewControllerProvider:provider];
|
|
257
|
+
} else {
|
|
258
|
+
RCTLogWarn(
|
|
259
|
+
@"[ApexNavigation] Only one tab per bottomTabs layout may use role:'search'. "
|
|
260
|
+
@"Subsequent 'search' roles are ignored — creating a normal tab instead.");
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (!uiTab) {
|
|
264
|
+
uiTab = [[UITab alloc] initWithTitle:@""
|
|
265
|
+
image:nil
|
|
266
|
+
identifier:identifier
|
|
267
|
+
viewControllerProvider:provider];
|
|
268
|
+
}
|
|
269
|
+
[uiTabs addObject:uiTab];
|
|
270
|
+
}
|
|
271
|
+
return uiTabs;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// UIKit's More navigation shows the tabs past the fifth in compact width: the tabs hear it through its delegate, which
|
|
275
|
+
// keeps the one UIKit had.
|
|
276
|
+
- (void)setUpMoreNavigation {
|
|
277
|
+
if (_tabs.count <= 5) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
UINavigationController *more = self.moreNavigationController;
|
|
281
|
+
if (more.delegate == _moreDelegate && _moreDelegate) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
_moreListAppearance = [more.navigationBar.standardAppearance copy];
|
|
285
|
+
id<UINavigationControllerDelegate> previous = more.delegate;
|
|
286
|
+
if ([previous isKindOfClass:ANNMoreNavigationDelegate.class]) {
|
|
287
|
+
previous = ((ANNMoreNavigationDelegate *)previous).previous;
|
|
288
|
+
}
|
|
289
|
+
_moreDelegate = [[ANNMoreNavigationDelegate alloc] initWithTabs:self previous:previous];
|
|
290
|
+
more.delegate = _moreDelegate;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
- (void)applyFirstVisibility {
|
|
294
|
+
UIViewController *screen = [self screenOfTabAtIndex:_selectedTabIndex];
|
|
295
|
+
ANNNavigationOptions *options =
|
|
296
|
+
screen ? [screen resolveOptionsWithDefault] : [self resolveOptionsWithDefault];
|
|
297
|
+
BOOL hidden = ![options.bottomTabs.visible withDefault:YES];
|
|
298
|
+
if (hidden) {
|
|
299
|
+
[self setBarHidden:YES animated:NO];
|
|
300
|
+
}
|
|
301
|
+
_visibilityApplied = YES;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
#pragma mark - Places
|
|
305
|
+
|
|
306
|
+
+ (ANNBottomTabsController *)tabsOf:(UIViewController *)node {
|
|
307
|
+
for (UIViewController *parent = node.layoutParent; parent; parent = parent.layoutParent) {
|
|
308
|
+
if ([parent isKindOfClass:ANNBottomTabsController.class]) {
|
|
309
|
+
return (ANNBottomTabsController *)parent;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return nil;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
- (NSArray<UIViewController *> *)layoutTabs {
|
|
316
|
+
return _tabs;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
- (ANNBottomTabsPresenter *)tabsPresenter {
|
|
320
|
+
ANNNodePresenter *presenter = self.presenter;
|
|
321
|
+
return [presenter isKindOfClass:ANNBottomTabsPresenter.class]
|
|
322
|
+
? (ANNBottomTabsPresenter *)presenter
|
|
323
|
+
: nil;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
- (id)uiTabAtIndex:(NSUInteger)index {
|
|
327
|
+
return index < [_uiTabs count] ? _uiTabs[index] : nil;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
- (NSUInteger)indexOfTab:(UIViewController *)tab {
|
|
331
|
+
return tab ? [_tabs indexOfObjectIdenticalTo:tab] : NSNotFound;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
- (NSUInteger)indexOfTabHolding:(UIViewController *)node {
|
|
335
|
+
for (UIViewController *child = node; child; child = child.layoutParent) {
|
|
336
|
+
if (child.layoutParent == self) {
|
|
337
|
+
return [self indexOfTab:child];
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return NSNotFound;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// A tab with the id, or one that holds a layout with it at any depth. Only a node known by its id counts: the parts of
|
|
344
|
+
// a side menu carry the ids of their places, which select nothing.
|
|
345
|
+
- (NSUInteger)indexOfTabWithLayoutId:(NSString *)layoutId {
|
|
346
|
+
for (NSUInteger index = 0; index < _tabs.count; index++) {
|
|
347
|
+
if ([self node:_tabs[index] holdsLayoutId:layoutId]) {
|
|
348
|
+
return index;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return NSNotFound;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
- (BOOL)node:(UIViewController *)node holdsLayoutId:(NSString *)layoutId {
|
|
355
|
+
if ([node.layoutInfo.componentId isEqualToString:layoutId] &&
|
|
356
|
+
[ANNNodeRegistry nodeForComponentId:layoutId] == node) {
|
|
357
|
+
return YES;
|
|
358
|
+
}
|
|
359
|
+
for (UIViewController *child in node.layoutChildren) {
|
|
360
|
+
if ([self node:child holdsLayoutId:layoutId]) {
|
|
361
|
+
return YES;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return NO;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
- (UIViewController *)screenOfTabAtIndex:(NSUInteger)index {
|
|
368
|
+
if (index >= _tabs.count) {
|
|
369
|
+
return nil;
|
|
370
|
+
}
|
|
371
|
+
UIViewController *screen = _tabs[index].presentedComponentViewController;
|
|
372
|
+
return [screen isKindOfClass:ANNComponentViewController.class] ? screen : nil;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
- (UIViewController *)selectedTabNode {
|
|
376
|
+
return _selectedTabIndex < _tabs.count ? _tabs[_selectedTabIndex] : nil;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
#pragma mark - ANNLayoutProtocol
|
|
380
|
+
|
|
381
|
+
- (UIViewController *)getCurrentChild {
|
|
382
|
+
return [self selectedTabNode];
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
- (NSArray<UIViewController *> *)layoutChildren {
|
|
386
|
+
return _tabs ?: @[];
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
- (UIViewController *)systemUIChild {
|
|
390
|
+
return [self selectedTabNode];
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
#pragma mark - The system UI
|
|
394
|
+
|
|
395
|
+
// The child the status bar and the orientations follow: the selected tab. While UIKit's More navigation is selected,
|
|
396
|
+
// the screen on its top when it is one of a tab open from More (in the window's hierarchy, unlike the tab's stack
|
|
397
|
+
// node), and nothing while the More list shows: the tabs answer then. UIKit passes the home indicator and the deferred
|
|
398
|
+
// edges to the selected view controller itself.
|
|
399
|
+
- (nullable UIViewController *)systemUIForwardChild {
|
|
400
|
+
if (_tabs.count > 5 && self.selectedViewController == self.moreNavigationController) {
|
|
401
|
+
UIViewController *top = self.moreNavigationController.topViewController;
|
|
402
|
+
return top.isLayoutNode ? top : nil;
|
|
403
|
+
}
|
|
404
|
+
return [self selectedTabNode];
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
- (UIViewController *)childViewControllerForStatusBarStyle {
|
|
408
|
+
return [self systemUIForwardChild];
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
- (UIViewController *)childViewControllerForStatusBarHidden {
|
|
412
|
+
return [self systemUIForwardChild];
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// The More list: the tabs' own options over their parents' and the defaults.
|
|
416
|
+
- (UIStatusBarStyle)preferredStatusBarStyle {
|
|
417
|
+
ANNNodePresenter *presenter = self.presenter;
|
|
418
|
+
if (!presenter) {
|
|
419
|
+
return [super preferredStatusBarStyle];
|
|
420
|
+
}
|
|
421
|
+
return [presenter statusBarStyleForOptions:[ANNSystemUI ownOptionsWithDefaultOf:self]];
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
- (BOOL)prefersStatusBarHidden {
|
|
425
|
+
ANNNodePresenter *presenter = self.presenter;
|
|
426
|
+
if (!presenter) {
|
|
427
|
+
return [super prefersStatusBarHidden];
|
|
428
|
+
}
|
|
429
|
+
return [presenter statusBarHiddenForOptions:[ANNSystemUI ownOptionsWithDefaultOf:self]
|
|
430
|
+
navigationBarHidden:NO];
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// UIKit's tab bar controller asks every tab (F3): the tabs answer what the child they follow answers.
|
|
434
|
+
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
|
|
435
|
+
UIViewController *child = [self systemUIForwardChild];
|
|
436
|
+
if (child) {
|
|
437
|
+
return child.supportedInterfaceOrientations;
|
|
438
|
+
}
|
|
439
|
+
ANNNodePresenter *presenter = self.presenter;
|
|
440
|
+
if (!presenter) {
|
|
441
|
+
return [super supportedInterfaceOrientations];
|
|
442
|
+
}
|
|
443
|
+
return [presenter supportedOrientationsForOptions:[ANNSystemUI ownOptionsWithDefaultOf:self]];
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// The selected tab's waited screens by the command's rule; with `together` the top screen of every other tab too, by
|
|
447
|
+
// the first mount of its root (More's tabs too).
|
|
448
|
+
- (NSArray<UIViewController *> *)waitedComponentViewControllers {
|
|
449
|
+
NSMutableArray<UIViewController *> *screens =
|
|
450
|
+
[[[self selectedTabNode] waitedComponentViewControllers] mutableCopy]
|
|
451
|
+
?: [NSMutableArray new];
|
|
452
|
+
if (_attachMode != ANNTabsAttachModeTogether) {
|
|
453
|
+
return screens;
|
|
454
|
+
}
|
|
455
|
+
for (NSUInteger index = 0; index < _tabs.count; index++) {
|
|
456
|
+
UIViewController *screen =
|
|
457
|
+
index == _selectedTabIndex ? nil : [self screenOfTabAtIndex:index];
|
|
458
|
+
if (screen && [screens indexOfObjectIdenticalTo:screen] == NSNotFound) {
|
|
459
|
+
[screens addObject:screen];
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
return screens;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
- (ANNWaitedReadiness)waitedReadinessOfScreen:(UIViewController *)screen {
|
|
466
|
+
NSUInteger index = [self indexOfTabHolding:screen];
|
|
467
|
+
return index != NSNotFound && index != _selectedTabIndex ? ANNWaitedReadinessRootMounted
|
|
468
|
+
: ANNWaitedReadinessContent;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// The selected tab renders in place; the others by the attach mode. Nothing is selected or loaded one by one: the
|
|
472
|
+
// screens of a tab render without appearing.
|
|
473
|
+
- (void)render {
|
|
474
|
+
if (self.nodeHelper.destroyed) {
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
[self renderTabAtIndex:_selectedTabIndex preloading:NO];
|
|
478
|
+
switch (_attachMode) {
|
|
479
|
+
case ANNTabsAttachModeTogether:
|
|
480
|
+
for (NSUInteger index = 0; index < _tabs.count; index++) {
|
|
481
|
+
if (index != _selectedTabIndex) {
|
|
482
|
+
[self renderTabAtIndex:index preloading:YES];
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
break;
|
|
486
|
+
case ANNTabsAttachModeAfterInitialTab:
|
|
487
|
+
[self startChainWhenSelectedTabIsReady];
|
|
488
|
+
break;
|
|
489
|
+
case ANNTabsAttachModeOnSwitchToTab:
|
|
490
|
+
break;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// The tabs' own merge: the own options (without the one-shot ones), the choice from code, the bar's part, then the
|
|
495
|
+
// parent without `bottomTabs`.
|
|
496
|
+
- (void)mergeOptions:(ANNNavigationOptions *)options {
|
|
497
|
+
[self.nodeHelper mergeOwnOptions:options];
|
|
498
|
+
[self chooseTabFromCode:options.bottomTabs];
|
|
499
|
+
[self.presenter mergeOptions:options resolvedOptions:[self resolveOptionsWithDefault]];
|
|
500
|
+
[self.layoutParent mergeChildOptions:[self optionsForParent:options] child:self];
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// A tab or a screen in it merged: its item, the choice from code, the bar when the tab is the selected one, the
|
|
504
|
+
// accessory from any tab at once; then the parent without `bottomTabs`.
|
|
505
|
+
- (void)mergeChildOptions:(ANNNavigationOptions *)options child:(UIViewController *)child {
|
|
506
|
+
NSUInteger index = [self indexOfTab:child];
|
|
507
|
+
if (index != NSNotFound && !self.nodeHelper.destroyed) {
|
|
508
|
+
ANNBottomTabsPresenter *presenter = [self tabsPresenter];
|
|
509
|
+
if (options.bottomTab.hasValue) {
|
|
510
|
+
[presenter mergeBottomTab:options.bottomTab ofTabAtIndex:index];
|
|
511
|
+
}
|
|
512
|
+
[self chooseTabFromCode:options.bottomTabs];
|
|
513
|
+
if (options.bottomTabs.hasValue) {
|
|
514
|
+
[presenter mergeChildBar:options.bottomTabs
|
|
515
|
+
resolvedOptions:[self resolveOptionsWithDefault]
|
|
516
|
+
fromSelectedTab:index == _selectedTabIndex];
|
|
517
|
+
}
|
|
518
|
+
// The tabs' view takes the selected tab's `layout.backgroundColor` over their own.
|
|
519
|
+
if (options.layout.backgroundColor.hasValue && index == _selectedTabIndex) {
|
|
520
|
+
[presenter applyBackground:[self resolveOptionsWithDefault]];
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
[self.layoutParent mergeChildOptions:[self optionsForParent:options] child:self];
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
- (ANNNavigationOptions *)optionsForParent:(ANNNavigationOptions *)options {
|
|
527
|
+
if (!options.bottomTabs.hasValue) {
|
|
528
|
+
return options;
|
|
529
|
+
}
|
|
530
|
+
ANNNavigationOptions *up = [options copy];
|
|
531
|
+
up.bottomTabs = [ANNBottomTabsOptions new];
|
|
532
|
+
return up;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
// A press or pick that leaves the tab sends `Selected` first; its `popToRootOnBlur` comes right after it.
|
|
536
|
+
- (void)childDidDisappear:(UIViewController *)child {
|
|
537
|
+
NSUInteger index = [self indexOfTab:child];
|
|
538
|
+
if (index == NSNotFound) {
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
BOOL selectedPending = (_hasPendingSelected && _pendingSelectedPrevious == index) ||
|
|
542
|
+
(_pressedIndex != NSNotFound && _pressedPrevious == index) ||
|
|
543
|
+
(_switchActive && _switchSendsSelected && _switchFrom == index);
|
|
544
|
+
if (!selectedPending) {
|
|
545
|
+
[self popToRootOnBlurOfTabAtIndex:index];
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
// Once: the tabs' screens go, then every root the tabs own stops, on the main queue; what waits for a selection goes
|
|
550
|
+
// silently.
|
|
551
|
+
- (void)destroy {
|
|
552
|
+
if (![self.nodeHelper markDestroyed]) {
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
_hasPendingSelected = NO;
|
|
556
|
+
_decideAtMoreDidShow = nil;
|
|
557
|
+
_chainNumber++;
|
|
558
|
+
if (_switchActive) {
|
|
559
|
+
_switchActive = NO;
|
|
560
|
+
[ANNAppearanceDispatcher stopDrivingAppearanceOf:@[ _tabs[_switchFrom], _tabs[_switchTo] ]];
|
|
561
|
+
}
|
|
562
|
+
[_longPress detach];
|
|
563
|
+
[self.nodeHelper unregisterNode];
|
|
564
|
+
for (UIViewController *tab in _tabs) {
|
|
565
|
+
@try {
|
|
566
|
+
[tab destroy];
|
|
567
|
+
} @catch (NSException *exception) {
|
|
568
|
+
RCTLogWarn(@"[ApexNavigation] could not destroy the tab '%@': %@",
|
|
569
|
+
tab.layoutInfo.componentId ?: @"", exception.reason ?: exception.name);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
[self closePreloadWindow];
|
|
573
|
+
[[self tabsPresenter] tabsWillGo];
|
|
574
|
+
[_components stopAll];
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
#pragma mark - The view
|
|
578
|
+
|
|
579
|
+
- (void)viewDidLoad {
|
|
580
|
+
[super viewDidLoad];
|
|
581
|
+
if (!_longPress) {
|
|
582
|
+
_longPress = [[ANNTabLongPress alloc] initWithTabs:self];
|
|
583
|
+
}
|
|
584
|
+
[_longPress attach];
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
- (void)viewDidLayoutSubviews {
|
|
588
|
+
[super viewDidLayoutSubviews];
|
|
589
|
+
if (!_barLaidOutInWindow && self.tabBar.window) {
|
|
590
|
+
_barLaidOutInWindow = YES;
|
|
591
|
+
[[self tabsPresenter] barDidLayOutInWindow];
|
|
592
|
+
}
|
|
593
|
+
[[self tabsPresenter] tabsDidLayOut];
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
- (void)viewWillAppear:(BOOL)animated {
|
|
597
|
+
[super viewWillAppear:animated];
|
|
598
|
+
[[self tabsPresenter] tabsDidLayOut];
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// `afterInitialTab` goes on at the tabs' first appearance at the latest.
|
|
602
|
+
- (void)viewDidAppear:(BOOL)animated {
|
|
603
|
+
[super viewDidAppear:animated];
|
|
604
|
+
[self scheduleChain];
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
#pragma mark - Rendering and the preload window
|
|
608
|
+
|
|
609
|
+
- (void)renderTabAtIndex:(NSUInteger)index preloading:(BOOL)preloading {
|
|
610
|
+
if (index >= _tabs.count) {
|
|
611
|
+
return;
|
|
612
|
+
}
|
|
613
|
+
UIViewController *tab = _tabs[index];
|
|
614
|
+
if ([_renderedTabs containsObject:tab]) {
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
[_renderedTabs addObject:tab];
|
|
618
|
+
[tab render];
|
|
619
|
+
if (preloading) {
|
|
620
|
+
[self lendTopOfTabAtIndex:index];
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
// The React view of the tab's top screen mounts in the preload window and comes back into its screen at its mount or
|
|
625
|
+
// when its tab first shows, whichever comes first; a native screen stays where it is.
|
|
626
|
+
- (void)lendTopOfTabAtIndex:(NSUInteger)index {
|
|
627
|
+
UIViewController *node = [self screenOfTabAtIndex:index];
|
|
628
|
+
if (![node isKindOfClass:ANNComponentViewController.class]) {
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
ANNComponentViewController *screen = (ANNComponentViewController *)node;
|
|
632
|
+
UIView<ANNComponentProtocol> *content = screen.reactView;
|
|
633
|
+
if (![content respondsToSelector:@selector(whenMounted:)] || content.hasMounted) {
|
|
634
|
+
return;
|
|
635
|
+
}
|
|
636
|
+
if (!_preloadWindow) {
|
|
637
|
+
_preloadWindow = [ANNTabsPreloadWindow preloadWindow];
|
|
638
|
+
}
|
|
639
|
+
if (![screen lendContentTo:_preloadWindow]) {
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
[_lentScreens addObject:screen];
|
|
643
|
+
__weak ANNBottomTabsController *weakSelf = self;
|
|
644
|
+
__weak ANNComponentViewController *weakScreen = screen;
|
|
645
|
+
[content whenMounted:^{
|
|
646
|
+
[weakSelf takeBack:weakScreen];
|
|
647
|
+
}];
|
|
648
|
+
// A root that never mounts goes back anyway: it renders where its tab shows.
|
|
649
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(ANNTabMountLimit * 2 * NSEC_PER_SEC)),
|
|
650
|
+
dispatch_get_main_queue(), ^{
|
|
651
|
+
[weakSelf takeBack:weakScreen];
|
|
652
|
+
});
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
- (void)takeBack:(ANNComponentViewController *)screen {
|
|
656
|
+
if (screen) {
|
|
657
|
+
[screen takeContentBack];
|
|
658
|
+
[_lentScreens removeObject:screen];
|
|
659
|
+
}
|
|
660
|
+
for (ANNComponentViewController *lent in _lentScreens.allObjects) {
|
|
661
|
+
if (lent.contentIsLent) {
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
[self closePreloadWindow];
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
- (void)closePreloadWindow {
|
|
669
|
+
for (ANNComponentViewController *screen in _lentScreens.allObjects) {
|
|
670
|
+
[screen takeContentBack];
|
|
671
|
+
}
|
|
672
|
+
[_lentScreens removeAllObjects];
|
|
673
|
+
[_preloadWindow close];
|
|
674
|
+
_preloadWindow = nil;
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
// `afterInitialTab`: the selected tab's shown screens ready (by their content), then the others one by one.
|
|
678
|
+
- (void)startChainWhenSelectedTabIsReady {
|
|
679
|
+
NSHashTable<ANNComponentViewController *> *waited = [NSHashTable weakObjectsHashTable];
|
|
680
|
+
for (UIViewController *node in [self selectedTabNode].shownComponentViewControllers) {
|
|
681
|
+
if ([node isKindOfClass:ANNComponentViewController.class]) {
|
|
682
|
+
ANNComponentViewController *screen = (ANNComponentViewController *)node;
|
|
683
|
+
if (screen.reactView && !screen.reactView.isReady) {
|
|
684
|
+
[waited addObject:screen];
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
if (waited.count == 0) {
|
|
689
|
+
[self scheduleChain];
|
|
690
|
+
return;
|
|
691
|
+
}
|
|
692
|
+
__weak ANNBottomTabsController *weakSelf = self;
|
|
693
|
+
__weak NSHashTable<ANNComponentViewController *> *weakWaited = waited;
|
|
694
|
+
for (ANNComponentViewController *screen in waited.allObjects) {
|
|
695
|
+
__weak ANNComponentViewController *weakScreen = screen;
|
|
696
|
+
[screen
|
|
697
|
+
setReadyHandler:^{
|
|
698
|
+
ANNBottomTabsController *tabs = weakSelf;
|
|
699
|
+
for (ANNComponentViewController *other in weakWaited.allObjects) {
|
|
700
|
+
if (other.reactView && !other.reactView.isReady && other != weakScreen) {
|
|
701
|
+
return;
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
[tabs scheduleChain];
|
|
705
|
+
}
|
|
706
|
+
forKey:ANNTabsReadyKey];
|
|
707
|
+
}
|
|
708
|
+
// The table lives as long as the tabs wait: the handlers keep it weakly.
|
|
709
|
+
_chainWaited = waited;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
- (void)scheduleChain {
|
|
713
|
+
if (_attachMode != ANNTabsAttachModeAfterInitialTab || _chainStarted ||
|
|
714
|
+
self.nodeHelper.destroyed) {
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
717
|
+
_chainStarted = YES;
|
|
718
|
+
NSUInteger number = _chainNumber;
|
|
719
|
+
__weak ANNBottomTabsController *weakSelf = self;
|
|
720
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
721
|
+
[weakSelf chainStepOfNumber:number];
|
|
722
|
+
});
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
// One tab per main-queue step, in layout order; a tab chosen earlier rendered in place already and is skipped; each
|
|
726
|
+
// step ends at its root's mount or at the limit, so one tab that never mounts stops nothing.
|
|
727
|
+
- (void)chainStepOfNumber:(NSUInteger)number {
|
|
728
|
+
if (number != _chainNumber || self.nodeHelper.destroyed) {
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
NSUInteger next = NSNotFound;
|
|
732
|
+
for (NSUInteger index = 0; index < _tabs.count; index++) {
|
|
733
|
+
if (![_renderedTabs containsObject:_tabs[index]]) {
|
|
734
|
+
next = index;
|
|
735
|
+
break;
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
if (next == NSNotFound) {
|
|
739
|
+
return;
|
|
740
|
+
}
|
|
741
|
+
[self renderTabAtIndex:next preloading:YES];
|
|
742
|
+
__block BOOL stepped = NO;
|
|
743
|
+
__weak ANNBottomTabsController *weakSelf = self;
|
|
744
|
+
dispatch_block_t step = ^{
|
|
745
|
+
if (stepped) {
|
|
746
|
+
return;
|
|
747
|
+
}
|
|
748
|
+
stepped = YES;
|
|
749
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
750
|
+
[weakSelf chainStepOfNumber:number];
|
|
751
|
+
});
|
|
752
|
+
};
|
|
753
|
+
UIViewController *screen = [self screenOfTabAtIndex:next];
|
|
754
|
+
UIView<ANNComponentProtocol> *content = [screen isKindOfClass:ANNComponentViewController.class]
|
|
755
|
+
? ((ANNComponentViewController *)screen).reactView
|
|
756
|
+
: nil;
|
|
757
|
+
if ([content respondsToSelector:@selector(whenMounted:)] && !content.hasMounted) {
|
|
758
|
+
[content whenMounted:step];
|
|
759
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(ANNTabMountLimit * NSEC_PER_SEC)),
|
|
760
|
+
dispatch_get_main_queue(), step);
|
|
761
|
+
return;
|
|
762
|
+
}
|
|
763
|
+
step();
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
// A tab about to show: made (`onSwitchToTab`, a tab the chain didn't reach), and repainted when a repaint left it.
|
|
767
|
+
- (void)prepareToShowTabAtIndex:(NSUInteger)index {
|
|
768
|
+
if (index >= _tabs.count) {
|
|
769
|
+
return;
|
|
770
|
+
}
|
|
771
|
+
[self renderTabAtIndex:index preloading:NO];
|
|
772
|
+
UIViewController *tab = _tabs[index];
|
|
773
|
+
if ([_staleTabs containsObject:tab]) {
|
|
774
|
+
[_staleTabs removeObject:tab];
|
|
775
|
+
[ANNBottomTabsPresenter repaintNode:tab];
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
#pragma mark - The repaint
|
|
780
|
+
|
|
781
|
+
/// The repaint passed over the tabs not in a window: they repaint at their next selection.
|
|
782
|
+
- (void)markUnshownTabsStale {
|
|
783
|
+
for (NSUInteger index = 0; index < _tabs.count; index++) {
|
|
784
|
+
UIViewController *tab = _tabs[index];
|
|
785
|
+
if (index != _selectedTabIndex && !tab.viewIfLoaded.window) {
|
|
786
|
+
[_staleTabs addObject:tab];
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
#pragma mark - UIKit's selection
|
|
792
|
+
|
|
793
|
+
- (void)selectInUIKit:(NSUInteger)index {
|
|
794
|
+
if (index >= _tabs.count) {
|
|
795
|
+
return;
|
|
796
|
+
}
|
|
797
|
+
_selectingFromCode = YES;
|
|
798
|
+
@try {
|
|
799
|
+
// With More, UIKit's `selectedTab` goes stale after a pick from the list, and setting the stale one again does
|
|
800
|
+
// nothing; `selectedIndex` stays right.
|
|
801
|
+
if (@available(iOS 18.0, *)) {
|
|
802
|
+
if (_usesTabAPI && _tabs.count <= 5) {
|
|
803
|
+
self.selectedTab = _uiTabs[index];
|
|
804
|
+
return;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
self.selectedIndex = index;
|
|
808
|
+
} @finally {
|
|
809
|
+
_selectingFromCode = NO;
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
#pragma mark - Presses
|
|
814
|
+
|
|
815
|
+
- (BOOL)pressTabAtIndex:(NSUInteger)index source:(ANNTabPressSource)source {
|
|
816
|
+
ANNAssertMainQueue();
|
|
817
|
+
if (index >= _tabs.count || self.nodeHelper.destroyed) {
|
|
818
|
+
return NO;
|
|
819
|
+
}
|
|
820
|
+
[self sendPendingSelected];
|
|
821
|
+
_pressedIndex = NSNotFound;
|
|
822
|
+
// The release of a long press: UIKit would select the tab under the finger.
|
|
823
|
+
if (source == ANNTabPressSourceBar && index == _longPressedIndex) {
|
|
824
|
+
return NO;
|
|
825
|
+
}
|
|
826
|
+
BOOL wasSelected = index == _selectedTabIndex;
|
|
827
|
+
ANNBottomTabOptions *bottomTab = [_tabs[index] resolveOptionsWithDefault].bottomTab;
|
|
828
|
+
[self sendPressedOfTabAtIndex:index wasSelected:wasSelected];
|
|
829
|
+
// The button tab: only the event; the row's highlight stays.
|
|
830
|
+
if (![bottomTab.selectTabOnPress withDefault:YES]) {
|
|
831
|
+
return NO;
|
|
832
|
+
}
|
|
833
|
+
if (wasSelected) {
|
|
834
|
+
return [self repeatPressOfTabAtIndex:index source:source options:bottomTab];
|
|
835
|
+
}
|
|
836
|
+
NSUInteger previous = _selectedTabIndex;
|
|
837
|
+
[self prepareToShowTabAtIndex:index];
|
|
838
|
+
self.selectedTabIndex = index;
|
|
839
|
+
[[self tabsPresenter] selectedTabChanged];
|
|
840
|
+
// The switch's appearances go through the dispatcher in the order of a transition; `Selected` and the left tab's
|
|
841
|
+
// `popToRootOnBlur` after them. Where the tabs can't drive it, UIKit's did-select finishes the press.
|
|
842
|
+
if (![self beginSwitchFrom:previous to:index sendsSelected:YES]) {
|
|
843
|
+
_pressedIndex = index;
|
|
844
|
+
_pressedPrevious = previous;
|
|
845
|
+
}
|
|
846
|
+
// A modal's hold follows the screen it shows now.
|
|
847
|
+
[ANNShownScreens changedIn:self];
|
|
848
|
+
if (source == ANNTabPressSourceRow) {
|
|
849
|
+
[self selectInUIKit:index];
|
|
850
|
+
[self finishPress];
|
|
851
|
+
return NO;
|
|
852
|
+
}
|
|
853
|
+
return YES;
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
// The repeat press: a stack deeper than its first screen goes back to it — UIKit pops it for the system's sources (the
|
|
857
|
+
// hold of the screen on top applies), the core for a row's cell —, else the screen scrolls to its top.
|
|
858
|
+
// `popToRootOnPress: false`: nothing but the event.
|
|
859
|
+
- (BOOL)repeatPressOfTabAtIndex:(NSUInteger)index
|
|
860
|
+
source:(ANNTabPressSource)source
|
|
861
|
+
options:(ANNBottomTabOptions *)bottomTab {
|
|
862
|
+
if (![bottomTab.popToRootOnPress withDefault:YES]) {
|
|
863
|
+
return NO;
|
|
864
|
+
}
|
|
865
|
+
UIViewController *tab = _tabs[index];
|
|
866
|
+
if ([tab isKindOfClass:ANNStackController.class] &&
|
|
867
|
+
((ANNStackController *)tab).queue.entries.count >= 2) {
|
|
868
|
+
if (source == ANNTabPressSourceBar && ANNUIKitPopsOnRepeatPress) {
|
|
869
|
+
return YES;
|
|
870
|
+
}
|
|
871
|
+
[(ANNStackController *)tab userPopToRoot];
|
|
872
|
+
return NO;
|
|
873
|
+
}
|
|
874
|
+
UIViewController *screen = [self screenOfTabAtIndex:index];
|
|
875
|
+
UINavigationController *navigation = [tab isKindOfClass:ANNStackController.class]
|
|
876
|
+
? ((ANNStackController *)tab).shownNavigationController
|
|
877
|
+
: nil;
|
|
878
|
+
UINavigationBar *bar = navigation.navigationBarHidden ? nil : navigation.navigationBar;
|
|
879
|
+
BOOL largeTitle = screen && ANNLargeTitleCanShow([screen resolveOptionsWithDefault]);
|
|
880
|
+
[ANNScrollToTop scrollToTopIn:screen.viewIfLoaded navigationBar:bar largeTitleShows:largeTitle];
|
|
881
|
+
return NO;
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
// UIKit selected the pressed tab: `ANN.BottomTabSelected` goes after its screen appeared.
|
|
885
|
+
- (void)finishPress {
|
|
886
|
+
if (_pressedIndex == NSNotFound) {
|
|
887
|
+
return;
|
|
888
|
+
}
|
|
889
|
+
NSUInteger index = _pressedIndex;
|
|
890
|
+
NSUInteger previous = _pressedPrevious;
|
|
891
|
+
_pressedIndex = NSNotFound;
|
|
892
|
+
[self scheduleSelectedOfTabAtIndex:index previous:previous];
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
- (void)sendPressedOfTabAtIndex:(NSUInteger)index wasSelected:(BOOL)wasSelected {
|
|
896
|
+
NSString *tabsId = self.layoutInfo.componentId ?: @"";
|
|
897
|
+
NSString *screenId = [self screenOfTabAtIndex:index].layoutInfo.componentId;
|
|
898
|
+
[self.eventEmitter sendBottomTabPressed:index
|
|
899
|
+
bottomTabsId:tabsId
|
|
900
|
+
screenId:screenId
|
|
901
|
+
wasSelected:wasSelected];
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
// `ANN.BottomTabSelected` right after the new tab's screen's `DidAppear`, in the same turn; at the end of the switch
|
|
905
|
+
// when no appearance is pending; before the first event of a later press or choice from code; dropped only with the
|
|
906
|
+
// tabs.
|
|
907
|
+
- (void)scheduleSelectedOfTabAtIndex:(NSUInteger)index previous:(NSUInteger)previous {
|
|
908
|
+
[self scheduleSelectedOfTabAtIndex:index previous:previous moreNavigation:nil];
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
// A More pick: the More navigation's transition decides, or its `didShow` without one.
|
|
912
|
+
- (void)scheduleSelectedOfTabAtIndex:(NSUInteger)index
|
|
913
|
+
previous:(NSUInteger)previous
|
|
914
|
+
moreNavigation:(UINavigationController *)moreNavigation {
|
|
915
|
+
_hasPendingSelected = YES;
|
|
916
|
+
_pendingSelectedIndex = index;
|
|
917
|
+
_pendingSelectedPrevious = previous;
|
|
918
|
+
NSUInteger number = ++_pendingSelectedNumber;
|
|
919
|
+
__weak ANNBottomTabsController *weakSelf = self;
|
|
920
|
+
dispatch_block_t send = ^{
|
|
921
|
+
[weakSelf sendSelectedOfNumber:number];
|
|
922
|
+
};
|
|
923
|
+
UIViewController *screen = [self screenOfTabAtIndex:index];
|
|
924
|
+
ANNScreenAppearance *appearance = ((ANNComponentViewController *)screen).appearance;
|
|
925
|
+
if (appearance && appearance.phase != ANNAppearancePhaseHidden) {
|
|
926
|
+
[ANNAppearanceDispatcher afterDidAppearOf:appearance run:send];
|
|
927
|
+
return;
|
|
928
|
+
}
|
|
929
|
+
// UIKit may report the new screen's appearance only as its switch goes on (iOS 26): the end of the switch decides,
|
|
930
|
+
// or the next turn without a transition; at once there when nothing is pending.
|
|
931
|
+
__weak UIViewController *weakScreen = screen;
|
|
932
|
+
void (^decide)(void) = ^{
|
|
933
|
+
ANNScreenAppearance *later = ((ANNComponentViewController *)weakScreen).appearance;
|
|
934
|
+
[ANNAppearanceDispatcher afterDidAppearOf:later run:send];
|
|
935
|
+
};
|
|
936
|
+
id<UIViewControllerTransitionCoordinator> coordinator =
|
|
937
|
+
moreNavigation ? moreNavigation.transitionCoordinator : self.transitionCoordinator;
|
|
938
|
+
if (coordinator &&
|
|
939
|
+
[coordinator
|
|
940
|
+
animateAlongsideTransition:nil
|
|
941
|
+
completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
|
|
942
|
+
decide();
|
|
943
|
+
}]) {
|
|
944
|
+
return;
|
|
945
|
+
}
|
|
946
|
+
if (moreNavigation) {
|
|
947
|
+
_decideAtMoreDidShow = decide;
|
|
948
|
+
return;
|
|
949
|
+
}
|
|
950
|
+
dispatch_async(dispatch_get_main_queue(), decide);
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
- (void)sendSelectedOfNumber:(NSUInteger)number {
|
|
954
|
+
if (!_hasPendingSelected || number != _pendingSelectedNumber) {
|
|
955
|
+
return;
|
|
956
|
+
}
|
|
957
|
+
[self sendPendingSelected];
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
- (void)sendPendingSelected {
|
|
961
|
+
if (!_hasPendingSelected) {
|
|
962
|
+
return;
|
|
963
|
+
}
|
|
964
|
+
_hasPendingSelected = NO;
|
|
965
|
+
if (self.nodeHelper.destroyed) {
|
|
966
|
+
return;
|
|
967
|
+
}
|
|
968
|
+
NSUInteger previous = _pendingSelectedPrevious;
|
|
969
|
+
[self.eventEmitter sendBottomTabSelected:_pendingSelectedIndex
|
|
970
|
+
unselectedTabIndex:previous
|
|
971
|
+
bottomTabsId:self.layoutInfo.componentId ?: @""];
|
|
972
|
+
// The left tab's `popToRootOnBlur` after `Selected`, then the coalesced state.
|
|
973
|
+
[self popToRootOnBlurOfTabAtIndex:previous];
|
|
974
|
+
if (self.eventEmitter.isCurrent) {
|
|
975
|
+
[ANNNavigationState setNeedsUpdate];
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
- (void)longPressTabAtIndex:(NSUInteger)index marksSelection:(BOOL)marksSelection {
|
|
980
|
+
if (index >= _tabs.count || self.nodeHelper.destroyed) {
|
|
981
|
+
return;
|
|
982
|
+
}
|
|
983
|
+
// A pending `Selected` goes before the event of a later press.
|
|
984
|
+
[self sendPendingSelected];
|
|
985
|
+
if (marksSelection) {
|
|
986
|
+
_longPressedIndex = index;
|
|
987
|
+
}
|
|
988
|
+
[self.eventEmitter sendBottomTabLongPressed:index
|
|
989
|
+
bottomTabsId:self.layoutInfo.componentId ?: @""];
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
- (void)longPressEnded {
|
|
993
|
+
__weak ANNBottomTabsController *weakSelf = self;
|
|
994
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
995
|
+
ANNBottomTabsController *tabs = weakSelf;
|
|
996
|
+
if (tabs) {
|
|
997
|
+
tabs->_longPressedIndex = NSNotFound;
|
|
998
|
+
}
|
|
999
|
+
});
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
#pragma mark - The choice from code
|
|
1003
|
+
|
|
1004
|
+
// `currentTabId` (a tab or any layout in it) over `currentTabIndex`; an unknown id does nothing, an index out of range
|
|
1005
|
+
// warns; the one-shot fields come from the merge itself, never from resolved options or the defaults.
|
|
1006
|
+
- (void)chooseTabFromCode:(ANNBottomTabsOptions *)bottomTabs {
|
|
1007
|
+
if (!bottomTabs.currentTabId.hasValue && !bottomTabs.currentTabIndex.hasValue) {
|
|
1008
|
+
return;
|
|
1009
|
+
}
|
|
1010
|
+
NSUInteger index = NSNotFound;
|
|
1011
|
+
if (bottomTabs.currentTabId.hasValue) {
|
|
1012
|
+
NSString *tabId = [bottomTabs.currentTabId withDefault:nil];
|
|
1013
|
+
index = tabId.length > 0 ? [self indexOfTabWithLayoutId:tabId] : NSNotFound;
|
|
1014
|
+
if (index == NSNotFound) {
|
|
1015
|
+
return;
|
|
1016
|
+
}
|
|
1017
|
+
} else if (!ANNTabIndexOf(bottomTabs.currentTabIndex, _tabs.count, &index)) {
|
|
1018
|
+
return;
|
|
1019
|
+
}
|
|
1020
|
+
[self selectTabFromCode:index];
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
// No press events; the screens appear and disappear as on a press; the left tab's `popToRootOnBlur`; the core's index
|
|
1024
|
+
// first, then UIKit's, then the state at once.
|
|
1025
|
+
- (void)selectTabFromCode:(NSUInteger)index {
|
|
1026
|
+
ANNAssertMainQueue();
|
|
1027
|
+
[self sendPendingSelected];
|
|
1028
|
+
_pressedIndex = NSNotFound;
|
|
1029
|
+
if (index == _selectedTabIndex || index >= _tabs.count || self.nodeHelper.destroyed) {
|
|
1030
|
+
return;
|
|
1031
|
+
}
|
|
1032
|
+
NSUInteger previous = _selectedTabIndex;
|
|
1033
|
+
[self prepareToShowTabAtIndex:index];
|
|
1034
|
+
self.selectedTabIndex = index;
|
|
1035
|
+
_codeChoiceIndex = index;
|
|
1036
|
+
__weak ANNBottomTabsController *weakSelf = self;
|
|
1037
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
1038
|
+
ANNBottomTabsController *tabs = weakSelf;
|
|
1039
|
+
if (tabs && tabs->_codeChoiceIndex == index) {
|
|
1040
|
+
tabs->_codeChoiceIndex = NSNotFound;
|
|
1041
|
+
}
|
|
1042
|
+
});
|
|
1043
|
+
[[self tabsPresenter] selectedTabChanged];
|
|
1044
|
+
BOOL driven = [self beginSwitchFrom:previous to:index sendsSelected:NO];
|
|
1045
|
+
[self selectInUIKit:index];
|
|
1046
|
+
// Not driven (the tabs aren't on screen): the left tab is no longer seen, its `popToRootOnBlur` now.
|
|
1047
|
+
if (!driven) {
|
|
1048
|
+
[self popToRootOnBlurOfTabAtIndex:previous];
|
|
1049
|
+
}
|
|
1050
|
+
// A root of tabs that waits to show takes its waited screens again.
|
|
1051
|
+
[ANNShownScreens changedIn:self];
|
|
1052
|
+
[ANNNavigationState updateNow];
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
#pragma mark - The switch (the same order as a stack's transition)
|
|
1056
|
+
|
|
1057
|
+
// The tabs report the switch's appearances themselves: `WillAppear` of the new tab now, then at the end `DidDisappear`
|
|
1058
|
+
// of the old one and `DidAppear` of the new one, then the switch's own events. UIKit's callbacks of both tabs say
|
|
1059
|
+
// nothing meanwhile. Only on screen and when no command drives the tabs already (a root that waits). NO: not driven.
|
|
1060
|
+
- (BOOL)beginSwitchFrom:(NSUInteger)from to:(NSUInteger)to sendsSelected:(BOOL)sendsSelected {
|
|
1061
|
+
[self endSwitch];
|
|
1062
|
+
BOOL drivenElsewhere = [ANNAppearanceDispatcher isAppearanceDriven:self] ||
|
|
1063
|
+
[ANNPendingLayers isWaitingToShow:self];
|
|
1064
|
+
if (from >= _tabs.count || to >= _tabs.count || from == to || !self.viewIfLoaded.window ||
|
|
1065
|
+
drivenElsewhere) {
|
|
1066
|
+
return NO;
|
|
1067
|
+
}
|
|
1068
|
+
_switchActive = YES;
|
|
1069
|
+
_switchFrom = from;
|
|
1070
|
+
_switchTo = to;
|
|
1071
|
+
_switchSendsSelected = sendsSelected;
|
|
1072
|
+
NSUInteger number = ++_switchNumber;
|
|
1073
|
+
UIViewController *newTab = _tabs[to];
|
|
1074
|
+
[ANNAppearanceDispatcher driveAppearanceOf:@[ _tabs[from], newTab ]];
|
|
1075
|
+
[ANNAppearanceDispatcher beginTransitionShowing:@[ newTab ]];
|
|
1076
|
+
__weak ANNBottomTabsController *weakSelf = self;
|
|
1077
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(ANNSwitchDriveLimit * NSEC_PER_SEC)),
|
|
1078
|
+
dispatch_get_main_queue(), ^{
|
|
1079
|
+
ANNBottomTabsController *tabs = weakSelf;
|
|
1080
|
+
if (tabs && tabs->_switchActive && tabs->_switchNumber == number) {
|
|
1081
|
+
[tabs endSwitch];
|
|
1082
|
+
}
|
|
1083
|
+
});
|
|
1084
|
+
return YES;
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
// A screen of the tab a driven switch shows appeared in UIKit: the switch ends (its appearances, then its events). A
|
|
1088
|
+
// screen of another tabs node's switch, or of no switch, ends nothing here.
|
|
1089
|
+
- (void)drivenDescendantDidAppear:(UIViewController *)screen {
|
|
1090
|
+
if (_switchActive && [self indexOfTabHolding:screen] == _switchTo) {
|
|
1091
|
+
[self endSwitch];
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
- (void)endSwitch {
|
|
1096
|
+
if (!_switchActive) {
|
|
1097
|
+
return;
|
|
1098
|
+
}
|
|
1099
|
+
_switchActive = NO;
|
|
1100
|
+
NSUInteger from = _switchFrom;
|
|
1101
|
+
NSUInteger to = _switchTo;
|
|
1102
|
+
BOOL sendsSelected = _switchSendsSelected;
|
|
1103
|
+
UIViewController *oldTab = _tabs[from];
|
|
1104
|
+
UIViewController *newTab = _tabs[to];
|
|
1105
|
+
[ANNAppearanceDispatcher stopDrivingAppearanceOf:@[ oldTab, newTab ]];
|
|
1106
|
+
if (self.nodeHelper.destroyed) {
|
|
1107
|
+
return;
|
|
1108
|
+
}
|
|
1109
|
+
__weak ANNBottomTabsController *weakSelf = self;
|
|
1110
|
+
[ANNAppearanceDispatcher endSwitchHiding:@[ oldTab ]
|
|
1111
|
+
showing:@[ newTab ]
|
|
1112
|
+
events:^{
|
|
1113
|
+
ANNBottomTabsController *tabs = weakSelf;
|
|
1114
|
+
// Every stack of the old tab: what waits for its screen runs now.
|
|
1115
|
+
NSMutableArray<ANNStackController *> *stacks = [NSMutableArray new];
|
|
1116
|
+
ANNStacksOfNode(oldTab, stacks);
|
|
1117
|
+
for (ANNStackController *stack in stacks) {
|
|
1118
|
+
[stack stackDidLeaveScreen];
|
|
1119
|
+
}
|
|
1120
|
+
if (sendsSelected) {
|
|
1121
|
+
[tabs scheduleSelectedOfTabAtIndex:to previous:from];
|
|
1122
|
+
} else {
|
|
1123
|
+
[tabs popToRootOnBlurOfTabAtIndex:from];
|
|
1124
|
+
}
|
|
1125
|
+
}];
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
#pragma mark - Leaving a tab
|
|
1129
|
+
|
|
1130
|
+
// When the tab is no longer selected and its stack disappeared (or its screens are in the More navigation): its stack
|
|
1131
|
+
// goes back to its first screen without animation and without appearance events.
|
|
1132
|
+
- (void)popToRootOnBlurOfTabAtIndex:(NSUInteger)index {
|
|
1133
|
+
if (index >= _tabs.count || index == _selectedTabIndex || self.nodeHelper.destroyed) {
|
|
1134
|
+
return;
|
|
1135
|
+
}
|
|
1136
|
+
UIViewController *tab = _tabs[index];
|
|
1137
|
+
if (![tab isKindOfClass:ANNStackController.class]) {
|
|
1138
|
+
return;
|
|
1139
|
+
}
|
|
1140
|
+
ANNStackController *stack = (ANNStackController *)tab;
|
|
1141
|
+
BOOL inMore = stack.shownNavigationController != stack;
|
|
1142
|
+
if (!inMore && stack.viewIfLoaded.window) {
|
|
1143
|
+
return;
|
|
1144
|
+
}
|
|
1145
|
+
if (![[tab resolveOptionsWithDefault].bottomTab.popToRootOnBlur withDefault:NO]) {
|
|
1146
|
+
return;
|
|
1147
|
+
}
|
|
1148
|
+
[stack popToRootSilently];
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
#pragma mark - UITabBarControllerDelegate
|
|
1152
|
+
|
|
1153
|
+
// iOS 18 and later: a user's selection (the bar, the iPad's top bar, the sidebar) runs the press path; a choice from
|
|
1154
|
+
// code passes.
|
|
1155
|
+
- (BOOL)tabBarController:(UITabBarController *)tabBarController
|
|
1156
|
+
shouldSelectTab:(UITab *)tab API_AVAILABLE(ios(18.0)) {
|
|
1157
|
+
if (_selectingFromCode) {
|
|
1158
|
+
return YES;
|
|
1159
|
+
}
|
|
1160
|
+
NSUInteger index = [_uiTabs indexOfObjectIdenticalTo:tab];
|
|
1161
|
+
if (index == NSNotFound) {
|
|
1162
|
+
return YES;
|
|
1163
|
+
}
|
|
1164
|
+
return [self pressTabAtIndex:index source:ANNTabPressSourceBar];
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
// Only a press recorded in should-select sends `ANN.BottomTabSelected`: the initial selection, a choice from code and a
|
|
1168
|
+
// repeat press send nothing; the indexes are the core's.
|
|
1169
|
+
- (void)tabBarController:(UITabBarController *)tabBarController
|
|
1170
|
+
didSelectTab:(UITab *)selectedTab
|
|
1171
|
+
previousTab:(UITab *)previousTab API_AVAILABLE(ios(18.0)) {
|
|
1172
|
+
[self finishPress];
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
// iOS 15–17 (with the tab API UIKit calls these too and they do nothing). More's own container is UIKit's: its tap
|
|
1176
|
+
// sends nothing.
|
|
1177
|
+
- (BOOL)tabBarController:(UITabBarController *)tabBarController
|
|
1178
|
+
shouldSelectViewController:(UIViewController *)viewController {
|
|
1179
|
+
if (_usesTabAPI || _selectingFromCode) {
|
|
1180
|
+
return YES;
|
|
1181
|
+
}
|
|
1182
|
+
if (viewController == self.moreNavigationController) {
|
|
1183
|
+
return YES;
|
|
1184
|
+
}
|
|
1185
|
+
NSUInteger index = [self indexOfTab:viewController];
|
|
1186
|
+
if (index == NSNotFound) {
|
|
1187
|
+
return YES;
|
|
1188
|
+
}
|
|
1189
|
+
return [self pressTabAtIndex:index source:ANNTabPressSourceBar];
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
- (void)tabBarController:(UITabBarController *)tabBarController
|
|
1193
|
+
didSelectViewController:(UIViewController *)viewController {
|
|
1194
|
+
if (_usesTabAPI) {
|
|
1195
|
+
return;
|
|
1196
|
+
}
|
|
1197
|
+
[self finishPress];
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
#pragma mark - More
|
|
1201
|
+
|
|
1202
|
+
// The More navigation is about to show a screen: the More list (nothing), a screen of tab T just pushed over the list
|
|
1203
|
+
// (a pick: `Pressed`, then the selection and `Selected`), the same top shown again by the More tap (a
|
|
1204
|
+
// re-show: only `Selected`), a deeper screen (the stack's own). A choice from code of T sends nothing.
|
|
1205
|
+
- (void)moreNavigation:(UINavigationController *)moreNavigation
|
|
1206
|
+
willShowViewController:(UIViewController *)viewController {
|
|
1207
|
+
if (self.nodeHelper.destroyed) {
|
|
1208
|
+
return;
|
|
1209
|
+
}
|
|
1210
|
+
if (!viewController.isLayoutNode) {
|
|
1211
|
+
[self moreNavigationShowsList:moreNavigation];
|
|
1212
|
+
return;
|
|
1213
|
+
}
|
|
1214
|
+
NSUInteger index = [self indexOfTabHolding:viewController];
|
|
1215
|
+
if (index == NSNotFound) {
|
|
1216
|
+
return;
|
|
1217
|
+
}
|
|
1218
|
+
UIViewController *tab = _tabs[index];
|
|
1219
|
+
if ([tab isKindOfClass:ANNStackController.class]) {
|
|
1220
|
+
_moreStack = (ANNStackController *)tab;
|
|
1221
|
+
[(ANNStackController *)tab moreNavigationWillShow:moreNavigation];
|
|
1222
|
+
}
|
|
1223
|
+
if (_codeChoiceIndex == index) {
|
|
1224
|
+
return;
|
|
1225
|
+
}
|
|
1226
|
+
UIViewController *shownTop = _moreShownTop;
|
|
1227
|
+
BOOL reshow = viewController == shownTop;
|
|
1228
|
+
// UIKit opens a tab from the list with its first screen, or with the screens it kept above it: any screen of T
|
|
1229
|
+
// after a top that wasn't T's is the pick.
|
|
1230
|
+
BOOL pick = !reshow && (!shownTop || [self indexOfTabHolding:shownTop] != index);
|
|
1231
|
+
if (!reshow && !pick) {
|
|
1232
|
+
return;
|
|
1233
|
+
}
|
|
1234
|
+
// A pick in the More list of the tab that is current already (the user went back to the list from it): nothing.
|
|
1235
|
+
if (pick && index == _selectedTabIndex) {
|
|
1236
|
+
return;
|
|
1237
|
+
}
|
|
1238
|
+
[self sendPendingSelected];
|
|
1239
|
+
_pressedIndex = NSNotFound;
|
|
1240
|
+
if (pick) {
|
|
1241
|
+
[self sendPressedOfTabAtIndex:index wasSelected:NO];
|
|
1242
|
+
}
|
|
1243
|
+
if (index == _selectedTabIndex) {
|
|
1244
|
+
return;
|
|
1245
|
+
}
|
|
1246
|
+
NSUInteger previous = _selectedTabIndex;
|
|
1247
|
+
[self prepareToShowTabAtIndex:index];
|
|
1248
|
+
self.selectedTabIndex = index;
|
|
1249
|
+
[[self tabsPresenter] selectedTabChanged];
|
|
1250
|
+
[ANNShownScreens changedIn:self];
|
|
1251
|
+
// `Selected` after the picked screen's `DidAppear`; the left tab's `popToRootOnBlur` after it.
|
|
1252
|
+
[self scheduleSelectedOfTabAtIndex:index previous:previous moreNavigation:moreNavigation];
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
// The More list shows again: its bar is UIKit's own, not the shared bar of the stack that showed last (the stack sets
|
|
1256
|
+
// its parts anew when its screens show there again).
|
|
1257
|
+
- (void)moreNavigationShowsList:(UINavigationController *)moreNavigation {
|
|
1258
|
+
[_moreStack forgetSharedBar];
|
|
1259
|
+
_moreStack = nil;
|
|
1260
|
+
// The More navigation's swipes are UIKit's again: a tab that isn't a stack goes back to the list with them.
|
|
1261
|
+
[InteractivePopGestureDelegate
|
|
1262
|
+
restoreSystemDelegateOf:moreNavigation.interactivePopGestureRecognizer];
|
|
1263
|
+
if (@available(iOS 26.0, *)) {
|
|
1264
|
+
[InteractivePopGestureDelegate
|
|
1265
|
+
restoreSystemDelegateOf:moreNavigation.interactiveContentPopGestureRecognizer];
|
|
1266
|
+
}
|
|
1267
|
+
UINavigationBar *bar = moreNavigation.navigationBar;
|
|
1268
|
+
if (moreNavigation.navigationBarHidden) {
|
|
1269
|
+
[moreNavigation setNavigationBarHidden:NO animated:YES];
|
|
1270
|
+
}
|
|
1271
|
+
if (!moreNavigation.toolbarHidden) {
|
|
1272
|
+
[moreNavigation setToolbarHidden:YES animated:YES];
|
|
1273
|
+
}
|
|
1274
|
+
moreNavigation.hidesBarsOnSwipe = NO;
|
|
1275
|
+
moreNavigation.hidesBarsOnTap = NO;
|
|
1276
|
+
moreNavigation.hidesBarsWhenKeyboardAppears = NO;
|
|
1277
|
+
bar.barStyle = UIBarStyleDefault;
|
|
1278
|
+
bar.clipsToBounds = NO;
|
|
1279
|
+
bar.accessibilityIdentifier = nil;
|
|
1280
|
+
if (_moreListAppearance && ![bar.standardAppearance isEqual:_moreListAppearance]) {
|
|
1281
|
+
bar.standardAppearance = [_moreListAppearance copy];
|
|
1282
|
+
}
|
|
1283
|
+
[ANNBarBackgroundComponent show:nil inBar:bar coordinator:moreNavigation.transitionCoordinator];
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
- (void)moreNavigation:(UINavigationController *)moreNavigation
|
|
1287
|
+
didShowViewController:(UIViewController *)viewController {
|
|
1288
|
+
_moreShownTop = viewController;
|
|
1289
|
+
dispatch_block_t decide = _decideAtMoreDidShow;
|
|
1290
|
+
_decideAtMoreDidShow = nil;
|
|
1291
|
+
if (decide) {
|
|
1292
|
+
decide();
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
#pragma mark - The bar
|
|
1297
|
+
|
|
1298
|
+
- (BOOL)barHidden {
|
|
1299
|
+
if (@available(iOS 18.0, *)) {
|
|
1300
|
+
return self.isTabBarHidden;
|
|
1301
|
+
}
|
|
1302
|
+
return _hiddenBeforeTabAPI;
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
- (BOOL)showsTabBarForScreen:(UIViewController *)screen {
|
|
1306
|
+
ANNBottomTabsPresenter *presenter = [self tabsPresenter];
|
|
1307
|
+
if (_usesCustomRow && presenter.customRowShown) {
|
|
1308
|
+
return YES;
|
|
1309
|
+
}
|
|
1310
|
+
if ([self barIsOnTopOrInSidebar]) {
|
|
1311
|
+
return NO;
|
|
1312
|
+
}
|
|
1313
|
+
return !self.barHidden && !self.tabBar.hidden;
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
// iPad and Mac with iOS 18 and later in a regular width: the bar is on top (or the sidebar shows), the bottom keeps
|
|
1317
|
+
// nothing.
|
|
1318
|
+
- (BOOL)barIsOnTopOrInSidebar {
|
|
1319
|
+
return [ANNTabsDesign barIsOnTopIn:self.traitCollection];
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
- (void)screenWillAppear:(UIViewController *)screen
|
|
1323
|
+
options:(ANNNavigationOptions *)resolvedOptions {
|
|
1324
|
+
if (self.nodeHelper.destroyed || [self indexOfTabHolding:screen] != _selectedTabIndex) {
|
|
1325
|
+
return;
|
|
1326
|
+
}
|
|
1327
|
+
ANNBottomTabsPresenter *presenter = [self tabsPresenter];
|
|
1328
|
+
[presenter applyBarLook:resolvedOptions];
|
|
1329
|
+
[presenter applyBackground:[self resolveOptionsWithDefault]];
|
|
1330
|
+
BOOL hidden = ![resolvedOptions.bottomTabs.visible withDefault:YES];
|
|
1331
|
+
BOOL animated = [resolvedOptions.bottomTabs.animate withDefault:YES];
|
|
1332
|
+
if (@available(iOS 18.0, *)) {
|
|
1333
|
+
[self setBarHidden:hidden animated:animated];
|
|
1334
|
+
return;
|
|
1335
|
+
}
|
|
1336
|
+
// Before iOS 18 UIKit leads during a push or pop; the explicit setting applies when not applied yet or for a
|
|
1337
|
+
// screen out of a stack.
|
|
1338
|
+
if (!_visibilityApplied || !screen.stack) {
|
|
1339
|
+
[self setBarHidden:hidden animated:_visibilityApplied && animated];
|
|
1340
|
+
_visibilityApplied = YES;
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
- (void)setBarHidden:(BOOL)hidden animated:(BOOL)animated {
|
|
1345
|
+
ANNBottomTabsPresenter *presenter = [self tabsPresenter];
|
|
1346
|
+
// With the custom row on a wide iPad the system bar stays hidden and the row keeps the visibility.
|
|
1347
|
+
if ([presenter customRowKeepsVisibility]) {
|
|
1348
|
+
[presenter setCustomRowHidden:hidden];
|
|
1349
|
+
[self updateRootLayoutOfShownScreens];
|
|
1350
|
+
return;
|
|
1351
|
+
}
|
|
1352
|
+
if (hidden == self.barHidden) {
|
|
1353
|
+
return;
|
|
1354
|
+
}
|
|
1355
|
+
BOOL inWindow = self.viewIfLoaded.window != nil;
|
|
1356
|
+
if (@available(iOS 18.0, *)) {
|
|
1357
|
+
[self setTabBarHidden:hidden animated:animated && inWindow];
|
|
1358
|
+
} else {
|
|
1359
|
+
[self slideBarHidden:hidden animated:animated && inWindow];
|
|
1360
|
+
}
|
|
1361
|
+
[presenter barVisibilityChanged];
|
|
1362
|
+
[self updateRootLayoutOfShownScreens];
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
// Before iOS 18: the bar slides by its height below the tabs' view and back, 0.15 s ease-out; hidden it is `hidden`.
|
|
1366
|
+
- (void)slideBarHidden:(BOOL)hidden animated:(BOOL)animated {
|
|
1367
|
+
_hiddenBeforeTabAPI = hidden;
|
|
1368
|
+
UITabBar *bar = self.tabBar;
|
|
1369
|
+
CGAffineTransform below = CGAffineTransformMakeTranslation(0, bar.bounds.size.height + 1);
|
|
1370
|
+
if (!animated) {
|
|
1371
|
+
bar.transform = CGAffineTransformIdentity;
|
|
1372
|
+
bar.hidden = hidden;
|
|
1373
|
+
return;
|
|
1374
|
+
}
|
|
1375
|
+
if (!hidden) {
|
|
1376
|
+
bar.hidden = NO;
|
|
1377
|
+
bar.transform = below;
|
|
1378
|
+
}
|
|
1379
|
+
__weak ANNBottomTabsController *weakSelf = self;
|
|
1380
|
+
[UIView animateWithDuration:0.15
|
|
1381
|
+
delay:0
|
|
1382
|
+
options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
|
|
1383
|
+
animations:^{
|
|
1384
|
+
bar.transform = hidden ? below : CGAffineTransformIdentity;
|
|
1385
|
+
}
|
|
1386
|
+
completion:^(BOOL finished) {
|
|
1387
|
+
ANNBottomTabsController *tabs = weakSelf;
|
|
1388
|
+
if (tabs && tabs->_hiddenBeforeTabAPI == hidden) {
|
|
1389
|
+
bar.hidden = hidden;
|
|
1390
|
+
bar.transform = CGAffineTransformIdentity;
|
|
1391
|
+
}
|
|
1392
|
+
}];
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
// The shown screens of the selected tab apply the "under the tab bar" rule again.
|
|
1396
|
+
- (void)updateRootLayoutOfShownScreens {
|
|
1397
|
+
for (UIViewController *screen in [self selectedTabNode].shownComponentViewControllers) {
|
|
1398
|
+
if ([screen isKindOfClass:ANNComponentViewController.class]) {
|
|
1399
|
+
[(ANNComponentViewController *)screen updateRootLayout];
|
|
1400
|
+
}
|
|
1401
|
+
}
|
|
1402
|
+
}
|
|
1403
|
+
|
|
1404
|
+
@end
|