@apexnative/navigation 0.0.0-stage → 1.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ApexNavigation.podspec +42 -0
- package/LICENSE +21 -0
- package/README.md +76 -2
- package/android/CLAUDE.md +183 -0
- package/android/CORE.md +219 -0
- package/android/MATERIAL_SYMBOLS_LICENSE.txt +205 -0
- package/android/RECIPES.md +39 -0
- package/android/build.gradle +108 -0
- package/android/consumer-rules.pro +2 -0
- package/android/src/main/AndroidManifest.xml +9 -0
- package/android/src/main/java/dev/apexnative/navigation/EdgeToEdgeDecision.kt +25 -0
- package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +339 -0
- package/android/src/main/java/dev/apexnative/navigation/NavigationApplication.kt +90 -0
- package/android/src/main/java/dev/apexnative/navigation/NavigationPackage.kt +37 -0
- package/android/src/main/java/dev/apexnative/navigation/customrow/BottomTabsCustomRowOptions.kt +85 -0
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutChecks.kt +51 -0
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutException.kt +7 -0
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutNode.kt +118 -0
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutReader.kt +274 -0
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutType.kt +35 -0
- package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenCalls.kt +61 -0
- package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenContext.kt +84 -0
- package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenCreator.kt +17 -0
- package/android/src/main/java/dev/apexnative/navigation/options/AnimationsOptions.kt +54 -0
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabOptions.kt +238 -0
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabsOptions.kt +244 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +70 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +296 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ComponentOptions.kt +141 -0
- package/android/src/main/java/dev/apexnative/navigation/options/DefaultOptions.kt +21 -0
- package/android/src/main/java/dev/apexnative/navigation/options/FabOptions.kt +97 -0
- package/android/src/main/java/dev/apexnative/navigation/options/FontOptions.kt +47 -0
- package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +49 -0
- package/android/src/main/java/dev/apexnative/navigation/options/InterpolationOptions.kt +203 -0
- package/android/src/main/java/dev/apexnative/navigation/options/KeyCommandOptions.kt +49 -0
- package/android/src/main/java/dev/apexnative/navigation/options/LargeTitleOptions.kt +78 -0
- package/android/src/main/java/dev/apexnative/navigation/options/LayoutAnimation.kt +157 -0
- package/android/src/main/java/dev/apexnative/navigation/options/LayoutOptions.kt +94 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ModalOptions.kt +87 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ModalPlacementOptions.kt +90 -0
- package/android/src/main/java/dev/apexnative/navigation/options/NavigationBarOptions.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/options/Options.kt +167 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +21 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionsReader.kt +133 -0
- package/android/src/main/java/dev/apexnative/navigation/options/PreviewOptions.kt +97 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ReadableMaps.kt +70 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ScrollEdgeEffectOptions.kt +98 -0
- package/android/src/main/java/dev/apexnative/navigation/options/SearchBarOptions.kt +151 -0
- package/android/src/main/java/dev/apexnative/navigation/options/SharedElementTransitionOptions.kt +57 -0
- package/android/src/main/java/dev/apexnative/navigation/options/SheetOptions.kt +108 -0
- package/android/src/main/java/dev/apexnative/navigation/options/SideMenuOptions.kt +130 -0
- package/android/src/main/java/dev/apexnative/navigation/options/SplitViewGroupOptions.kt +190 -0
- package/android/src/main/java/dev/apexnative/navigation/options/SplitViewOptions.kt +28 -0
- package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +270 -0
- package/android/src/main/java/dev/apexnative/navigation/options/StatusBarOptions.kt +75 -0
- package/android/src/main/java/dev/apexnative/navigation/options/TitleOptions.kt +167 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ToolbarOptions.kt +60 -0
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarAppearanceOptions.kt +223 -0
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarOptions.kt +381 -0
- package/android/src/main/java/dev/apexnative/navigation/options/ViewAnimationOptions.kt +225 -0
- package/android/src/main/java/dev/apexnative/navigation/options/WindowOptions.kt +36 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/Bool.kt +23 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/Fraction.kt +12 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/LayoutDirection.kt +26 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/Param.kt +24 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/Text.kt +24 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/ThemeColour.kt +259 -0
- package/android/src/main/java/dev/apexnative/navigation/options/params/Variant.kt +36 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/BoolParser.kt +15 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/FontParser.kt +28 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/FractionParser.kt +24 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/IconParser.kt +48 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/StringListParser.kt +27 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/TextParser.kt +32 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/TypefaceLoader.kt +42 -0
- package/android/src/main/java/dev/apexnative/navigation/options/parsers/VariantParser.kt +34 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +41 -0
- package/android/src/main/java/dev/apexnative/navigation/react/CommandAnswer.kt +111 -0
- package/android/src/main/java/dev/apexnative/navigation/react/CommandListener.kt +27 -0
- package/android/src/main/java/dev/apexnative/navigation/react/CommandRunner.kt +131 -0
- package/android/src/main/java/dev/apexnative/navigation/react/DeveloperReload.kt +69 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ErrorTexts.kt +123 -0
- package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +154 -0
- package/android/src/main/java/dev/apexnative/navigation/react/LaunchLink.kt +37 -0
- package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +311 -0
- package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +89 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReactGateway.kt +67 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +197 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReadableJson.kt +60 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +130 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +69 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +87 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ScrollEvents.kt +160 -0
- package/android/src/main/java/dev/apexnative/navigation/react/StartInfo.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +507 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/ComponentType.kt +13 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +199 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +62 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/ScreenAppearance.kt +87 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +62 -0
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaReadyEvent.kt +16 -0
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +140 -0
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaViewManager.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotHost.kt +91 -0
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +158 -0
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +141 -0
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotViewManager.kt +50 -0
- package/android/src/main/java/dev/apexnative/navigation/splash/SplashHold.kt +67 -0
- package/android/src/main/java/dev/apexnative/navigation/splash/SplashTheme.kt +81 -0
- package/android/src/main/java/dev/apexnative/navigation/splash/SplashView.kt +77 -0
- package/android/src/main/java/dev/apexnative/navigation/system/AppDirection.kt +92 -0
- package/android/src/main/java/dev/apexnative/navigation/system/SystemUiLayers.kt +126 -0
- package/android/src/main/java/dev/apexnative/navigation/system/SystemUiOwner.kt +229 -0
- package/android/src/main/java/dev/apexnative/navigation/system/SystemUiRules.kt +302 -0
- package/android/src/main/java/dev/apexnative/navigation/system/SystemUiState.kt +58 -0
- package/android/src/main/java/dev/apexnative/navigation/system/SystemUiWindow.kt +405 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ColorUtils.kt +22 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/DevelopmentLog.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/DimensionExtensions.kt +16 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageLoader.kt +112 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/MaterialTheme.kt +148 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/NavigationLog.kt +6 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ScrollToTop.kt +33 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/SystemUiUtils.kt +41 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/TestIds.kt +89 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/TextViewUtils.kt +10 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/UiThread.kt +31 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/UiUtils.kt +43 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +124 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewExtensions.kt +41 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewUtils.kt +15 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/WindowFolds.kt +107 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +258 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementDefinition.kt +57 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementLayout.kt +225 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementPlanner.kt +120 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/SecondaryScreenPresenter.kt +31 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +54 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +664 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +367 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +81 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +223 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabBarLook.kt +74 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabBarMotion.kt +83 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabCellState.kt +27 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabHistory.kt +38 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +172 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabSelection.kt +65 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsAttach.kt +42 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +72 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/child/ChildController.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/child/ChildControllersRegistry.kt +29 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +90 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +254 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +65 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +231 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RestPlace.kt +28 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenContentFactory.kt +28 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFocus.kt +22 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +154 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +104 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +148 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentCreator.kt +18 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +187 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/NativeScreens.kt +25 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +40 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalContainer.kt +20 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +1269 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +186 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +342 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +398 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetContainer.kt +67 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +78 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/FirstRootDraw.kt +58 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/LayoutFactory.kt +203 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +562 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigators.kt +53 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +514 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/WaitingLayer.kt +18 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayContainer.kt +33 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +383 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayTouches.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayViews.kt +117 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +62 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +43 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +218 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ShownChildren.kt +82 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +283 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +276 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +92 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +107 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +59 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +509 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewLayout.kt +61 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewPresenter.kt +25 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +19 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedPushes.kt +114 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +387 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +635 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +167 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackPresenter.kt +24 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +1274 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +82 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +222 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPlacement.kt +47 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPlan.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +279 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +450 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/SearchPanel.kt +176 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +243 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +211 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarRowTransition.kt +122 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonCells.kt +30 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +65 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/LargeTitleCollapse.kt +71 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +72 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarCollapseBehavior.kt +104 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +1085 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarRoom.kt +95 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +122 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/IReactView.kt +89 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/Presenter.kt +51 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +194 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +320 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationRules.kt +141 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +193 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/FadeThrough.kt +57 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/SideAnimator.kt +143 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/SystemTransition.kt +26 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +93 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabItem.kt +13 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +550 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsContainer.kt +135 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +89 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +91 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +165 -0
- package/android/src/main/java/dev/apexnative/navigation/views/component/ComponentLayout.kt +89 -0
- package/android/src/main/java/dev/apexnative/navigation/views/component/Renderable.kt +6 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/DrawOrder.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +31 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +281 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/ImageLoads.kt +103 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +112 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +152 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +53 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +46 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +53 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +138 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +88 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +33 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +66 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +70 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +179 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +139 -0
- package/android/src/main/java/dev/apexnative/navigation/views/externalcomponent/ExternalComponentLayout.kt +44 -0
- package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +183 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +137 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +125 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabAnimator.kt +8 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCollapseBehaviour.kt +34 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +133 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/LargeTitleView.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +211 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +407 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBarDefaults.kt +35 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/ScopeRow.kt +82 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/SearchField.kt +130 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/SearchStyle.kt +29 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/search/SuggestionList.kt +77 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +80 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +334 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +106 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/IconBackgroundDrawable.kt +93 -0
- package/android/src/main/jni/ApexNavigationSpec.h +18 -0
- package/android/src/main/jni/CMakeLists.txt +33 -0
- package/android/src/main/res/color/apex_navigation_highlight_inverse.xml +5 -0
- package/android/src/main/res/color/apex_navigation_text_primary.xml +6 -0
- package/android/src/main/res/color/apex_navigation_text_primary_inverse.xml +6 -0
- package/android/src/main/res/color/apex_navigation_text_secondary.xml +6 -0
- package/android/src/main/res/color/apex_navigation_text_secondary_inverse.xml +6 -0
- package/android/src/main/res/drawable/apex_navigation_ic_arrow_back.xml +13 -0
- package/android/src/main/res/drawable/apex_navigation_ic_close.xml +12 -0
- package/android/src/main/res/drawable/ic_fab_add_24dp.xml +12 -0
- package/android/src/main/res/values/attrs.xml +13 -0
- package/android/src/main/res/values/dimens.xml +5 -0
- package/android/src/main/res/values/dimens_splash.xml +9 -0
- package/android/src/main/res/values/ids.xml +12 -0
- package/android/src/main/res/values/styles.xml +18 -0
- package/android/src/main/res/values/themes.xml +75 -0
- package/android/src/main/res/values-night/styles.xml +6 -0
- package/android/src/main/res/values-night/themes.xml +67 -0
- package/cli/app.js +113 -0
- package/cli/changes.js +235 -0
- package/cli/codegen/commands.js +356 -0
- package/cli/codegen/index.js +211 -0
- package/cli/codegen/kotlin.js +396 -0
- package/cli/codegen/names.js +99 -0
- package/cli/codegen/read.js +602 -0
- package/cli/codegen/swift.js +342 -0
- package/cli/config.js +78 -0
- package/cli/diff.js +139 -0
- package/cli/doctor/checks/android.js +217 -0
- package/cli/doctor/checks/app.js +305 -0
- package/cli/doctor/checks/conflicts.js +42 -0
- package/cli/doctor/checks/devices.js +98 -0
- package/cli/doctor/checks/icons.js +69 -0
- package/cli/doctor/checks/ios.js +187 -0
- package/cli/doctor/checks/navigation.js +285 -0
- package/cli/doctor/checks/splash.js +102 -0
- package/cli/doctor/fix.js +66 -0
- package/cli/doctor/index.js +136 -0
- package/cli/doctor/types.js +30 -0
- package/cli/exec.js +34 -0
- package/cli/gradle.js +142 -0
- package/cli/icons/android.js +173 -0
- package/cli/icons/images.js +202 -0
- package/cli/icons/index.js +97 -0
- package/cli/icons/ios.js +113 -0
- package/cli/icons/settings.js +116 -0
- package/cli/images.js +67 -0
- package/cli/index.js +307 -0
- package/cli/info/index.js +290 -0
- package/cli/init/index.js +426 -0
- package/cli/init/packageManager.js +48 -0
- package/cli/init/starter.js +440 -0
- package/cli/links/files.js +109 -0
- package/cli/links/identity.js +75 -0
- package/cli/links/index.js +532 -0
- package/cli/links/native.js +396 -0
- package/cli/links/open.js +120 -0
- package/cli/links/prefixes.js +89 -0
- package/cli/mcp/appMap.js +128 -0
- package/cli/mcp/docs.js +175 -0
- package/cli/mcp/index.js +153 -0
- package/cli/mcp/markdown.js +210 -0
- package/cli/mcp/protocol.js +151 -0
- package/cli/mcp/tools.js +389 -0
- package/cli/migrate/entry.js +451 -0
- package/cli/migrate/index.js +305 -0
- package/cli/migrate/native.js +250 -0
- package/cli/migrate/report.js +238 -0
- package/cli/pods.js +56 -0
- package/cli/project.js +189 -0
- package/cli/screen/index.js +383 -0
- package/cli/screen/templates/compose.js +46 -0
- package/cli/screen/templates/native.js +40 -0
- package/cli/screen/templates/react.js +47 -0
- package/cli/screen/templates/swiftui.js +30 -0
- package/cli/screen/templates/uikit.js +48 -0
- package/cli/screen/templates/views.js +46 -0
- package/cli/setup/index.js +240 -0
- package/cli/setup/source.js +58 -0
- package/cli/setup/steps/app.js +76 -0
- package/cli/setup/steps/appDelegate.js +98 -0
- package/cli/setup/steps/entry.js +68 -0
- package/cli/setup/steps/env.js +245 -0
- package/cli/setup/steps/infoPlist.js +39 -0
- package/cli/setup/steps/mainActivity.js +60 -0
- package/cli/setup/steps/mainApplication.js +58 -0
- package/cli/setup/steps/manifest.js +38 -0
- package/cli/setup/steps/styles.js +29 -0
- package/cli/setup/steps/types.js +14 -0
- package/cli/splash/android.js +239 -0
- package/cli/splash/files.js +50 -0
- package/cli/splash/images.js +117 -0
- package/cli/splash/index.js +109 -0
- package/cli/splash/ios.js +349 -0
- package/cli/splash/settings.js +143 -0
- package/cli/typescript.js +473 -0
- package/cli/ui.js +268 -0
- package/cli/upgrade/changelog.js +45 -0
- package/cli/upgrade/index.js +347 -0
- package/cli/upgrade/versions.js +105 -0
- package/cli/workspace.js +60 -0
- package/cli/xcode/pbxproj.js +327 -0
- package/docs-md/architecture/errors-and-loading.md +138 -0
- package/docs-md/architecture/native-screens.md +290 -0
- package/docs-md/architecture/one-tree.md +164 -0
- package/docs-md/architecture/theme-and-context.md +368 -0
- package/docs-md/architecture/transitions.md +191 -0
- package/docs-md/containers/arrangement.md +320 -0
- package/docs-md/containers/modals.md +195 -0
- package/docs-md/containers/overlays.md +109 -0
- package/docs-md/containers/side-menu.md +138 -0
- package/docs-md/containers/split-view.md +155 -0
- package/docs-md/containers/stack.md +156 -0
- package/docs-md/containers/tabs.md +187 -0
- package/docs-md/flows/a-search-screen.md +311 -0
- package/docs-md/flows/an-app-with-tabs.md +380 -0
- package/docs-md/flows/bottom-sheets.md +326 -0
- package/docs-md/flows/forms-in-a-modal.md +420 -0
- package/docs-md/flows/list-and-details.md +428 -0
- package/docs-md/flows/onboarding.md +454 -0
- package/docs-md/flows/sign-in-and-sign-out.md +693 -0
- package/docs-md/fundamentals/lifecycle-and-events.md +224 -0
- package/docs-md/fundamentals/moving-between-screens.md +267 -0
- package/docs-md/fundamentals/screen-options.md +197 -0
- package/docs-md/fundamentals/screens-and-props.md +314 -0
- package/docs-md/fundamentals/starting-the-app.md +317 -0
- package/docs-md/fundamentals/switching-roots.md +166 -0
- package/docs-md/guides/analytics.md +377 -0
- package/docs-md/guides/app-context.md +554 -0
- package/docs-md/guides/building-a-screen.md +350 -0
- package/docs-md/guides/cli.md +421 -0
- package/docs-md/guides/data-fetching.md +492 -0
- package/docs-md/guides/deep-links.md +694 -0
- package/docs-md/guides/error-reporting.md +290 -0
- package/docs-md/guides/gestures-and-animations.md +381 -0
- package/docs-md/guides/notifications.md +548 -0
- package/docs-md/guides/overview.md +65 -0
- package/docs-md/guides/right-to-left.md +273 -0
- package/docs-md/guides/splash-screen.md +30 -0
- package/docs-md/guides/state-management.md +1050 -0
- package/docs-md/guides/testing.md +293 -0
- package/docs-md/help/glossary.md +433 -0
- package/docs-md/help/troubleshooting.md +709 -0
- package/docs-md/index.json +4205 -0
- package/docs-md/migration/from-expo-router.md +446 -0
- package/docs-md/migration/from-react-native-navigation.md +789 -0
- package/docs-md/migration/from-react-navigation.md +628 -0
- package/docs-md/screen-ui/back-and-gestures.md +178 -0
- package/docs-md/screen-ui/bar-buttons.md +312 -0
- package/docs-md/screen-ui/search.md +181 -0
- package/docs-md/screen-ui/system-ui.md +337 -0
- package/docs-md/screen-ui/toolbar-and-fab.md +146 -0
- package/docs-md/screen-ui/top-bar.md +247 -0
- package/docs-md/start/installation.md +233 -0
- package/docs-md/start/introduction.md +46 -0
- package/docs-md/start/quick-start.md +124 -0
- package/ios/Animations/ANNAnimationRules.h +72 -0
- package/ios/Animations/ANNAnimationRules.mm +122 -0
- package/ios/Animations/ANNFrameDriver.h +46 -0
- package/ios/Animations/ANNFrameDriver.mm +126 -0
- package/ios/Animations/ANNTransitionAnimator.h +34 -0
- package/ios/Animations/ANNTransitionAnimator.mm +293 -0
- package/ios/Animations/ANNTransitionPlan.h +115 -0
- package/ios/Animations/ANNTransitionPlan.mm +130 -0
- package/ios/Animations/ANNTransitionWait.h +29 -0
- package/ios/Animations/ANNTransitionWait.mm +135 -0
- package/ios/Animations/Elements/ANNElementFinder.h +26 -0
- package/ios/Animations/Elements/ANNElementFinder.mm +37 -0
- package/ios/Animations/Elements/ANNElementTransition.h +30 -0
- package/ios/Animations/Elements/ANNElementTransition.mm +75 -0
- package/ios/Animations/Elements/ANNSharedElementFlight.h +42 -0
- package/ios/Animations/Elements/ANNSharedElementFlight.mm +340 -0
- package/ios/Animations/Elements/ANNZoomAnchor.h +33 -0
- package/ios/Animations/Elements/ANNZoomAnchor.mm +133 -0
- package/ios/Animations/Interpolators/ANNCurve.h +61 -0
- package/ios/Animations/Interpolators/ANNCurve.mm +301 -0
- package/ios/Animations/Interpolators/ANNInterpolate.h +69 -0
- package/ios/Animations/Interpolators/ANNTrack.h +52 -0
- package/ios/Animations/Interpolators/ANNTrack.mm +77 -0
- package/ios/Animations/Interpolators/ANNViewTracks.h +57 -0
- package/ios/Animations/Interpolators/ANNViewTracks.mm +261 -0
- package/ios/ApexNavigation-prefix.h +6 -0
- package/ios/CLAUDE.md +151 -0
- package/ios/CORE.md +177 -0
- package/ios/Contract/ANNCommandAnswer.h +38 -0
- package/ios/Contract/ANNCommandAnswer.mm +99 -0
- package/ios/Contract/ANNCommandRunner.h +42 -0
- package/ios/Contract/ANNCommandRunner.mm +89 -0
- package/ios/Contract/ANNErrorTexts.h +86 -0
- package/ios/Contract/ANNErrorTexts.mm +230 -0
- package/ios/Contract/ANNLayoutNode.h +64 -0
- package/ios/Contract/ANNLayoutNode.mm +153 -0
- package/ios/Contract/ANNLayoutReader.h +34 -0
- package/ios/Contract/ANNLayoutReader.mm +282 -0
- package/ios/Contract/ANNLayoutRoot.h +26 -0
- package/ios/Contract/ANNLayoutRoot.mm +21 -0
- package/ios/Contract/ANNLayoutTreeOptions.h +22 -0
- package/ios/Contract/ANNLayoutTreeOptions.mm +32 -0
- package/ios/Contract/ANNLayoutType.h +44 -0
- package/ios/Contract/ANNLayoutValidator.h +23 -0
- package/ios/Contract/ANNLayoutValidator.mm +28 -0
- package/ios/Core/ANNAppDelegate.mm +122 -0
- package/ios/Core/ANNAppDirection.h +43 -0
- package/ios/Core/ANNAppDirection.mm +194 -0
- package/ios/Core/ANNAppearanceDispatcher.h +117 -0
- package/ios/Core/ANNAppearanceDispatcher.mm +433 -0
- package/ios/Core/ANNAssert.h +7 -0
- package/ios/Core/ANNDeepLinkQueue.h +35 -0
- package/ios/Core/ANNDeepLinkQueue.mm +136 -0
- package/ios/Core/ANNErrorHandler.h +17 -0
- package/ios/Core/ANNErrorHandler.mm +14 -0
- package/ios/Core/ANNEventEmitter.h +174 -0
- package/ios/Core/ANNEventEmitter.mm +337 -0
- package/ios/Core/ANNHinge.h +26 -0
- package/ios/Core/ANNHinge.mm +116 -0
- package/ios/Core/ANNKeyCommands.h +12 -0
- package/ios/Core/ANNKeyCommands.mm +74 -0
- package/ios/Core/ANNLayoutInfo.h +18 -0
- package/ios/Core/ANNLayoutInfo.mm +13 -0
- package/ios/Core/ANNLayoutProtocol.h +155 -0
- package/ios/Core/ANNNavigationState.h +38 -0
- package/ios/Core/ANNNavigationState.mm +127 -0
- package/ios/Core/ANNNodeHelper.h +114 -0
- package/ios/Core/ANNNodeHelper.mm +260 -0
- package/ios/Core/ANNNodePresenter.h +86 -0
- package/ios/Core/ANNNodePresenter.mm +92 -0
- package/ios/Core/ANNNodeRegistry.h +30 -0
- package/ios/Core/ANNNodeRegistry.mm +48 -0
- package/ios/Core/ANNOptionsRepaint.h +19 -0
- package/ios/Core/ANNOptionsRepaint.mm +59 -0
- package/ios/Core/ANNParking.h +34 -0
- package/ios/Core/ANNParking.mm +117 -0
- package/ios/Core/ANNPendingLayers.h +31 -0
- package/ios/Core/ANNPendingLayers.mm +57 -0
- package/ios/Core/ANNReloadCoordinator.h +26 -0
- package/ios/Core/ANNReloadCoordinator.mm +211 -0
- package/ios/Core/ANNRenderWait.h +105 -0
- package/ios/Core/ANNRenderWait.mm +496 -0
- package/ios/Core/ANNSceneDelegate.mm +92 -0
- package/ios/Core/ANNScreenAppearance+Internal.h +29 -0
- package/ios/Core/ANNScreenAppearance.h +60 -0
- package/ios/Core/ANNScreenAppearance.mm +44 -0
- package/ios/Core/ANNShownScreens.h +27 -0
- package/ios/Core/ANNShownScreens.mm +16 -0
- package/ios/Core/ANNSystemUI.h +95 -0
- package/ios/Core/ANNSystemUI.mm +401 -0
- package/ios/Core/ANNSystemUIRules.h +35 -0
- package/ios/Core/ANNSystemUIRules.mm +139 -0
- package/ios/Core/ANNUtils.h +35 -0
- package/ios/Core/ANNUtils.mm +111 -0
- package/ios/Core/ApexNavigation+Internal.h +26 -0
- package/ios/Core/ApexNavigation.mm +177 -0
- package/ios/Core/UIViewController+LayoutProtocol.h +102 -0
- package/ios/Core/UIViewController+LayoutProtocol.mm +253 -0
- package/ios/Layouts/Arrangement/ANNArrangementScreenDelegate.h +18 -0
- package/ios/Layouts/Arrangement/ANNArrangementState.h +30 -0
- package/ios/Layouts/Arrangement/ANNArrangementState.mm +53 -0
- package/ios/Layouts/Arrangement/ANNArrangementViewController.h +38 -0
- package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +573 -0
- package/ios/Layouts/External/ANNExternalViewController.h +28 -0
- package/ios/Layouts/External/ANNExternalViewController.mm +118 -0
- package/ios/Layouts/External/ANNNativeScreenCalls.h +27 -0
- package/ios/Layouts/External/ANNNativeScreenCalls.mm +77 -0
- package/ios/Layouts/Modal/ANNModal.h +121 -0
- package/ios/Layouts/Modal/ANNModal.mm +64 -0
- package/ios/Layouts/Modal/ANNModalCoordinator.h +99 -0
- package/ios/Layouts/Modal/ANNModalCoordinator.mm +1965 -0
- package/ios/Layouts/Modal/ANNModalHostViewComponentView.h +13 -0
- package/ios/Layouts/Modal/ANNModalHostViewComponentView.mm +24 -0
- package/ios/Layouts/Modal/ANNModalPresentation.h +73 -0
- package/ios/Layouts/Modal/ANNModalPresentation.mm +189 -0
- package/ios/Layouts/Modal/ANNModalSizePresenter.h +13 -0
- package/ios/Layouts/Modal/ANNModalSizePresenter.mm +65 -0
- package/ios/Layouts/Modal/ANNModalTransitions.h +29 -0
- package/ios/Layouts/Modal/ANNModalTransitions.mm +40 -0
- package/ios/Layouts/Modal/ANNPopoverPresenter.h +29 -0
- package/ios/Layouts/Modal/ANNPopoverPresenter.mm +158 -0
- package/ios/Layouts/Modal/ANNPresentationGate.h +52 -0
- package/ios/Layouts/Modal/ANNPresentationGate.mm +153 -0
- package/ios/Layouts/Modal/ANNSheetPresenter.h +31 -0
- package/ios/Layouts/Modal/ANNSheetPresenter.mm +247 -0
- package/ios/Layouts/Overlay/ANNOverlayCoordinator.h +66 -0
- package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +604 -0
- package/ios/Layouts/Overlay/ANNOverlayWindow.h +10 -0
- package/ios/Layouts/Overlay/ANNOverlayWindow.mm +71 -0
- package/ios/Layouts/Root/ANNLayoutFactory.h +31 -0
- package/ios/Layouts/Root/ANNLayoutFactory.mm +349 -0
- package/ios/Layouts/Root/ANNRootCoordinator.h +42 -0
- package/ios/Layouts/Root/ANNRootCoordinator.mm +847 -0
- package/ios/Layouts/Root/ANNSplashViewController.h +30 -0
- package/ios/Layouts/Root/ANNSplashViewController.mm +138 -0
- package/ios/Layouts/Screen/ANNComponentPresenter.h +32 -0
- package/ios/Layouts/Screen/ANNComponentPresenter.mm +136 -0
- package/ios/Layouts/Screen/ANNComponentViewController.h +100 -0
- package/ios/Layouts/Screen/ANNComponentViewController.mm +652 -0
- package/ios/Layouts/Screen/ANNNativeScreenContext+Internal.h +19 -0
- package/ios/Layouts/Screen/ANNNativeScreenContext.mm +84 -0
- package/ios/Layouts/Screen/ANNPreviewInteraction.h +38 -0
- package/ios/Layouts/Screen/ANNPreviewInteraction.mm +252 -0
- package/ios/Layouts/Screen/ANNScreenBars.h +29 -0
- package/ios/Layouts/Screen/ANNScreenBars.mm +47 -0
- package/ios/Layouts/Screen/ANNScreenInsets.h +30 -0
- package/ios/Layouts/Screen/ANNScreenInsets.mm +68 -0
- package/ios/Layouts/Screen/ANNScreenReadiness.h +92 -0
- package/ios/Layouts/Screen/ANNScreenReadiness.mm +186 -0
- package/ios/Layouts/Screen/ANNScreenRegions.h +33 -0
- package/ios/Layouts/Screen/ANNScreenRegions.mm +105 -0
- package/ios/Layouts/Screen/ANNScreenSafeArea.h +38 -0
- package/ios/Layouts/Screen/ANNScreenSafeArea.mm +58 -0
- package/ios/Layouts/SideMenu/ANNSideMenuChildViewController.h +41 -0
- package/ios/Layouts/SideMenu/ANNSideMenuChildViewController.mm +113 -0
- package/ios/Layouts/SideMenu/ANNSideMenuPresenter.h +28 -0
- package/ios/Layouts/SideMenu/ANNSideMenuPresenter.mm +260 -0
- package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +19 -0
- package/ios/Layouts/SideMenu/ANNSideMenuViewController.h +46 -0
- package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +891 -0
- package/ios/Layouts/SplitView/ANNSplitViewCommands.h +39 -0
- package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +612 -0
- package/ios/Layouts/SplitView/ANNSplitViewController.h +52 -0
- package/ios/Layouts/SplitView/ANNSplitViewController.mm +494 -0
- package/ios/Layouts/SplitView/ANNSplitViewPresenter.h +18 -0
- package/ios/Layouts/SplitView/ANNSplitViewPresenter.mm +181 -0
- package/ios/Layouts/SplitView/UISplitViewController+ANNOptions.h +32 -0
- package/ios/Layouts/SplitView/UISplitViewController+ANNOptions.mm +133 -0
- package/ios/Layouts/Stack/ANNPreviewPush.h +46 -0
- package/ios/Layouts/Stack/ANNPreviewPush.mm +298 -0
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +32 -0
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +92 -0
- package/ios/Layouts/Stack/ANNStackCommands.h +51 -0
- package/ios/Layouts/Stack/ANNStackCommands.mm +403 -0
- package/ios/Layouts/Stack/ANNStackController.h +161 -0
- package/ios/Layouts/Stack/ANNStackController.mm +1597 -0
- package/ios/Layouts/Stack/ANNStackPresenter.h +44 -0
- package/ios/Layouts/Stack/ANNStackPresenter.mm +181 -0
- package/ios/Layouts/Stack/ANNStackQueue.h +194 -0
- package/ios/Layouts/Stack/ANNStackQueue.mm +1300 -0
- package/ios/Layouts/Stack/InteractivePopGestureDelegate.h +53 -0
- package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +228 -0
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +19 -0
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +29 -0
- package/ios/Layouts/Tabs/ANNBottomTabCellView.h +33 -0
- package/ios/Layouts/Tabs/ANNBottomTabCellView.mm +100 -0
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +49 -0
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +153 -0
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.h +17 -0
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +56 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.h +121 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.mm +1404 -0
- package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.h +47 -0
- package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +280 -0
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +81 -0
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +1026 -0
- package/ios/Layouts/Tabs/ANNMoreNavigationDelegate.h +24 -0
- package/ios/Layouts/Tabs/ANNMoreNavigationDelegate.mm +58 -0
- package/ios/Layouts/Tabs/ANNScrollToTop.h +23 -0
- package/ios/Layouts/Tabs/ANNScrollToTop.mm +55 -0
- package/ios/Layouts/Tabs/ANNTabDotView.h +19 -0
- package/ios/Layouts/Tabs/ANNTabDotView.mm +46 -0
- package/ios/Layouts/Tabs/ANNTabLongPress.h +28 -0
- package/ios/Layouts/Tabs/ANNTabLongPress.mm +98 -0
- package/ios/Layouts/Tabs/ANNTabsDesign.h +26 -0
- package/ios/Layouts/Tabs/ANNTabsDesign.mm +34 -0
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +27 -0
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +55 -0
- package/ios/Layouts/Tabs/UITabBar+utils.h +24 -0
- package/ios/Layouts/Tabs/UITabBar+utils.mm +103 -0
- package/ios/Options/ANNAnimationOptions.h +22 -0
- package/ios/Options/ANNAnimationOptions.mm +16 -0
- package/ios/Options/ANNAnimationPropertyOptions.h +17 -0
- package/ios/Options/ANNAnimationPropertyOptions.mm +15 -0
- package/ios/Options/ANNBottomTabDotIndicatorOptions.h +14 -0
- package/ios/Options/ANNBottomTabDotIndicatorOptions.mm +13 -0
- package/ios/Options/ANNBottomTabOptions.h +51 -0
- package/ios/Options/ANNBottomTabOptions.mm +47 -0
- package/ios/Options/ANNBottomTabsAccessoryOptions.h +19 -0
- package/ios/Options/ANNBottomTabsAccessoryOptions.mm +25 -0
- package/ios/Options/ANNBottomTabsAnimationOptions.h +12 -0
- package/ios/Options/ANNBottomTabsAnimationOptions.mm +11 -0
- package/ios/Options/ANNBottomTabsCustomRowOptions.h +19 -0
- package/ios/Options/ANNBottomTabsCustomRowOptions.mm +17 -0
- package/ios/Options/ANNBottomTabsOptions.h +51 -0
- package/ios/Options/ANNBottomTabsOptions.mm +48 -0
- package/ios/Options/ANNBottomTabsShadowOptions.h +14 -0
- package/ios/Options/ANNBottomTabsShadowOptions.mm +13 -0
- package/ios/Options/ANNButtonComponentOptions.h +13 -0
- package/ios/Options/ANNButtonComponentOptions.mm +12 -0
- package/ios/Options/ANNButtonOptions.h +56 -0
- package/ios/Options/ANNButtonOptions.mm +53 -0
- package/ios/Options/ANNButtonsParser.h +13 -0
- package/ios/Options/ANNButtonsParser.mm +18 -0
- package/ios/Options/ANNComponentOptions.h +14 -0
- package/ios/Options/ANNComponentOptions.mm +12 -0
- package/ios/Options/ANNDefaultOptions.h +18 -0
- package/ios/Options/ANNDefaultOptions.mm +22 -0
- package/ios/Options/ANNElementAnimationOptions.h +18 -0
- package/ios/Options/ANNElementAnimationOptions.mm +15 -0
- package/ios/Options/ANNElementTransitionOptions.h +26 -0
- package/ios/Options/ANNElementTransitionOptions.mm +28 -0
- package/ios/Options/ANNEnterExitBottomTabsAnimationOptions.h +14 -0
- package/ios/Options/ANNEnterExitBottomTabsAnimationOptions.mm +12 -0
- package/ios/Options/ANNEnterExitScreenAnimationOptions.h +14 -0
- package/ios/Options/ANNEnterExitScreenAnimationOptions.mm +12 -0
- package/ios/Options/ANNEnterExitTopBarAnimationOptions.h +14 -0
- package/ios/Options/ANNEnterExitTopBarAnimationOptions.mm +12 -0
- package/ios/Options/ANNFabOptions.h +26 -0
- package/ios/Options/ANNFabOptions.mm +23 -0
- package/ios/Options/ANNFontOptions.h +24 -0
- package/ios/Options/ANNFontOptions.mm +65 -0
- package/ios/Options/ANNHardwareBackButtonOptions.h +15 -0
- package/ios/Options/ANNHardwareBackButtonOptions.mm +13 -0
- package/ios/Options/ANNIconBackgroundOptions.h +16 -0
- package/ios/Options/ANNIconBackgroundOptions.mm +15 -0
- package/ios/Options/ANNIconInsetsOptions.h +16 -0
- package/ios/Options/ANNIconInsetsOptions.mm +14 -0
- package/ios/Options/ANNInterpolationOptions.h +22 -0
- package/ios/Options/ANNInterpolationOptions.mm +22 -0
- package/ios/Options/ANNLayoutOptions.h +26 -0
- package/ios/Options/ANNLayoutOptions.mm +25 -0
- package/ios/Options/ANNMenuOptions.h +37 -0
- package/ios/Options/ANNMenuOptions.mm +136 -0
- package/ios/Options/ANNModalAnimationOptions.h +17 -0
- package/ios/Options/ANNModalAnimationOptions.mm +15 -0
- package/ios/Options/ANNModalContentSizeOptions.h +14 -0
- package/ios/Options/ANNModalContentSizeOptions.mm +15 -0
- package/ios/Options/ANNModalOptions.h +19 -0
- package/ios/Options/ANNModalOptions.mm +15 -0
- package/ios/Options/ANNNavigationBarOptions.h +14 -0
- package/ios/Options/ANNNavigationBarOptions.mm +13 -0
- package/ios/Options/ANNNavigationOptions.h +60 -0
- package/ios/Options/ANNNavigationOptions.mm +54 -0
- package/ios/Options/ANNOptionField.h +91 -0
- package/ios/Options/ANNOptionField.mm +173 -0
- package/ios/Options/ANNOptions.h +62 -0
- package/ios/Options/ANNOptions.mm +329 -0
- package/ios/Options/ANNOptionsCache.h +22 -0
- package/ios/Options/ANNOptionsCache.mm +17 -0
- package/ios/Options/ANNOptionsReader.h +33 -0
- package/ios/Options/ANNOptionsReader.mm +63 -0
- package/ios/Options/ANNOverlayOptions.h +14 -0
- package/ios/Options/ANNOverlayOptions.mm +12 -0
- package/ios/Options/ANNPopoverOptions.h +17 -0
- package/ios/Options/ANNPopoverOptions.mm +31 -0
- package/ios/Options/ANNPreviewOptions.h +17 -0
- package/ios/Options/ANNPreviewOptions.mm +15 -0
- package/ios/Options/ANNScreenAnimationOptions.h +13 -0
- package/ios/Options/ANNScreenAnimationOptions.mm +12 -0
- package/ios/Options/ANNScrollEdgeEffectOptions.h +20 -0
- package/ios/Options/ANNScrollEdgeEffectOptions.mm +16 -0
- package/ios/Options/ANNScrollEdgeOptions.h +14 -0
- package/ios/Options/ANNScrollEdgeOptions.mm +12 -0
- package/ios/Options/ANNSearchBarOptions.h +49 -0
- package/ios/Options/ANNSearchBarOptions.mm +41 -0
- package/ios/Options/ANNSearchScopeOptions.h +15 -0
- package/ios/Options/ANNSearchScopeOptions.mm +13 -0
- package/ios/Options/ANNSearchSuggestionOptions.h +19 -0
- package/ios/Options/ANNSearchSuggestionOptions.mm +16 -0
- package/ios/Options/ANNSearchTokenOptions.h +18 -0
- package/ios/Options/ANNSearchTokenOptions.mm +15 -0
- package/ios/Options/ANNSetStackRootAnimationOptions.h +12 -0
- package/ios/Options/ANNSetStackRootAnimationOptions.mm +11 -0
- package/ios/Options/ANNSharedElementTransitionOptions.h +17 -0
- package/ios/Options/ANNSharedElementTransitionOptions.mm +15 -0
- package/ios/Options/ANNSheetOptions.h +25 -0
- package/ios/Options/ANNSheetOptions.mm +41 -0
- package/ios/Options/ANNSideMenuOptions.h +19 -0
- package/ios/Options/ANNSideMenuOptions.mm +16 -0
- package/ios/Options/ANNSideMenuSideOptions.h +23 -0
- package/ios/Options/ANNSideMenuSideOptions.mm +20 -0
- package/ios/Options/ANNSplitViewColumnOptions.h +14 -0
- package/ios/Options/ANNSplitViewColumnOptions.mm +13 -0
- package/ios/Options/ANNSplitViewInspectorOptions.h +13 -0
- package/ios/Options/ANNSplitViewInspectorOptions.mm +9 -0
- package/ios/Options/ANNSplitViewOptions.h +29 -0
- package/ios/Options/ANNSplitViewOptions.mm +26 -0
- package/ios/Options/ANNStackAnimationOptions.h +23 -0
- package/ios/Options/ANNStackAnimationOptions.mm +20 -0
- package/ios/Options/ANNStackPushAnimationOptions.h +13 -0
- package/ios/Options/ANNStackPushAnimationOptions.mm +11 -0
- package/ios/Options/ANNStatusBarOptions.h +20 -0
- package/ios/Options/ANNStatusBarOptions.mm +18 -0
- package/ios/Options/ANNToolbarOptions.h +14 -0
- package/ios/Options/ANNToolbarOptions.mm +27 -0
- package/ios/Options/ANNTopBarAnimationOptions.h +12 -0
- package/ios/Options/ANNTopBarAnimationOptions.mm +11 -0
- package/ios/Options/ANNTopBarBackButtonOptions.h +31 -0
- package/ios/Options/ANNTopBarBackButtonOptions.mm +35 -0
- package/ios/Options/ANNTopBarBackgroundComponentOptions.h +13 -0
- package/ios/Options/ANNTopBarBackgroundComponentOptions.mm +11 -0
- package/ios/Options/ANNTopBarBackgroundOptions.h +17 -0
- package/ios/Options/ANNTopBarBackgroundOptions.mm +15 -0
- package/ios/Options/ANNTopBarLargeTitleOptions.h +19 -0
- package/ios/Options/ANNTopBarLargeTitleOptions.mm +15 -0
- package/ios/Options/ANNTopBarOptions.h +62 -0
- package/ios/Options/ANNTopBarOptions.mm +49 -0
- package/ios/Options/ANNTopBarScrollEdgeAppearanceBackgroundOptions.h +14 -0
- package/ios/Options/ANNTopBarScrollEdgeAppearanceBackgroundOptions.mm +12 -0
- package/ios/Options/ANNTopBarScrollEdgeAppearanceOptions.h +19 -0
- package/ios/Options/ANNTopBarScrollEdgeAppearanceOptions.mm +16 -0
- package/ios/Options/ANNTopBarScrollEdgeAppearanceTitleOptions.h +16 -0
- package/ios/Options/ANNTopBarScrollEdgeAppearanceTitleOptions.mm +12 -0
- package/ios/Options/ANNTopBarSubtitleOptions.h +18 -0
- package/ios/Options/ANNTopBarSubtitleOptions.mm +14 -0
- package/ios/Options/ANNTopBarTitleComponentOptions.h +15 -0
- package/ios/Options/ANNTopBarTitleComponentOptions.mm +12 -0
- package/ios/Options/ANNTopBarTitleDocumentOptions.h +12 -0
- package/ios/Options/ANNTopBarTitleDocumentOptions.mm +11 -0
- package/ios/Options/ANNTopBarTitleOptions.h +29 -0
- package/ios/Options/ANNTopBarTitleOptions.mm +21 -0
- package/ios/Options/ANNViewAnimationOptions.h +26 -0
- package/ios/Options/ANNViewAnimationOptions.mm +58 -0
- package/ios/Options/ANNWindowOptions.h +12 -0
- package/ios/Options/ANNWindowOptions.mm +9 -0
- package/ios/Options/ANNZoomTransitionOptions.h +13 -0
- package/ios/Options/ANNZoomTransitionOptions.mm +12 -0
- package/ios/Options/Params/ANNIntegerParam.h +14 -0
- package/ios/Options/Params/ANNIntegerParam.mm +13 -0
- package/ios/Options/Params/ANNParam.h +28 -0
- package/ios/Options/Params/ANNParam.mm +29 -0
- package/ios/Options/Params/Bool.h +17 -0
- package/ios/Options/Params/Bool.mm +17 -0
- package/ios/Options/Params/BoolParser.h +12 -0
- package/ios/Options/Params/BoolParser.mm +10 -0
- package/ios/Options/Params/Color.h +43 -0
- package/ios/Options/Params/Color.mm +65 -0
- package/ios/Options/Params/ColorParser.h +14 -0
- package/ios/Options/Params/ColorParser.mm +95 -0
- package/ios/Options/Params/Double.h +14 -0
- package/ios/Options/Params/Double.mm +13 -0
- package/ios/Options/Params/DoubleParser.h +16 -0
- package/ios/Options/Params/DoubleParser.mm +16 -0
- package/ios/Options/Params/Image.h +15 -0
- package/ios/Options/Params/Image.mm +13 -0
- package/ios/Options/Params/ImageParser.h +16 -0
- package/ios/Options/Params/ImageParser.mm +103 -0
- package/ios/Options/Params/Number.h +14 -0
- package/ios/Options/Params/Number.mm +13 -0
- package/ios/Options/Params/NumberParser.h +13 -0
- package/ios/Options/Params/NumberParser.mm +10 -0
- package/ios/Options/Params/Param.h +16 -0
- package/ios/Options/Params/Param.mm +13 -0
- package/ios/Options/Params/Text.h +17 -0
- package/ios/Options/Params/Text.mm +17 -0
- package/ios/Options/Params/TextParser.h +17 -0
- package/ios/Options/Params/TextParser.mm +17 -0
- package/ios/Package.swift +58 -0
- package/ios/Public/ApexNavigation/ANNAppDelegate.h +66 -0
- package/ios/Public/ApexNavigation/ANNSceneDelegate.h +19 -0
- package/ios/Public/ApexNavigation/ApexNavigation.h +92 -0
- package/ios/Public/module.modulemap +8 -0
- package/ios/RECIPES.md +41 -0
- package/ios/React/ANNComponentType.h +22 -0
- package/ios/React/ANNComponentViewCreator.h +18 -0
- package/ios/React/ANNReactComponentRegistry.h +53 -0
- package/ios/React/ANNReactComponentRegistry.mm +153 -0
- package/ios/React/ANNReactView.h +104 -0
- package/ios/React/ANNReactView.mm +374 -0
- package/ios/React/ANNReactViewCreator.h +20 -0
- package/ios/React/ANNReactViewCreator.mm +42 -0
- package/ios/React/ANNSafeAreaViewComponentView.h +13 -0
- package/ios/React/ANNSafeAreaViewComponentView.mm +153 -0
- package/ios/React/ANNSurfaceHostingView.h +17 -0
- package/ios/React/ANNSurfaceHostingView.mm +68 -0
- package/ios/React/Slots/ANNSlotComponentView.h +10 -0
- package/ios/React/Slots/ANNSlotComponentView.mm +122 -0
- package/ios/React/Slots/ANNSlotContainers.h +34 -0
- package/ios/React/Slots/ANNSlotContainers.mm +39 -0
- package/ios/React/Slots/ANNSlotContentView.h +12 -0
- package/ios/React/Slots/ANNSlotContentView.mm +18 -0
- package/ios/React/Slots/ANNSlotHost.h +29 -0
- package/ios/React/Slots/ANNSlotHost.mm +59 -0
- package/ios/React/Slots/ANNSlotScreenView.h +38 -0
- package/ios/React/Slots/ANNSlotScreenView.mm +254 -0
- package/ios/TopBar/ANNBackButtonPresenter.h +35 -0
- package/ios/TopBar/ANNBackButtonPresenter.mm +187 -0
- package/ios/TopBar/ANNBarAppearance.h +53 -0
- package/ios/TopBar/ANNBarAppearance.mm +278 -0
- package/ios/TopBar/ANNBarBackgroundComponent.h +46 -0
- package/ios/TopBar/ANNBarBackgroundComponent.mm +163 -0
- package/ios/TopBar/ANNBarButtonComponentView.h +30 -0
- package/ios/TopBar/ANNBarButtonComponentView.mm +110 -0
- package/ios/TopBar/ANNBarButtons.h +65 -0
- package/ios/TopBar/ANNBarButtons.mm +1125 -0
- package/ios/TopBar/ANNBarComponentsWait.h +37 -0
- package/ios/TopBar/ANNBarComponentsWait.mm +116 -0
- package/ios/TopBar/ANNIconButtonImage.h +25 -0
- package/ios/TopBar/ANNIconButtonImage.mm +94 -0
- package/ios/TopBar/ANNLargeTitlePresenter.h +117 -0
- package/ios/TopBar/ANNLargeTitlePresenter.mm +402 -0
- package/ios/TopBar/ANNMainList.h +28 -0
- package/ios/TopBar/ANNMainList.mm +72 -0
- package/ios/TopBar/ANNScrollEdgeEffects.h +29 -0
- package/ios/TopBar/ANNScrollEdgeEffects.mm +122 -0
- package/ios/TopBar/ANNSearchPresenter.h +29 -0
- package/ios/TopBar/ANNSearchPresenter.mm +637 -0
- package/ios/TopBar/ANNSearchResultsViewController.h +16 -0
- package/ios/TopBar/ANNSearchResultsViewController.mm +56 -0
- package/ios/TopBar/ANNShowTextButton.h +22 -0
- package/ios/TopBar/ANNShowTextButton.mm +63 -0
- package/ios/TopBar/ANNTitleComponentView.h +37 -0
- package/ios/TopBar/ANNTitleComponentView.mm +86 -0
- package/ios/TopBar/ANNTitleGlassView.h +33 -0
- package/ios/TopBar/ANNTitleGlassView.mm +126 -0
- package/ios/TopBar/ANNTitleView.h +18 -0
- package/ios/TopBar/ANNTitleView.mm +63 -0
- package/ios/TopBar/ANNToolbarPresenter.h +26 -0
- package/ios/TopBar/ANNToolbarPresenter.mm +24 -0
- package/ios/TopBar/ANNTopBarPresenter.h +120 -0
- package/ios/TopBar/ANNTopBarPresenter.mm +1252 -0
- package/ios/TopBar/ANNUIBarButtonItem.h +16 -0
- package/ios/TopBar/ANNUIBarButtonItem.mm +5 -0
- package/ios/TurboModules/ANNTurboEventEmitter.h +31 -0
- package/ios/TurboModules/ANNTurboEventEmitter.mm +129 -0
- package/ios/TurboModules/ANNTurboModule.h +11 -0
- package/ios/TurboModules/ANNTurboModule.mm +626 -0
- package/ios/Utils/UIColor+ANNLuminance.h +13 -0
- package/ios/Utils/UIColor+ANNLuminance.mm +32 -0
- package/ios/Utils/UIView+Utils.h +12 -0
- package/ios/Utils/UIView+Utils.mm +21 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSafeAreaViewComponentDescriptor.h +19 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSafeAreaViewShadowNode.h +60 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSafeAreaViewState.h +33 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotComponentDescriptor.h +22 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotShadowNode.h +87 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +101 -0
- package/lib/module/ARCHITECTURE.md +289 -0
- package/lib/module/adapters/NativeANNTurboEventEmitter.js +12 -0
- package/lib/module/adapters/NativeANNTurboEventEmitter.js.map +1 -0
- package/lib/module/adapters/NativeANNTurboModule.js +13 -0
- package/lib/module/adapters/NativeANNTurboModule.js.map +1 -0
- package/lib/module/api/app/AppRegistry.js +52 -0
- package/lib/module/api/app/AppRegistry.js.map +1 -0
- package/lib/module/api/app/activeApp.js +12 -0
- package/lib/module/api/app/activeApp.js.map +1 -0
- package/lib/module/api/app/createNavigation.js +365 -0
- package/lib/module/api/app/createNavigation.js.map +1 -0
- package/lib/module/api/app/roots.js +20 -0
- package/lib/module/api/app/roots.js.map +1 -0
- package/lib/module/api/app/splash.js +124 -0
- package/lib/module/api/app/splash.js.map +1 -0
- package/lib/module/api/app/startFailure.js +38 -0
- package/lib/module/api/app/startFailure.js.map +1 -0
- package/lib/module/api/arrangement/arrangementState.js +86 -0
- package/lib/module/api/arrangement/arrangementState.js.map +1 -0
- package/lib/module/api/commands/commands.js +375 -0
- package/lib/module/api/commands/commands.js.map +1 -0
- package/lib/module/api/commands/errors.js +94 -0
- package/lib/module/api/commands/errors.js.map +1 -0
- package/lib/module/api/commands/presentation.js +4 -0
- package/lib/module/api/commands/presentation.js.map +1 -0
- package/lib/module/api/commands/sideMenus.js +134 -0
- package/lib/module/api/commands/sideMenus.js.map +1 -0
- package/lib/module/api/commands/transitions.js +245 -0
- package/lib/module/api/commands/transitions.js.map +1 -0
- package/lib/module/api/context/appContext.js +22 -0
- package/lib/module/api/context/appContext.js.map +1 -0
- package/lib/module/api/events/navigationEvents.js +69 -0
- package/lib/module/api/events/navigationEvents.js.map +1 -0
- package/lib/module/api/events/screenLifecycle.js +30 -0
- package/lib/module/api/events/screenLifecycle.js.map +1 -0
- package/lib/module/api/events/tabPresses.js +32 -0
- package/lib/module/api/events/tabPresses.js.map +1 -0
- package/lib/module/api/hinge/hinge.js +73 -0
- package/lib/module/api/hinge/hinge.js.map +1 -0
- package/lib/module/api/hooks/appHooks.js +26 -0
- package/lib/module/api/hooks/appHooks.js.map +1 -0
- package/lib/module/api/hooks/screenHooks.js +250 -0
- package/lib/module/api/hooks/screenHooks.js.map +1 -0
- package/lib/module/api/hooks/useArrangement.js +24 -0
- package/lib/module/api/hooks/useArrangement.js.map +1 -0
- package/lib/module/api/hooks/useHinge.js +29 -0
- package/lib/module/api/hooks/useHinge.js.map +1 -0
- package/lib/module/api/hooks/useNavigation.js +117 -0
- package/lib/module/api/hooks/useNavigation.js.map +1 -0
- package/lib/module/api/hooks/usePendingLink.js +12 -0
- package/lib/module/api/hooks/usePendingLink.js.map +1 -0
- package/lib/module/api/hooks/usePreview.js +97 -0
- package/lib/module/api/hooks/usePreview.js.map +1 -0
- package/lib/module/api/hooks/useReservedRegions.js +24 -0
- package/lib/module/api/hooks/useReservedRegions.js.map +1 -0
- package/lib/module/api/hooks/useSafeAreaInsets.js +25 -0
- package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -0
- package/lib/module/api/index.js +26 -0
- package/lib/module/api/index.js.map +1 -0
- package/lib/module/api/layout/Root.js +121 -0
- package/lib/module/api/layout/Root.js.map +1 -0
- package/lib/module/api/layout/Screen.js +52 -0
- package/lib/module/api/layout/Screen.js.map +1 -0
- package/lib/module/api/layout/SideMenu.js +85 -0
- package/lib/module/api/layout/SideMenu.js.map +1 -0
- package/lib/module/api/layout/SplitView.js +137 -0
- package/lib/module/api/layout/SplitView.js.map +1 -0
- package/lib/module/api/layout/Stack.js +36 -0
- package/lib/module/api/layout/Stack.js.map +1 -0
- package/lib/module/api/layout/Tabs.js +326 -0
- package/lib/module/api/layout/Tabs.js.map +1 -0
- package/lib/module/api/layout/element.js +100 -0
- package/lib/module/api/layout/element.js.map +1 -0
- package/lib/module/api/linking/linkPaths.js +132 -0
- package/lib/module/api/linking/linkPaths.js.map +1 -0
- package/lib/module/api/linking/linking.js +244 -0
- package/lib/module/api/linking/linking.js.map +1 -0
- package/lib/module/api/linking/pendingLinks.js +34 -0
- package/lib/module/api/linking/pendingLinks.js.map +1 -0
- package/lib/module/api/linking/types.js +4 -0
- package/lib/module/api/linking/types.js.map +1 -0
- package/lib/module/api/navigation.js +105 -0
- package/lib/module/api/navigation.js.map +1 -0
- package/lib/module/api/options/OptionsChain.js +158 -0
- package/lib/module/api/options/OptionsChain.js.map +1 -0
- package/lib/module/api/options/ScreenOptions.js +83 -0
- package/lib/module/api/options/ScreenOptions.js.map +1 -0
- package/lib/module/api/options/buttons.js +4 -0
- package/lib/module/api/options/buttons.js.map +1 -0
- package/lib/module/api/safeArea/ANNSafeAreaViewNativeComponent.ts +28 -0
- package/lib/module/api/safeArea/screenInsets.js +86 -0
- package/lib/module/api/safeArea/screenInsets.js.map +1 -0
- package/lib/module/api/safeArea/screenRegions.js +84 -0
- package/lib/module/api/safeArea/screenRegions.js.map +1 -0
- package/lib/module/api/screens/ScreenBoundary.js +44 -0
- package/lib/module/api/screens/ScreenBoundary.js.map +1 -0
- package/lib/module/api/screens/arrangement.js +63 -0
- package/lib/module/api/screens/arrangement.js.map +1 -0
- package/lib/module/api/screens/defineScreen.js +29 -0
- package/lib/module/api/screens/defineScreen.js.map +1 -0
- package/lib/module/api/screens/nativeScreenCalls.js +34 -0
- package/lib/module/api/screens/nativeScreenCalls.js.map +1 -0
- package/lib/module/api/screens/nativeScreens.js +43 -0
- package/lib/module/api/screens/nativeScreens.js.map +1 -0
- package/lib/module/api/screens/registerScreens.js +305 -0
- package/lib/module/api/screens/registerScreens.js.map +1 -0
- package/lib/module/api/slots/ANNSlotNativeComponent.ts +23 -0
- package/lib/module/api/slots/SlotHost.js +92 -0
- package/lib/module/api/slots/SlotHost.js.map +1 -0
- package/lib/module/api/state/navigationState.js +98 -0
- package/lib/module/api/state/navigationState.js.map +1 -0
- package/lib/module/api/testIDs.js +14 -0
- package/lib/module/api/testIDs.js.map +1 -0
- package/lib/module/api/theme/theme.js +180 -0
- package/lib/module/api/theme/theme.js.map +1 -0
- package/lib/module/api/types.js +4 -0
- package/lib/module/api/types.js.map +1 -0
- package/lib/module/engine/backListeners.js +39 -0
- package/lib/module/engine/backListeners.js.map +1 -0
- package/lib/module/engine/buttons.js +105 -0
- package/lib/module/engine/buttons.js.map +1 -0
- package/lib/module/engine/commands.js +388 -0
- package/lib/module/engine/commands.js.map +1 -0
- package/lib/module/engine/events.js +30 -0
- package/lib/module/engine/events.js.map +1 -0
- package/lib/module/engine/ids.js +10 -0
- package/lib/module/engine/ids.js.map +1 -0
- package/lib/module/engine/launchState.js +34 -0
- package/lib/module/engine/launchState.js.map +1 -0
- package/lib/module/engine/layout.js +202 -0
- package/lib/module/engine/layout.js.map +1 -0
- package/lib/module/engine/mergeOptions.js +23 -0
- package/lib/module/engine/mergeOptions.js.map +1 -0
- package/lib/module/engine/native.js +45 -0
- package/lib/module/engine/native.js.map +1 -0
- package/lib/module/engine/nativeScreens.js +265 -0
- package/lib/module/engine/nativeScreens.js.map +1 -0
- package/lib/module/engine/options.js +170 -0
- package/lib/module/engine/options.js.map +1 -0
- package/lib/module/engine/places.js +178 -0
- package/lib/module/engine/places.js.map +1 -0
- package/lib/module/engine/props.js +44 -0
- package/lib/module/engine/props.js.map +1 -0
- package/lib/module/engine/reactMeasures.js +23 -0
- package/lib/module/engine/reactMeasures.js.map +1 -0
- package/lib/module/engine/rememberedOptions.js +118 -0
- package/lib/module/engine/rememberedOptions.js.map +1 -0
- package/lib/module/engine/screens.js +194 -0
- package/lib/module/engine/screens.js.map +1 -0
- package/lib/module/engine/slots.js +200 -0
- package/lib/module/engine/slots.js.map +1 -0
- package/lib/module/engine/tabs.js +79 -0
- package/lib/module/engine/tabs.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/interfaces/ComponentEvents.js +2 -0
- package/lib/module/interfaces/ComponentEvents.js.map +1 -0
- package/lib/module/interfaces/Events.js +2 -0
- package/lib/module/interfaces/Events.js.map +1 -0
- package/lib/module/interfaces/Layout.js +4 -0
- package/lib/module/interfaces/Layout.js.map +1 -0
- package/lib/module/interfaces/Options.js +4 -0
- package/lib/module/interfaces/Options.js.map +1 -0
- package/lib/module/interfaces/options/animations.js +2 -0
- package/lib/module/interfaces/options/animations.js.map +1 -0
- package/lib/module/interfaces/options/bottomTabs.js +4 -0
- package/lib/module/interfaces/options/bottomTabs.js.map +1 -0
- package/lib/module/interfaces/options/buttons.js +4 -0
- package/lib/module/interfaces/options/buttons.js.map +1 -0
- package/lib/module/interfaces/options/common.js +4 -0
- package/lib/module/interfaces/options/common.js.map +1 -0
- package/lib/module/interfaces/options/modals.js +2 -0
- package/lib/module/interfaces/options/modals.js.map +1 -0
- package/lib/module/interfaces/options/preview.js +2 -0
- package/lib/module/interfaces/options/preview.js.map +1 -0
- package/lib/module/interfaces/options/sideMenu.js +2 -0
- package/lib/module/interfaces/options/sideMenu.js.map +1 -0
- package/lib/module/interfaces/options/splitView.js +2 -0
- package/lib/module/interfaces/options/splitView.js.map +1 -0
- package/lib/module/interfaces/options/stack.js +4 -0
- package/lib/module/interfaces/options/stack.js.map +1 -0
- package/lib/module/interfaces/options/system.js +4 -0
- package/lib/module/interfaces/options/system.js.map +1 -0
- package/lib/module/interfaces/options/toolbar.js +4 -0
- package/lib/module/interfaces/options/toolbar.js.map +1 -0
- package/lib/module/interfaces/options/topBar.js +4 -0
- package/lib/module/interfaces/options/topBar.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/adapters/NativeANNTurboEventEmitter.d.ts +14 -0
- package/lib/typescript/adapters/NativeANNTurboEventEmitter.d.ts.map +1 -0
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts +77 -0
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -0
- package/lib/typescript/api/app/AppRegistry.d.ts +14 -0
- package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -0
- package/lib/typescript/api/app/activeApp.d.ts +12 -0
- package/lib/typescript/api/app/activeApp.d.ts.map +1 -0
- package/lib/typescript/api/app/createNavigation.d.ts +182 -0
- package/lib/typescript/api/app/createNavigation.d.ts.map +1 -0
- package/lib/typescript/api/app/roots.d.ts +15 -0
- package/lib/typescript/api/app/roots.d.ts.map +1 -0
- package/lib/typescript/api/app/splash.d.ts +81 -0
- package/lib/typescript/api/app/splash.d.ts.map +1 -0
- package/lib/typescript/api/app/startFailure.d.ts +15 -0
- package/lib/typescript/api/app/startFailure.d.ts.map +1 -0
- package/lib/typescript/api/arrangement/arrangementState.d.ts +21 -0
- package/lib/typescript/api/arrangement/arrangementState.d.ts.map +1 -0
- package/lib/typescript/api/commands/commands.d.ts +57 -0
- package/lib/typescript/api/commands/commands.d.ts.map +1 -0
- package/lib/typescript/api/commands/errors.d.ts +24 -0
- package/lib/typescript/api/commands/errors.d.ts.map +1 -0
- package/lib/typescript/api/commands/presentation.d.ts +69 -0
- package/lib/typescript/api/commands/presentation.d.ts.map +1 -0
- package/lib/typescript/api/commands/sideMenus.d.ts +14 -0
- package/lib/typescript/api/commands/sideMenus.d.ts.map +1 -0
- package/lib/typescript/api/commands/transitions.d.ts +33 -0
- package/lib/typescript/api/commands/transitions.d.ts.map +1 -0
- package/lib/typescript/api/context/appContext.d.ts +4 -0
- package/lib/typescript/api/context/appContext.d.ts.map +1 -0
- package/lib/typescript/api/events/navigationEvents.d.ts +70 -0
- package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -0
- package/lib/typescript/api/events/screenLifecycle.d.ts +5 -0
- package/lib/typescript/api/events/screenLifecycle.d.ts.map +1 -0
- package/lib/typescript/api/events/tabPresses.d.ts +5 -0
- package/lib/typescript/api/events/tabPresses.d.ts.map +1 -0
- package/lib/typescript/api/hinge/hinge.d.ts +21 -0
- package/lib/typescript/api/hinge/hinge.d.ts.map +1 -0
- package/lib/typescript/api/hooks/appHooks.d.ts +15 -0
- package/lib/typescript/api/hooks/appHooks.d.ts.map +1 -0
- package/lib/typescript/api/hooks/screenHooks.d.ts +74 -0
- package/lib/typescript/api/hooks/screenHooks.d.ts.map +1 -0
- package/lib/typescript/api/hooks/useArrangement.d.ts +13 -0
- package/lib/typescript/api/hooks/useArrangement.d.ts.map +1 -0
- package/lib/typescript/api/hooks/useHinge.d.ts +16 -0
- package/lib/typescript/api/hooks/useHinge.d.ts.map +1 -0
- package/lib/typescript/api/hooks/useNavigation.d.ts +108 -0
- package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -0
- package/lib/typescript/api/hooks/usePendingLink.d.ts +7 -0
- package/lib/typescript/api/hooks/usePendingLink.d.ts.map +1 -0
- package/lib/typescript/api/hooks/usePreview.d.ts +29 -0
- package/lib/typescript/api/hooks/usePreview.d.ts.map +1 -0
- package/lib/typescript/api/hooks/useReservedRegions.d.ts +13 -0
- package/lib/typescript/api/hooks/useReservedRegions.d.ts.map +1 -0
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts +14 -0
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -0
- package/lib/typescript/api/index.d.ts +60 -0
- package/lib/typescript/api/index.d.ts.map +1 -0
- package/lib/typescript/api/layout/Root.d.ts +47 -0
- package/lib/typescript/api/layout/Root.d.ts.map +1 -0
- package/lib/typescript/api/layout/Screen.d.ts +32 -0
- package/lib/typescript/api/layout/Screen.d.ts.map +1 -0
- package/lib/typescript/api/layout/SideMenu.d.ts +33 -0
- package/lib/typescript/api/layout/SideMenu.d.ts.map +1 -0
- package/lib/typescript/api/layout/SplitView.d.ts +48 -0
- package/lib/typescript/api/layout/SplitView.d.ts.map +1 -0
- package/lib/typescript/api/layout/Stack.d.ts +21 -0
- package/lib/typescript/api/layout/Stack.d.ts.map +1 -0
- package/lib/typescript/api/layout/Tabs.d.ts +120 -0
- package/lib/typescript/api/layout/Tabs.d.ts.map +1 -0
- package/lib/typescript/api/layout/element.d.ts +52 -0
- package/lib/typescript/api/layout/element.d.ts.map +1 -0
- package/lib/typescript/api/linking/linkPaths.d.ts +31 -0
- package/lib/typescript/api/linking/linkPaths.d.ts.map +1 -0
- package/lib/typescript/api/linking/linking.d.ts +37 -0
- package/lib/typescript/api/linking/linking.d.ts.map +1 -0
- package/lib/typescript/api/linking/pendingLinks.d.ts +8 -0
- package/lib/typescript/api/linking/pendingLinks.d.ts.map +1 -0
- package/lib/typescript/api/linking/types.d.ts +105 -0
- package/lib/typescript/api/linking/types.d.ts.map +1 -0
- package/lib/typescript/api/navigation.d.ts +115 -0
- package/lib/typescript/api/navigation.d.ts.map +1 -0
- package/lib/typescript/api/options/OptionsChain.d.ts +47 -0
- package/lib/typescript/api/options/OptionsChain.d.ts.map +1 -0
- package/lib/typescript/api/options/ScreenOptions.d.ts +32 -0
- package/lib/typescript/api/options/ScreenOptions.d.ts.map +1 -0
- package/lib/typescript/api/options/buttons.d.ts +35 -0
- package/lib/typescript/api/options/buttons.d.ts.map +1 -0
- package/lib/typescript/api/safeArea/ANNSafeAreaViewNativeComponent.d.ts +20 -0
- package/lib/typescript/api/safeArea/ANNSafeAreaViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/api/safeArea/screenInsets.d.ts +20 -0
- package/lib/typescript/api/safeArea/screenInsets.d.ts.map +1 -0
- package/lib/typescript/api/safeArea/screenRegions.d.ts +24 -0
- package/lib/typescript/api/safeArea/screenRegions.d.ts.map +1 -0
- package/lib/typescript/api/screens/ScreenBoundary.d.ts +34 -0
- package/lib/typescript/api/screens/ScreenBoundary.d.ts.map +1 -0
- package/lib/typescript/api/screens/arrangement.d.ts +70 -0
- package/lib/typescript/api/screens/arrangement.d.ts.map +1 -0
- package/lib/typescript/api/screens/defineScreen.d.ts +41 -0
- package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -0
- package/lib/typescript/api/screens/nativeScreenCalls.d.ts +3 -0
- package/lib/typescript/api/screens/nativeScreenCalls.d.ts.map +1 -0
- package/lib/typescript/api/screens/nativeScreens.d.ts +47 -0
- package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -0
- package/lib/typescript/api/screens/registerScreens.d.ts +61 -0
- package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -0
- package/lib/typescript/api/slots/ANNSlotNativeComponent.d.ts +15 -0
- package/lib/typescript/api/slots/ANNSlotNativeComponent.d.ts.map +1 -0
- package/lib/typescript/api/slots/SlotHost.d.ts +8 -0
- package/lib/typescript/api/slots/SlotHost.d.ts.map +1 -0
- package/lib/typescript/api/state/navigationState.d.ts +26 -0
- package/lib/typescript/api/state/navigationState.d.ts.map +1 -0
- package/lib/typescript/api/testIDs.d.ts +12 -0
- package/lib/typescript/api/testIDs.d.ts.map +1 -0
- package/lib/typescript/api/theme/theme.d.ts +70 -0
- package/lib/typescript/api/theme/theme.d.ts.map +1 -0
- package/lib/typescript/api/types.d.ts +64 -0
- package/lib/typescript/api/types.d.ts.map +1 -0
- package/lib/typescript/engine/backListeners.d.ts +8 -0
- package/lib/typescript/engine/backListeners.d.ts.map +1 -0
- package/lib/typescript/engine/buttons.d.ts +11 -0
- package/lib/typescript/engine/buttons.d.ts.map +1 -0
- package/lib/typescript/engine/commands.d.ts +38 -0
- package/lib/typescript/engine/commands.d.ts.map +1 -0
- package/lib/typescript/engine/events.d.ts +17 -0
- package/lib/typescript/engine/events.d.ts.map +1 -0
- package/lib/typescript/engine/ids.d.ts +3 -0
- package/lib/typescript/engine/ids.d.ts.map +1 -0
- package/lib/typescript/engine/launchState.d.ts +25 -0
- package/lib/typescript/engine/launchState.d.ts.map +1 -0
- package/lib/typescript/engine/layout.d.ts +32 -0
- package/lib/typescript/engine/layout.d.ts.map +1 -0
- package/lib/typescript/engine/mergeOptions.d.ts +6 -0
- package/lib/typescript/engine/mergeOptions.d.ts.map +1 -0
- package/lib/typescript/engine/native.d.ts +22 -0
- package/lib/typescript/engine/native.d.ts.map +1 -0
- package/lib/typescript/engine/nativeScreens.d.ts +49 -0
- package/lib/typescript/engine/nativeScreens.d.ts.map +1 -0
- package/lib/typescript/engine/options.d.ts +12 -0
- package/lib/typescript/engine/options.d.ts.map +1 -0
- package/lib/typescript/engine/places.d.ts +57 -0
- package/lib/typescript/engine/places.d.ts.map +1 -0
- package/lib/typescript/engine/props.d.ts +10 -0
- package/lib/typescript/engine/props.d.ts.map +1 -0
- package/lib/typescript/engine/reactMeasures.d.ts +3 -0
- package/lib/typescript/engine/reactMeasures.d.ts.map +1 -0
- package/lib/typescript/engine/rememberedOptions.d.ts +28 -0
- package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -0
- package/lib/typescript/engine/screens.d.ts +90 -0
- package/lib/typescript/engine/screens.d.ts.map +1 -0
- package/lib/typescript/engine/slots.d.ts +71 -0
- package/lib/typescript/engine/slots.d.ts.map +1 -0
- package/lib/typescript/engine/tabs.d.ts +24 -0
- package/lib/typescript/engine/tabs.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +3 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/interfaces/ComponentEvents.d.ts +189 -0
- package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -0
- package/lib/typescript/interfaces/Events.d.ts +199 -0
- package/lib/typescript/interfaces/Events.d.ts.map +1 -0
- package/lib/typescript/interfaces/Layout.d.ts +150 -0
- package/lib/typescript/interfaces/Layout.d.ts.map +1 -0
- package/lib/typescript/interfaces/Options.d.ts +93 -0
- package/lib/typescript/interfaces/Options.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/animations.d.ts +452 -0
- package/lib/typescript/interfaces/options/animations.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/bottomTabs.d.ts +462 -0
- package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/buttons.d.ts +331 -0
- package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/common.d.ts +51 -0
- package/lib/typescript/interfaces/options/common.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/modals.d.ts +202 -0
- package/lib/typescript/interfaces/options/modals.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/preview.d.ts +40 -0
- package/lib/typescript/interfaces/options/preview.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/sideMenu.d.ts +130 -0
- package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/splitView.d.ts +118 -0
- package/lib/typescript/interfaces/options/splitView.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/stack.d.ts +109 -0
- package/lib/typescript/interfaces/options/stack.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/system.d.ts +238 -0
- package/lib/typescript/interfaces/options/system.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/toolbar.d.ts +45 -0
- package/lib/typescript/interfaces/options/toolbar.d.ts.map +1 -0
- package/lib/typescript/interfaces/options/topBar.d.ts +804 -0
- package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/package.json +189 -4
- package/react-native.config.js +22 -0
- package/src/ARCHITECTURE.md +289 -0
- package/src/adapters/NativeANNTurboEventEmitter.ts +15 -0
- package/src/adapters/NativeANNTurboModule.ts +100 -0
- package/src/api/app/AppRegistry.ts +57 -0
- package/src/api/app/activeApp.ts +20 -0
- package/src/api/app/createNavigation.ts +566 -0
- package/src/api/app/roots.ts +40 -0
- package/src/api/app/splash.ts +154 -0
- package/src/api/app/startFailure.tsx +39 -0
- package/src/api/arrangement/arrangementState.ts +98 -0
- package/src/api/commands/commands.ts +371 -0
- package/src/api/commands/errors.ts +99 -0
- package/src/api/commands/presentation.ts +78 -0
- package/src/api/commands/sideMenus.ts +122 -0
- package/src/api/commands/transitions.ts +133 -0
- package/src/api/context/appContext.ts +23 -0
- package/src/api/events/navigationEvents.ts +175 -0
- package/src/api/events/screenLifecycle.ts +27 -0
- package/src/api/events/tabPresses.ts +35 -0
- package/src/api/hinge/hinge.ts +84 -0
- package/src/api/hooks/appHooks.ts +37 -0
- package/src/api/hooks/screenHooks.ts +272 -0
- package/src/api/hooks/useArrangement.ts +26 -0
- package/src/api/hooks/useHinge.ts +26 -0
- package/src/api/hooks/useNavigation.ts +267 -0
- package/src/api/hooks/usePendingLink.ts +11 -0
- package/src/api/hooks/usePreview.ts +111 -0
- package/src/api/hooks/useReservedRegions.ts +26 -0
- package/src/api/hooks/useSafeAreaInsets.ts +23 -0
- package/src/api/index.ts +139 -0
- package/src/api/layout/Root.ts +113 -0
- package/src/api/layout/Screen.ts +55 -0
- package/src/api/layout/SideMenu.ts +87 -0
- package/src/api/layout/SplitView.ts +146 -0
- package/src/api/layout/Stack.ts +48 -0
- package/src/api/layout/Tabs.ts +339 -0
- package/src/api/layout/element.ts +114 -0
- package/src/api/linking/linkPaths.ts +159 -0
- package/src/api/linking/linking.ts +242 -0
- package/src/api/linking/pendingLinks.ts +37 -0
- package/src/api/linking/types.ts +130 -0
- package/src/api/navigation.ts +269 -0
- package/src/api/options/OptionsChain.ts +142 -0
- package/src/api/options/ScreenOptions.ts +81 -0
- package/src/api/options/buttons.ts +43 -0
- package/src/api/safeArea/ANNSafeAreaViewNativeComponent.ts +28 -0
- package/src/api/safeArea/screenInsets.ts +86 -0
- package/src/api/safeArea/screenRegions.ts +99 -0
- package/src/api/screens/ScreenBoundary.tsx +52 -0
- package/src/api/screens/arrangement.ts +106 -0
- package/src/api/screens/defineScreen.ts +57 -0
- package/src/api/screens/nativeScreenCalls.ts +59 -0
- package/src/api/screens/nativeScreens.ts +58 -0
- package/src/api/screens/registerScreens.tsx +364 -0
- package/src/api/slots/ANNSlotNativeComponent.ts +23 -0
- package/src/api/slots/SlotHost.tsx +64 -0
- package/src/api/state/navigationState.ts +95 -0
- package/src/api/testIDs.ts +11 -0
- package/src/api/theme/theme.ts +184 -0
- package/src/api/types.ts +95 -0
- package/src/engine/backListeners.ts +36 -0
- package/src/engine/buttons.ts +91 -0
- package/src/engine/commands.ts +469 -0
- package/src/engine/events.ts +24 -0
- package/src/engine/ids.ts +7 -0
- package/src/engine/launchState.ts +35 -0
- package/src/engine/layout.ts +247 -0
- package/src/engine/mergeOptions.ts +20 -0
- package/src/engine/native.ts +51 -0
- package/src/engine/nativeScreens.ts +263 -0
- package/src/engine/options.ts +165 -0
- package/src/engine/places.ts +205 -0
- package/src/engine/props.ts +45 -0
- package/src/engine/reactMeasures.ts +24 -0
- package/src/engine/rememberedOptions.ts +111 -0
- package/src/engine/screens.tsx +239 -0
- package/src/engine/slots.ts +191 -0
- package/src/engine/tabs.ts +95 -0
- package/src/index.ts +3 -0
- package/src/interfaces/ComponentEvents.ts +214 -0
- package/src/interfaces/Events.ts +227 -0
- package/src/interfaces/Layout.ts +161 -0
- package/src/interfaces/Options.ts +175 -0
- package/src/interfaces/options/animations.ts +480 -0
- package/src/interfaces/options/bottomTabs.ts +481 -0
- package/src/interfaces/options/buttons.ts +364 -0
- package/src/interfaces/options/common.ts +76 -0
- package/src/interfaces/options/modals.ts +217 -0
- package/src/interfaces/options/preview.ts +40 -0
- package/src/interfaces/options/sideMenu.ts +132 -0
- package/src/interfaces/options/splitView.ts +127 -0
- package/src/interfaces/options/stack.ts +110 -0
- package/src/interfaces/options/system.ts +252 -0
- package/src/interfaces/options/toolbar.ts +47 -0
- package/src/interfaces/options/topBar.ts +828 -0
|
@@ -0,0 +1,1050 @@
|
|
|
1
|
+
# State management
|
|
2
|
+
|
|
3
|
+
Wire Redux Toolkit, Zustand, Jotai, MobX or Valtio into an app whose screens are native: one store for every screen, the first root from it, sign-out and saved state.
|
|
4
|
+
|
|
5
|
+
An app keeps its data in a store: the signed-in user, the cart, the drafts. Here you connect your store to the screens, read and write it from a screen and from code outside React, pick the first root from it, reset it on sign-out, and save it between launches. You end with:
|
|
6
|
+
|
|
7
|
+
- every screen reading and writing the same store, whichever stack, tab or modal it is in;
|
|
8
|
+
- a first screen chosen from the saved state, with no flash of the sign-in screen;
|
|
9
|
+
- a sign-out that switches to the sign-in screen and leaves no data of the old user behind.
|
|
10
|
+
|
|
11
|
+
The first part is what every store shares with this navigation. Then each library has a part of its own, with the same steps in the same order; read only yours:
|
|
12
|
+
|
|
13
|
+
| Your library | Its part |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Redux Toolkit | [Redux Toolkit](#redux) |
|
|
16
|
+
| Zustand | [Zustand](#zustand) |
|
|
17
|
+
| Jotai | [Jotai](#jotai) |
|
|
18
|
+
| MobX | [MobX](#mobx) |
|
|
19
|
+
| Valtio | [Valtio](#valtio) |
|
|
20
|
+
| Not chosen yet | [The libraries side by side](#compare), then [Which to pick](#which) |
|
|
21
|
+
|
|
22
|
+
> **Info**
|
|
23
|
+
>
|
|
24
|
+
>
|
|
25
|
+
> Written against `@reduxjs/toolkit` 2.13 with `react-redux` 9.3 and `redux-persist` 6, `zustand` 5.0, `jotai` 3.0, `mobx` 7.0 with `mobx-react-lite` 5.1, `valtio` 2.3, and `@react-native-async-storage/async-storage` 3.1 for the saved state.
|
|
26
|
+
>
|
|
27
|
+
|
|
28
|
+
## What every store shares here
|
|
29
|
+
|
|
30
|
+
### Each screen is a React root
|
|
31
|
+
|
|
32
|
+
Every name in `screens` is registered with React Native's `AppRegistry`, and the native side starts **a React root of its own** for each screen it shows. A stack of three screens is three React roots; a tab bar with four tabs is four more. See [A root per screen](../architecture/one-tree#root-per-screen).
|
|
33
|
+
|
|
34
|
+
So the usual React setup, one `` around ``, has nothing to wrap: there is no ``. The JavaScript runtime is still one, and that decides how each store connects:
|
|
35
|
+
|
|
36
|
+
| The store is | It reaches every screen |
|
|
37
|
+
| --- | --- |
|
|
38
|
+
| An object in a module (`create(…)`, `proxy(…)`, a MobX class, Jotai's default store) | By itself: every screen imports the same module. |
|
|
39
|
+
| Read through a React provider (Redux's ``) | When `appProvider` or `screenProvider` puts the provider around the screens. |
|
|
40
|
+
|
|
41
|
+
### A store in a module reaches every screen
|
|
42
|
+
|
|
43
|
+
A store created at the top level of a module exists once per JavaScript runtime. Every screen that imports it gets the same object, whatever root it renders in:
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { create } from 'zustand';
|
|
47
|
+
|
|
48
|
+
type Cart = { items: string[]; add: (id: string) => void };
|
|
49
|
+
|
|
50
|
+
export const useCart = create<Cart>()((set) => ({
|
|
51
|
+
items: [],
|
|
52
|
+
add: (id) => set((cart) => ({ items: [...cart.items, id] })),
|
|
53
|
+
}));
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Products adds an item; the Cart screen pushed later shows it. Nothing wraps either screen.
|
|
57
|
+
|
|
58
|
+
A hook of a store subscribes the component that calls it to the store. The subscription doesn't care which React root the component is in: when the store changes, every subscribed component on every mounted screen renders again. That includes the screens under the top one in a stack, the other tabs and the screens under a modal, so **select the narrowest value** a component needs, as you would for a large React tree.
|
|
59
|
+
|
|
60
|
+
### A provider wraps the screens in createNavigation
|
|
61
|
+
|
|
62
|
+
A library that reads its store from a React provider needs the provider around each screen. `createNavigation` has two places for it:
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
import type { ReactNode } from 'react';
|
|
66
|
+
import { Provider } from 'react-redux';
|
|
67
|
+
import { store } from './store';
|
|
68
|
+
|
|
69
|
+
export function StoreProvider({ children }: { children: ReactNode }) {
|
|
70
|
+
return <Provider store={store}>{children}</Provider>;
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
export const Navigation = createNavigation({
|
|
76
|
+
// … screens and root
|
|
77
|
+
screenProvider: StoreProvider, // around each screen
|
|
78
|
+
// or: appProvider: StoreProvider, around all of them once
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
- **`screenProvider`** wraps each screen in its own root. Each screen gets its own ``, all with the one `store` of the module, so they share the data.
|
|
83
|
+
- **`appProvider`** renders every screen in one React tree inside the provider (see [One tree](../architecture/one-tree#one-tree)). Pick it when the app has other providers that share state, such as a query client.
|
|
84
|
+
|
|
85
|
+
> **Warning**
|
|
86
|
+
>
|
|
87
|
+
>
|
|
88
|
+
```tsx
|
|
89
|
+
// Don't
|
|
90
|
+
function StoreProvider({ children }: { children: ReactNode }) {
|
|
91
|
+
const [store] = useState(() => configureStore({ reducer }));
|
|
92
|
+
return <Provider store={store}>{children}</Provider>;
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
>
|
|
96
|
+
> As a `screenProvider`, this renders once for every shown screen, so each screen gets a store of its own: the cart filled on Products is empty on Cart. Create the store at the top level of a module and pass it in, as above.
|
|
97
|
+
>
|
|
98
|
+
|
|
99
|
+
### Reading and writing outside React
|
|
100
|
+
|
|
101
|
+
Much of an app's state changes outside components: the start of the app, a deep link, a notification, a listener of the navigation. Every library below has a way to read and write its store without a hook; each part shows it. These are the places:
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
export const Navigation = createNavigation({
|
|
105
|
+
// … screens and roots
|
|
106
|
+
willMount: async () => {
|
|
107
|
+
// before the first root, while the splash screen shows
|
|
108
|
+
},
|
|
109
|
+
linking: {
|
|
110
|
+
prefixes: ['myapp://'],
|
|
111
|
+
routes: {
|
|
112
|
+
// a route of a link: any code, then commands
|
|
113
|
+
'cart/add/:productId': ({ productId }) => {},
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
listeners: {
|
|
117
|
+
// every screen that appears, for as long as the app runs
|
|
118
|
+
screenDidAppear: ({ screen }) => {},
|
|
119
|
+
},
|
|
120
|
+
didMount: () => {
|
|
121
|
+
// your notification library
|
|
122
|
+
onNotificationOpened((notification) => {});
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
`willMount` and `didMount` run once per JavaScript runtime, so a subscription made there is made once. See [Deep links](./deep-links#routes) and [Notifications that open a screen](./notifications#running).
|
|
128
|
+
|
|
129
|
+
### The first root from the store
|
|
130
|
+
|
|
131
|
+
`root` and `initialRoot` can be functions. The navigation calls them **after `willMount` resolves**, so they read the store as the start left it:
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
export const Navigation = createNavigation({
|
|
135
|
+
screens: { Login, Home, Settings },
|
|
136
|
+
roots: {
|
|
137
|
+
login: Stack('Login'),
|
|
138
|
+
main: Tabs(Tab('Home'), Tab('Settings')),
|
|
139
|
+
},
|
|
140
|
+
willMount: async () => {
|
|
141
|
+
// load the saved state, or the user, into the store
|
|
142
|
+
},
|
|
143
|
+
initialRoot: () => (readUser() ? 'main' : 'login'),
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
The splash screen stays until `willMount` resolves, then Home or Login shows; no screen flashes in between. `readUser()` here stands for your store's read outside React. The functions get the app's context as their argument; with a store they don't need it.
|
|
148
|
+
|
|
149
|
+
### Signing in and out
|
|
150
|
+
|
|
151
|
+
Signed in and signed out are two roots, and `navigation.switchTo` replaces the whole window with one of them (see [Switching roots](../fundamentals/switching-roots#switch)). The screens of the old root go, and their React roots unmount with them; the store stays, because it lives in the JavaScript runtime, not in a screen.
|
|
152
|
+
|
|
153
|
+
So a sign-out does two things: it switches to the sign-in root, and it resets the store, so the next user doesn't see the data of the last one. Switch first, then reset:
|
|
154
|
+
|
|
155
|
+
```ts
|
|
156
|
+
export async function signOut() {
|
|
157
|
+
await navigation.switchTo('login');
|
|
158
|
+
resetStore(); // your store's reset
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Reset first, and the signed-in screens, still on display for the switch, render once more with an empty store.
|
|
163
|
+
|
|
164
|
+
### Saving the state between launches
|
|
165
|
+
|
|
166
|
+
A store lives in the JavaScript runtime: it is empty again after a JavaScript reload and on a new start of the app. On Android, when the activity is recreated while the JavaScript keeps running, the screens come back with the store as it was, and `willMount` doesn't run again.
|
|
167
|
+
|
|
168
|
+
To keep a part of the store between launches, the libraries save it to a storage and read it back. Read it back **in `willMount`**: the first root waits for it, so the first screen renders with the saved state, and `initialRoot` can pick the root from it. A store that loads itself in the background would show the sign-in screen for a moment to a signed-in user.
|
|
169
|
+
|
|
170
|
+
Save little: the session, the settings, a draft. Keep tokens and other secrets in the keychain or a secure storage, not in the saved store.
|
|
171
|
+
|
|
172
|
+
### The store and the app's context
|
|
173
|
+
|
|
174
|
+
The navigation has a small store of its own, the [app's context](./app-context): a value every screen, the options of the screens and the start of the app read. With a store of your own you don't need it. The one case where it helps: **links that wait for the sign-in**. `when` of `linking` reads the context, and a waiting link runs by itself when the context lets it. Mirror one flag into it when you use that:
|
|
175
|
+
|
|
176
|
+
```ts
|
|
177
|
+
navigation.setContext((c) => ({ ...c, signedIn: true }));
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
See [Without the context](./app-context#without) for the full comparison.
|
|
181
|
+
|
|
182
|
+
## Redux Toolkit
|
|
183
|
+
|
|
184
|
+
Redux keeps the whole state in one store, and `react-redux` reads it through a ``. The provider goes around the screens in `createNavigation`; the store goes in a module. The shared part of this page is [above](#shared).
|
|
185
|
+
|
|
186
|
+
### Install
|
|
187
|
+
|
|
188
|
+
### Create the store
|
|
189
|
+
|
|
190
|
+
The session slice keeps the user. `signedOut` is one action that every slice resets on:
|
|
191
|
+
|
|
192
|
+
```ts
|
|
193
|
+
import { createAction, createSlice } from '@reduxjs/toolkit';
|
|
194
|
+
import type { PayloadAction } from '@reduxjs/toolkit';
|
|
195
|
+
|
|
196
|
+
export type User = { id: string; name: string };
|
|
197
|
+
|
|
198
|
+
export const signedOut = createAction('signedOut');
|
|
199
|
+
|
|
200
|
+
const session = createSlice({
|
|
201
|
+
name: 'session',
|
|
202
|
+
initialState: { user: null as User | null },
|
|
203
|
+
reducers: {
|
|
204
|
+
signedIn(state, action: PayloadAction<User>) {
|
|
205
|
+
state.user = action.payload;
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
extraReducers: (builder) => {
|
|
209
|
+
builder.addCase(signedOut, () => ({ user: null }));
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
export const { signedIn } = session.actions;
|
|
214
|
+
export default session.reducer;
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
```ts
|
|
218
|
+
import { createSlice } from '@reduxjs/toolkit';
|
|
219
|
+
import type { PayloadAction } from '@reduxjs/toolkit';
|
|
220
|
+
import { signedOut } from './session';
|
|
221
|
+
|
|
222
|
+
const cart = createSlice({
|
|
223
|
+
name: 'cart',
|
|
224
|
+
initialState: { items: [] as string[] },
|
|
225
|
+
reducers: {
|
|
226
|
+
added(state, action: PayloadAction<string>) {
|
|
227
|
+
state.items.push(action.payload);
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
extraReducers: (builder) => {
|
|
231
|
+
builder.addCase(signedOut, () => ({ items: [] }));
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
export const { added } = cart.actions;
|
|
236
|
+
export default cart.reducer;
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
```ts
|
|
240
|
+
import { configureStore } from '@reduxjs/toolkit';
|
|
241
|
+
import { useDispatch, useSelector } from 'react-redux';
|
|
242
|
+
import session from './session';
|
|
243
|
+
import cart from './cart';
|
|
244
|
+
|
|
245
|
+
export const store = configureStore({
|
|
246
|
+
reducer: { session, cart },
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
export type RootState = ReturnType<typeof store.getState>;
|
|
250
|
+
export type AppDispatch = typeof store.dispatch;
|
|
251
|
+
export const useAppSelector = useSelector.withTypes<RootState>();
|
|
252
|
+
export const useAppDispatch = useDispatch.withTypes<AppDispatch>();
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Connect it to the screens
|
|
256
|
+
|
|
257
|
+
`useSelector` reads the store from ``, so the provider wraps every screen. Without it, a screen fails with "could not find react-redux context value".
|
|
258
|
+
|
|
259
|
+
```tsx
|
|
260
|
+
import type { ReactNode } from 'react';
|
|
261
|
+
import { Provider } from 'react-redux';
|
|
262
|
+
import { store } from './store';
|
|
263
|
+
|
|
264
|
+
export function StoreProvider({ children }: { children: ReactNode }) {
|
|
265
|
+
return <Provider store={store}>{children}</Provider>;
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
```ts
|
|
270
|
+
import { createNavigation } from '@apexnative/navigation';
|
|
271
|
+
import { StoreProvider } from './src/StoreProvider';
|
|
272
|
+
|
|
273
|
+
export const Navigation = createNavigation({
|
|
274
|
+
screens: { Products, Cart },
|
|
275
|
+
root: 'Products',
|
|
276
|
+
screenProvider: StoreProvider,
|
|
277
|
+
});
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Each screen has a `` of its own around one `store`, so they share every slice. `appProvider: StoreProvider` works the same way, with every screen in one tree (see [Providers](#providers)). Never create the store inside the provider.
|
|
281
|
+
|
|
282
|
+
### Read and write in a screen
|
|
283
|
+
|
|
284
|
+
```tsx
|
|
285
|
+
import { Button } from 'react-native';
|
|
286
|
+
import { useAppDispatch, useAppSelector } from '../store';
|
|
287
|
+
import { added } from '../store/cart';
|
|
288
|
+
|
|
289
|
+
export function Products() {
|
|
290
|
+
const count = useAppSelector((s) => s.cart.items.length);
|
|
291
|
+
const dispatch = useAppDispatch();
|
|
292
|
+
return (
|
|
293
|
+
<Button
|
|
294
|
+
title={`Add to cart (${count})`}
|
|
295
|
+
onPress={() => dispatch(added('42'))}
|
|
296
|
+
/>
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
Each press adds an item, and every screen that selects `s.cart.items` shows it, the Cart tab included.
|
|
302
|
+
|
|
303
|
+
### Outside React
|
|
304
|
+
|
|
305
|
+
The store has `getState`, `dispatch` and `subscribe`; import it anywhere:
|
|
306
|
+
|
|
307
|
+
```ts
|
|
308
|
+
import { navigation } from '@apexnative/navigation';
|
|
309
|
+
import { store } from './src/store';
|
|
310
|
+
import { added } from './src/store/cart';
|
|
311
|
+
import { signedIn } from './src/store/session';
|
|
312
|
+
|
|
313
|
+
export const Navigation = createNavigation({
|
|
314
|
+
// …
|
|
315
|
+
willMount: async () => {
|
|
316
|
+
const user = await loadUser(); // your own request
|
|
317
|
+
if (user) store.dispatch(signedIn(user));
|
|
318
|
+
},
|
|
319
|
+
linking: {
|
|
320
|
+
prefixes: ['myapp://'],
|
|
321
|
+
routes: {
|
|
322
|
+
'cart/add/:productId': ({ productId }) => {
|
|
323
|
+
store.dispatch(added(productId));
|
|
324
|
+
navigation.push('Cart');
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
});
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
`myapp://cart/add/42` adds the item and opens the cart.
|
|
332
|
+
|
|
333
|
+
### The first root and sign-out
|
|
334
|
+
|
|
335
|
+
```ts
|
|
336
|
+
export const Navigation = createNavigation({
|
|
337
|
+
screens: { Login, Products, Cart },
|
|
338
|
+
roots: {
|
|
339
|
+
login: Stack('Login'),
|
|
340
|
+
main: Tabs(Tab('Products'), Tab('Cart')),
|
|
341
|
+
},
|
|
342
|
+
screenProvider: StoreProvider,
|
|
343
|
+
willMount: async () => {
|
|
344
|
+
const user = await loadUser(); // your own request
|
|
345
|
+
if (user) store.dispatch(signedIn(user));
|
|
346
|
+
},
|
|
347
|
+
initialRoot: () =>
|
|
348
|
+
store.getState().session.user ? 'main' : 'login',
|
|
349
|
+
});
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
```ts
|
|
353
|
+
import { navigation } from '@apexnative/navigation';
|
|
354
|
+
import { store } from './store';
|
|
355
|
+
import { signedIn, signedOut } from './store/session';
|
|
356
|
+
import type { User } from './store/session';
|
|
357
|
+
|
|
358
|
+
export async function signIn(user: User) {
|
|
359
|
+
store.dispatch(signedIn(user));
|
|
360
|
+
await navigation.switchTo('main');
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
export async function signOut() {
|
|
364
|
+
await navigation.switchTo('login');
|
|
365
|
+
store.dispatch(signedOut());
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
One `signedOut` empties the session and the cart. See [Signing in and out](#sign-in-out) for why the reset comes after the switch.
|
|
370
|
+
|
|
371
|
+
### Save the state
|
|
372
|
+
|
|
373
|
+
`persistReducer` saves the slices on its list; `persistStore` reads them back. Call `persistStore` in `willMount`, and resolve when it is done:
|
|
374
|
+
|
|
375
|
+
```ts
|
|
376
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
377
|
+
import { combineReducers, configureStore } from '@reduxjs/toolkit';
|
|
378
|
+
import {
|
|
379
|
+
FLUSH,
|
|
380
|
+
PAUSE,
|
|
381
|
+
PERSIST,
|
|
382
|
+
persistReducer,
|
|
383
|
+
PURGE,
|
|
384
|
+
REGISTER,
|
|
385
|
+
REHYDRATE,
|
|
386
|
+
} from 'redux-persist';
|
|
387
|
+
import session from './session';
|
|
388
|
+
import cart from './cart';
|
|
389
|
+
|
|
390
|
+
const reducer = persistReducer(
|
|
391
|
+
{ key: 'root', storage: AsyncStorage, whitelist: ['session'] },
|
|
392
|
+
combineReducers({ session, cart }),
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
export const store = configureStore({
|
|
396
|
+
reducer,
|
|
397
|
+
middleware: (getDefault) =>
|
|
398
|
+
getDefault({
|
|
399
|
+
serializableCheck: {
|
|
400
|
+
ignoredActions: [
|
|
401
|
+
FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER,
|
|
402
|
+
],
|
|
403
|
+
},
|
|
404
|
+
}),
|
|
405
|
+
});
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
```ts
|
|
409
|
+
import { persistStore } from 'redux-persist';
|
|
410
|
+
|
|
411
|
+
export const Navigation = createNavigation({
|
|
412
|
+
// …
|
|
413
|
+
willMount: () =>
|
|
414
|
+
new Promise<void>((resolve) => {
|
|
415
|
+
persistStore(store, null, resolve);
|
|
416
|
+
}),
|
|
417
|
+
initialRoot: () =>
|
|
418
|
+
store.getState().session.user ? 'main' : 'login',
|
|
419
|
+
});
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
The splash screen stays until the saved session is back, and a signed-in user starts on `main`. `PersistGate` isn't needed: `willMount` already holds the first screen. A sign-out's `signedOut` saves the empty session too.
|
|
423
|
+
|
|
424
|
+
## Zustand
|
|
425
|
+
|
|
426
|
+
A Zustand store is a hook made in a module, with no provider. Every screen imports it and reads the same store. The shared part of this page is [above](#shared).
|
|
427
|
+
|
|
428
|
+
### Install
|
|
429
|
+
|
|
430
|
+
### Create the store
|
|
431
|
+
|
|
432
|
+
```ts
|
|
433
|
+
import { create } from 'zustand';
|
|
434
|
+
|
|
435
|
+
export type User = { id: string; name: string };
|
|
436
|
+
|
|
437
|
+
type Session = {
|
|
438
|
+
user: User | null;
|
|
439
|
+
signIn: (user: User) => void;
|
|
440
|
+
signOut: () => void;
|
|
441
|
+
};
|
|
442
|
+
|
|
443
|
+
export const useSession = create<Session>()((set) => ({
|
|
444
|
+
user: null,
|
|
445
|
+
signIn: (user) => set({ user }),
|
|
446
|
+
signOut: () => set({ user: null }),
|
|
447
|
+
}));
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
```ts
|
|
451
|
+
import { create } from 'zustand';
|
|
452
|
+
|
|
453
|
+
type Cart = {
|
|
454
|
+
items: string[];
|
|
455
|
+
add: (id: string) => void;
|
|
456
|
+
clear: () => void;
|
|
457
|
+
};
|
|
458
|
+
|
|
459
|
+
export const useCart = create<Cart>()((set) => ({
|
|
460
|
+
items: [],
|
|
461
|
+
add: (id) => set((cart) => ({ items: [...cart.items, id] })),
|
|
462
|
+
clear: () => set({ items: [] }),
|
|
463
|
+
}));
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Connect it to the screens
|
|
467
|
+
|
|
468
|
+
Nothing to connect. The store exists once in the JavaScript runtime, and each screen's root reads it:
|
|
469
|
+
|
|
470
|
+
```ts
|
|
471
|
+
import { createNavigation } from '@apexnative/navigation';
|
|
472
|
+
|
|
473
|
+
export const Navigation = createNavigation({
|
|
474
|
+
screens: { Products, Cart },
|
|
475
|
+
root: 'Products',
|
|
476
|
+
});
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### Read and write in a screen
|
|
480
|
+
|
|
481
|
+
```tsx
|
|
482
|
+
import { Button } from 'react-native';
|
|
483
|
+
import { useCart } from '../store/cart';
|
|
484
|
+
|
|
485
|
+
export function Products() {
|
|
486
|
+
const count = useCart((cart) => cart.items.length);
|
|
487
|
+
const add = useCart((cart) => cart.add);
|
|
488
|
+
return (
|
|
489
|
+
<Button
|
|
490
|
+
title={`Add to cart (${count})`}
|
|
491
|
+
onPress={() => add('42')}
|
|
492
|
+
/>
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
Each press adds an item; the Cart tab shows it. A selector that returns a new object or array each time, `(cart) => ({ items, add })`, makes React render without end: select one value per call, or wrap the selector in `useShallow` from `zustand/react/shallow`.
|
|
498
|
+
|
|
499
|
+
### Outside React
|
|
500
|
+
|
|
501
|
+
The hook is also the store: `useCart.getState()`, `useCart.setState()`, `useCart.subscribe()`.
|
|
502
|
+
|
|
503
|
+
```ts
|
|
504
|
+
import { navigation } from '@apexnative/navigation';
|
|
505
|
+
import { useCart } from './src/store/cart';
|
|
506
|
+
import { useSession } from './src/store/session';
|
|
507
|
+
|
|
508
|
+
export const Navigation = createNavigation({
|
|
509
|
+
// …
|
|
510
|
+
willMount: async () => {
|
|
511
|
+
const user = await loadUser(); // your own request
|
|
512
|
+
if (user) useSession.getState().signIn(user);
|
|
513
|
+
},
|
|
514
|
+
linking: {
|
|
515
|
+
prefixes: ['myapp://'],
|
|
516
|
+
routes: {
|
|
517
|
+
'cart/add/:productId': ({ productId }) => {
|
|
518
|
+
useCart.getState().add(productId);
|
|
519
|
+
navigation.push('Cart');
|
|
520
|
+
},
|
|
521
|
+
},
|
|
522
|
+
},
|
|
523
|
+
});
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
### The first root and sign-out
|
|
527
|
+
|
|
528
|
+
```ts
|
|
529
|
+
export const Navigation = createNavigation({
|
|
530
|
+
screens: { Login, Products, Cart },
|
|
531
|
+
roots: {
|
|
532
|
+
login: Stack('Login'),
|
|
533
|
+
main: Tabs(Tab('Products'), Tab('Cart')),
|
|
534
|
+
},
|
|
535
|
+
willMount: async () => {
|
|
536
|
+
const user = await loadUser(); // your own request
|
|
537
|
+
if (user) useSession.getState().signIn(user);
|
|
538
|
+
},
|
|
539
|
+
initialRoot: () =>
|
|
540
|
+
useSession.getState().user ? 'main' : 'login',
|
|
541
|
+
});
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
```ts
|
|
545
|
+
import { navigation } from '@apexnative/navigation';
|
|
546
|
+
import { useCart } from './store/cart';
|
|
547
|
+
import { useSession } from './store/session';
|
|
548
|
+
import type { User } from './store/session';
|
|
549
|
+
|
|
550
|
+
export async function signIn(user: User) {
|
|
551
|
+
useSession.getState().signIn(user);
|
|
552
|
+
await navigation.switchTo('main');
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
export async function signOut() {
|
|
556
|
+
await navigation.switchTo('login');
|
|
557
|
+
useSession.getState().signOut();
|
|
558
|
+
useCart.getState().clear();
|
|
559
|
+
}
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
When the session can end anywhere, such as a request that gets "401" from the server, call the same `signOut()` from there. It is a plain function, so your API client imports it like any module:
|
|
563
|
+
|
|
564
|
+
```ts
|
|
565
|
+
import { signOut } from './session';
|
|
566
|
+
|
|
567
|
+
export async function request(path: string) {
|
|
568
|
+
const response = await fetch(`https://api.example.com${path}`);
|
|
569
|
+
if (response.status === 401) await signOut();
|
|
570
|
+
return response;
|
|
571
|
+
}
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
### Save the state
|
|
575
|
+
|
|
576
|
+
The `persist` middleware saves the store. `skipHydration` keeps it from loading by itself when the module is imported; `willMount` loads it, so the first root reads it:
|
|
577
|
+
|
|
578
|
+
```ts
|
|
579
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
580
|
+
import { create } from 'zustand';
|
|
581
|
+
import { createJSONStorage, persist } from 'zustand/middleware';
|
|
582
|
+
|
|
583
|
+
export const useSession = create<Session>()(
|
|
584
|
+
persist(
|
|
585
|
+
(set) => ({
|
|
586
|
+
user: null,
|
|
587
|
+
signIn: (user) => set({ user }),
|
|
588
|
+
signOut: () => set({ user: null }),
|
|
589
|
+
}),
|
|
590
|
+
{
|
|
591
|
+
name: 'session',
|
|
592
|
+
storage: createJSONStorage(() => AsyncStorage),
|
|
593
|
+
skipHydration: true,
|
|
594
|
+
},
|
|
595
|
+
),
|
|
596
|
+
);
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
```ts
|
|
600
|
+
willMount: async () => {
|
|
601
|
+
await useSession.persist.rehydrate();
|
|
602
|
+
},
|
|
603
|
+
initialRoot: () =>
|
|
604
|
+
useSession.getState().user ? 'main' : 'login',
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
A signed-in user starts on `main` with the saved user. `signOut()` saves the empty session.
|
|
608
|
+
|
|
609
|
+
## Jotai
|
|
610
|
+
|
|
611
|
+
Jotai keeps state in atoms, and the atoms' values in a store. Without a ``, every hook uses Jotai's default store, which exists once in the JavaScript runtime, so **every screen shares it with no provider**. The shared part of this page is [above](#shared).
|
|
612
|
+
|
|
613
|
+
### Install
|
|
614
|
+
|
|
615
|
+
### Create the store
|
|
616
|
+
|
|
617
|
+
```ts
|
|
618
|
+
import { atom, getDefaultStore } from 'jotai';
|
|
619
|
+
|
|
620
|
+
export type User = { id: string; name: string };
|
|
621
|
+
|
|
622
|
+
export const userAtom = atom<User | null>(null);
|
|
623
|
+
export const cartAtom = atom<string[]>([]);
|
|
624
|
+
|
|
625
|
+
// the store the hooks use when no Provider wraps them
|
|
626
|
+
export const store = getDefaultStore();
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
### Connect it to the screens
|
|
630
|
+
|
|
631
|
+
Nothing to connect: leave out ``.
|
|
632
|
+
|
|
633
|
+
```ts
|
|
634
|
+
export const Navigation = createNavigation({
|
|
635
|
+
screens: { Products, Cart },
|
|
636
|
+
root: 'Products',
|
|
637
|
+
});
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
A `` without a `store` creates a store of its own. As a `screenProvider` it would give each screen a separate store, and the screens would share nothing. When you need a provider, such as for tests, create the store once with `createStore()` in a module, and pass it: ``.
|
|
641
|
+
|
|
642
|
+
### Read and write in a screen
|
|
643
|
+
|
|
644
|
+
```tsx
|
|
645
|
+
import { Button } from 'react-native';
|
|
646
|
+
import { useAtomValue, useSetAtom } from 'jotai';
|
|
647
|
+
import { cartAtom } from '../store';
|
|
648
|
+
|
|
649
|
+
export function Products() {
|
|
650
|
+
const count = useAtomValue(cartAtom).length;
|
|
651
|
+
const setCart = useSetAtom(cartAtom);
|
|
652
|
+
return (
|
|
653
|
+
<Button
|
|
654
|
+
title={`Add to cart (${count})`}
|
|
655
|
+
onPress={() => setCart((items) => [...items, '42'])}
|
|
656
|
+
/>
|
|
657
|
+
);
|
|
658
|
+
}
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
### Outside React
|
|
662
|
+
|
|
663
|
+
The store reads, writes and subscribes to any atom: `store.get(atom)`, `store.set(atom, value)`, `store.sub(atom, listener)`.
|
|
664
|
+
|
|
665
|
+
```ts
|
|
666
|
+
import { navigation } from '@apexnative/navigation';
|
|
667
|
+
import { cartAtom, store, userAtom } from './src/store';
|
|
668
|
+
|
|
669
|
+
export const Navigation = createNavigation({
|
|
670
|
+
// …
|
|
671
|
+
willMount: async () => {
|
|
672
|
+
const user = await loadUser(); // your own request
|
|
673
|
+
store.set(userAtom, user);
|
|
674
|
+
},
|
|
675
|
+
linking: {
|
|
676
|
+
prefixes: ['myapp://'],
|
|
677
|
+
routes: {
|
|
678
|
+
'cart/add/:productId': ({ productId }) => {
|
|
679
|
+
store.set(cartAtom, (items) => [...items, productId]);
|
|
680
|
+
navigation.push('Cart');
|
|
681
|
+
},
|
|
682
|
+
},
|
|
683
|
+
},
|
|
684
|
+
});
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
### The first root and sign-out
|
|
688
|
+
|
|
689
|
+
```ts
|
|
690
|
+
export const Navigation = createNavigation({
|
|
691
|
+
screens: { Login, Products, Cart },
|
|
692
|
+
roots: {
|
|
693
|
+
login: Stack('Login'),
|
|
694
|
+
main: Tabs(Tab('Products'), Tab('Cart')),
|
|
695
|
+
},
|
|
696
|
+
willMount: async () => {
|
|
697
|
+
store.set(userAtom, await loadUser()); // your own request
|
|
698
|
+
},
|
|
699
|
+
initialRoot: () => (store.get(userAtom) ? 'main' : 'login'),
|
|
700
|
+
});
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
```ts
|
|
704
|
+
import { navigation } from '@apexnative/navigation';
|
|
705
|
+
import { cartAtom, store, userAtom } from './store';
|
|
706
|
+
import type { User } from './store';
|
|
707
|
+
|
|
708
|
+
export async function signIn(user: User) {
|
|
709
|
+
store.set(userAtom, user);
|
|
710
|
+
await navigation.switchTo('main');
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
export async function signOut() {
|
|
714
|
+
await navigation.switchTo('login');
|
|
715
|
+
store.set(userAtom, null);
|
|
716
|
+
store.set(cartAtom, []);
|
|
717
|
+
}
|
|
718
|
+
```
|
|
719
|
+
|
|
720
|
+
### Save the state
|
|
721
|
+
|
|
722
|
+
Read the saved value into the atom in `willMount`, and save it on each change from then on:
|
|
723
|
+
|
|
724
|
+
```ts
|
|
725
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
726
|
+
|
|
727
|
+
willMount: async () => {
|
|
728
|
+
const saved = await AsyncStorage.getItem('user');
|
|
729
|
+
store.set(userAtom, saved ? JSON.parse(saved) : null);
|
|
730
|
+
store.sub(userAtom, () => {
|
|
731
|
+
const user = store.get(userAtom);
|
|
732
|
+
AsyncStorage.setItem('user', JSON.stringify(user));
|
|
733
|
+
});
|
|
734
|
+
},
|
|
735
|
+
initialRoot: () => (store.get(userAtom) ? 'main' : 'login'),
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
`atomWithStorage` from `jotai/utils` saves an atom too, but with an asynchronous storage it starts from its initial value and loads the saved one on its own: the first root wouldn't see it. Load it in `willMount` as above when the first screen depends on it.
|
|
739
|
+
|
|
740
|
+
## MobX
|
|
741
|
+
|
|
742
|
+
A MobX store is an observable object, usually a class, created once in a module. `observer` components render again when what they read changes. `mobx-react-lite` has no provider; every screen imports the store. The shared part of this page is [above](#shared).
|
|
743
|
+
|
|
744
|
+
### Install
|
|
745
|
+
|
|
746
|
+
### Create the store
|
|
747
|
+
|
|
748
|
+
```ts
|
|
749
|
+
import { makeAutoObservable } from 'mobx';
|
|
750
|
+
|
|
751
|
+
export type User = { id: string; name: string };
|
|
752
|
+
|
|
753
|
+
class Session {
|
|
754
|
+
user: User | null = null;
|
|
755
|
+
constructor() {
|
|
756
|
+
makeAutoObservable(this);
|
|
757
|
+
}
|
|
758
|
+
signIn(user: User) {
|
|
759
|
+
this.user = user;
|
|
760
|
+
}
|
|
761
|
+
signOut() {
|
|
762
|
+
this.user = null;
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
class Cart {
|
|
767
|
+
items: string[] = [];
|
|
768
|
+
constructor() {
|
|
769
|
+
makeAutoObservable(this);
|
|
770
|
+
}
|
|
771
|
+
add(id: string) {
|
|
772
|
+
this.items.push(id);
|
|
773
|
+
}
|
|
774
|
+
clear() {
|
|
775
|
+
this.items = [];
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
export const session = new Session();
|
|
780
|
+
export const cart = new Cart();
|
|
781
|
+
```
|
|
782
|
+
|
|
783
|
+
`makeAutoObservable` makes the fields observable and the methods actions.
|
|
784
|
+
|
|
785
|
+
### Connect it to the screens
|
|
786
|
+
|
|
787
|
+
Nothing to connect: the screens import `session` and `cart`.
|
|
788
|
+
|
|
789
|
+
```ts
|
|
790
|
+
export const Navigation = createNavigation({
|
|
791
|
+
screens: { Products, Cart },
|
|
792
|
+
root: 'Products',
|
|
793
|
+
});
|
|
794
|
+
```
|
|
795
|
+
|
|
796
|
+
### Read and write in a screen
|
|
797
|
+
|
|
798
|
+
Wrap the component in `observer`; it renders again when a value it read changes:
|
|
799
|
+
|
|
800
|
+
```tsx
|
|
801
|
+
import { Button } from 'react-native';
|
|
802
|
+
import { observer } from 'mobx-react-lite';
|
|
803
|
+
import { cart } from '../store';
|
|
804
|
+
|
|
805
|
+
export const Products = observer(function Products() {
|
|
806
|
+
return (
|
|
807
|
+
<Button
|
|
808
|
+
title={`Add to cart (${cart.items.length})`}
|
|
809
|
+
onPress={() => cart.add('42')}
|
|
810
|
+
/>
|
|
811
|
+
);
|
|
812
|
+
});
|
|
813
|
+
```
|
|
814
|
+
|
|
815
|
+
`defineScreen({ component: Products })` and the options of the screen take the `observer` component as they take any other.
|
|
816
|
+
|
|
817
|
+
### Outside React
|
|
818
|
+
|
|
819
|
+
Read and call the store anywhere. `reaction` runs code when a value changes:
|
|
820
|
+
|
|
821
|
+
```ts
|
|
822
|
+
import { navigation } from '@apexnative/navigation';
|
|
823
|
+
import { cart, session } from './src/store';
|
|
824
|
+
|
|
825
|
+
export const Navigation = createNavigation({
|
|
826
|
+
// …
|
|
827
|
+
willMount: async () => {
|
|
828
|
+
const user = await loadUser(); // your own request
|
|
829
|
+
if (user) session.signIn(user);
|
|
830
|
+
},
|
|
831
|
+
linking: {
|
|
832
|
+
prefixes: ['myapp://'],
|
|
833
|
+
routes: {
|
|
834
|
+
'cart/add/:productId': ({ productId }) => {
|
|
835
|
+
cart.add(productId);
|
|
836
|
+
navigation.push('Cart');
|
|
837
|
+
},
|
|
838
|
+
},
|
|
839
|
+
},
|
|
840
|
+
});
|
|
841
|
+
```
|
|
842
|
+
|
|
843
|
+
### The first root and sign-out
|
|
844
|
+
|
|
845
|
+
```ts
|
|
846
|
+
export const Navigation = createNavigation({
|
|
847
|
+
screens: { Login, Products, Cart },
|
|
848
|
+
roots: {
|
|
849
|
+
login: Stack('Login'),
|
|
850
|
+
main: Tabs(Tab('Products'), Tab('Cart')),
|
|
851
|
+
},
|
|
852
|
+
willMount: async () => {
|
|
853
|
+
const user = await loadUser(); // your own request
|
|
854
|
+
if (user) session.signIn(user);
|
|
855
|
+
},
|
|
856
|
+
initialRoot: () => (session.user ? 'main' : 'login'),
|
|
857
|
+
});
|
|
858
|
+
```
|
|
859
|
+
|
|
860
|
+
```ts
|
|
861
|
+
import { navigation } from '@apexnative/navigation';
|
|
862
|
+
import { cart, session } from './store';
|
|
863
|
+
import type { User } from './store';
|
|
864
|
+
|
|
865
|
+
export async function signIn(user: User) {
|
|
866
|
+
session.signIn(user);
|
|
867
|
+
await navigation.switchTo('main');
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
export async function signOut() {
|
|
871
|
+
await navigation.switchTo('login');
|
|
872
|
+
session.signOut();
|
|
873
|
+
cart.clear();
|
|
874
|
+
}
|
|
875
|
+
```
|
|
876
|
+
|
|
877
|
+
### Save the state
|
|
878
|
+
|
|
879
|
+
Read the saved user in `willMount`, then save it with a `reaction` on each change:
|
|
880
|
+
|
|
881
|
+
```ts
|
|
882
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
883
|
+
import { reaction } from 'mobx';
|
|
884
|
+
|
|
885
|
+
willMount: async () => {
|
|
886
|
+
const saved = await AsyncStorage.getItem('user');
|
|
887
|
+
if (saved) session.signIn(JSON.parse(saved));
|
|
888
|
+
reaction(
|
|
889
|
+
() => session.user,
|
|
890
|
+
(user) => AsyncStorage.setItem('user', JSON.stringify(user)),
|
|
891
|
+
);
|
|
892
|
+
},
|
|
893
|
+
initialRoot: () => (session.user ? 'main' : 'login'),
|
|
894
|
+
```
|
|
895
|
+
|
|
896
|
+
## Valtio
|
|
897
|
+
|
|
898
|
+
A Valtio store is a proxy object made in a module. Code changes it as a plain object; components read a snapshot of it with `useSnapshot`, and render again when what they read changes. No provider. The shared part of this page is [above](#shared).
|
|
899
|
+
|
|
900
|
+
### Install
|
|
901
|
+
|
|
902
|
+
### Create the store
|
|
903
|
+
|
|
904
|
+
```ts
|
|
905
|
+
import { proxy } from 'valtio';
|
|
906
|
+
|
|
907
|
+
export type User = { id: string; name: string };
|
|
908
|
+
|
|
909
|
+
export const session = proxy({ user: null as User | null });
|
|
910
|
+
export const cart = proxy({ items: [] as string[] });
|
|
911
|
+
```
|
|
912
|
+
|
|
913
|
+
### Connect it to the screens
|
|
914
|
+
|
|
915
|
+
Nothing to connect: the screens import the proxies.
|
|
916
|
+
|
|
917
|
+
```ts
|
|
918
|
+
export const Navigation = createNavigation({
|
|
919
|
+
screens: { Products, Cart },
|
|
920
|
+
root: 'Products',
|
|
921
|
+
});
|
|
922
|
+
```
|
|
923
|
+
|
|
924
|
+
### Read and write in a screen
|
|
925
|
+
|
|
926
|
+
Read from the snapshot, write to the proxy:
|
|
927
|
+
|
|
928
|
+
```tsx
|
|
929
|
+
import { Button } from 'react-native';
|
|
930
|
+
import { useSnapshot } from 'valtio';
|
|
931
|
+
import { cart } from '../store';
|
|
932
|
+
|
|
933
|
+
export function Products() {
|
|
934
|
+
const snap = useSnapshot(cart);
|
|
935
|
+
return (
|
|
936
|
+
<Button
|
|
937
|
+
title={`Add to cart (${snap.items.length})`}
|
|
938
|
+
onPress={() => cart.items.push('42')}
|
|
939
|
+
/>
|
|
940
|
+
);
|
|
941
|
+
}
|
|
942
|
+
```
|
|
943
|
+
|
|
944
|
+
The snapshot is read-only; a write to `snap` throws. Writes go to `cart`.
|
|
945
|
+
|
|
946
|
+
### Outside React
|
|
947
|
+
|
|
948
|
+
The proxy is the store: read and write it anywhere. `subscribe(proxy, callback)` runs code on each change.
|
|
949
|
+
|
|
950
|
+
```ts
|
|
951
|
+
import { navigation } from '@apexnative/navigation';
|
|
952
|
+
import { cart, session } from './src/store';
|
|
953
|
+
|
|
954
|
+
export const Navigation = createNavigation({
|
|
955
|
+
// …
|
|
956
|
+
willMount: async () => {
|
|
957
|
+
session.user = await loadUser(); // your own request
|
|
958
|
+
},
|
|
959
|
+
linking: {
|
|
960
|
+
prefixes: ['myapp://'],
|
|
961
|
+
routes: {
|
|
962
|
+
'cart/add/:productId': ({ productId }) => {
|
|
963
|
+
cart.items.push(productId);
|
|
964
|
+
navigation.push('Cart');
|
|
965
|
+
},
|
|
966
|
+
},
|
|
967
|
+
},
|
|
968
|
+
});
|
|
969
|
+
```
|
|
970
|
+
|
|
971
|
+
### The first root and sign-out
|
|
972
|
+
|
|
973
|
+
```ts
|
|
974
|
+
export const Navigation = createNavigation({
|
|
975
|
+
screens: { Login, Products, Cart },
|
|
976
|
+
roots: {
|
|
977
|
+
login: Stack('Login'),
|
|
978
|
+
main: Tabs(Tab('Products'), Tab('Cart')),
|
|
979
|
+
},
|
|
980
|
+
willMount: async () => {
|
|
981
|
+
session.user = await loadUser(); // your own request
|
|
982
|
+
},
|
|
983
|
+
initialRoot: () => (session.user ? 'main' : 'login'),
|
|
984
|
+
});
|
|
985
|
+
```
|
|
986
|
+
|
|
987
|
+
```ts
|
|
988
|
+
import { navigation } from '@apexnative/navigation';
|
|
989
|
+
import { cart, session } from './store';
|
|
990
|
+
import type { User } from './store';
|
|
991
|
+
|
|
992
|
+
export async function signIn(user: User) {
|
|
993
|
+
session.user = user;
|
|
994
|
+
await navigation.switchTo('main');
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
export async function signOut() {
|
|
998
|
+
await navigation.switchTo('login');
|
|
999
|
+
session.user = null;
|
|
1000
|
+
cart.items = [];
|
|
1001
|
+
}
|
|
1002
|
+
```
|
|
1003
|
+
|
|
1004
|
+
### Save the state
|
|
1005
|
+
|
|
1006
|
+
```ts
|
|
1007
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
1008
|
+
import { subscribe } from 'valtio';
|
|
1009
|
+
|
|
1010
|
+
willMount: async () => {
|
|
1011
|
+
const saved = await AsyncStorage.getItem('user');
|
|
1012
|
+
if (saved) session.user = JSON.parse(saved);
|
|
1013
|
+
subscribe(session, () => {
|
|
1014
|
+
AsyncStorage.setItem('user', JSON.stringify(session.user));
|
|
1015
|
+
});
|
|
1016
|
+
},
|
|
1017
|
+
initialRoot: () => (session.user ? 'main' : 'login'),
|
|
1018
|
+
```
|
|
1019
|
+
|
|
1020
|
+
## The libraries side by side
|
|
1021
|
+
|
|
1022
|
+
| | Provider needed | Shared by every screen with no `appProvider` | Outside React |
|
|
1023
|
+
| --- | --- | --- | --- |
|
|
1024
|
+
| Redux Toolkit | Yes, `` of `react-redux` | Yes, with the provider in `screenProvider` and the store in a module | `store.getState()`, `dispatch`, `subscribe` |
|
|
1025
|
+
| Zustand | No | Yes | `useStore.getState()`, `setState`, `subscribe` |
|
|
1026
|
+
| Jotai | No: the default store | Yes, without ``, or with one store passed to it | `getDefaultStore()`: `get`, `set`, `sub` |
|
|
1027
|
+
| MobX | No | Yes | The store object; `reaction`, `autorun` |
|
|
1028
|
+
| Valtio | No | Yes | The proxy; `subscribe`, `snapshot` |
|
|
1029
|
+
|
|
1030
|
+
Every one of them works with `appProvider` as well: the store doesn't change, and the screens render in one tree.
|
|
1031
|
+
|
|
1032
|
+
## Which to pick
|
|
1033
|
+
|
|
1034
|
+
The navigation works the same with each; pick by how your app thinks about its data.
|
|
1035
|
+
|
|
1036
|
+
- **Already on one of them** — keep it. Nothing here asks for a change.
|
|
1037
|
+
- **Zustand** — the least to set up: no provider, one hook per store, and a store that is also its own API outside React.
|
|
1038
|
+
- **Redux Toolkit** — one store with actions, middleware and devtools, for a large app or a team that wants every change in one log. It is the one that needs a provider: put it in `screenProvider` or `appProvider`.
|
|
1039
|
+
- **Jotai** — small pieces of state that combine, read one atom at a time. Keep to the default store, or one store you create.
|
|
1040
|
+
- **MobX** — classes with observable fields and methods; components render only for what they read.
|
|
1041
|
+
- **Valtio** — a plain object you change in place, with renders for what a component reads.
|
|
1042
|
+
|
|
1043
|
+
Whichever you pick, the data of the app lives in the store. The [app's context](./app-context) is for the few values the start, the options and the links read; a flag mirrored there is enough.
|
|
1044
|
+
|
|
1045
|
+
## What's next
|
|
1046
|
+
|
|
1047
|
+
- [The app context, and working without it](./app-context): what the navigation's own context is for.
|
|
1048
|
+
- [One tree](../architecture/one-tree): `appProvider` and `screenProvider` in depth.
|
|
1049
|
+
- [Switching roots](../fundamentals/switching-roots): the roots of signed in and signed out.
|
|
1050
|
+
- [Before the first screen](../fundamentals/starting-the-app#before): what `willMount` holds back.
|