@apexnative/navigation 1.0.0-alpha.0 → 1.0.0-alpha.10
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 +2 -1
- package/CHANGELOG.md +128 -0
- package/README.md +147 -51
- package/android/CLAUDE.md +78 -25
- package/android/CORE.md +49 -25
- package/android/RECIPES.md +13 -6
- package/android/consumer-rules.pro +6 -0
- package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +85 -10
- package/android/src/main/java/dev/apexnative/navigation/NavigationApplication.kt +34 -13
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutChecks.kt +5 -1
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutNode.kt +6 -2
- package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenContext.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/AnimationsOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabsOptions.kt +13 -8
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +9 -1
- package/android/src/main/java/dev/apexnative/navigation/options/LargeTitleOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/LayoutAnimation.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/OptionKey.kt +18 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionPaths.kt +91 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +8 -4
- package/android/src/main/java/dev/apexnative/navigation/options/SheetOptions.kt +7 -4
- package/android/src/main/java/dev/apexnative/navigation/options/SideMenuOptions.kt +6 -1
- package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +40 -2
- package/android/src/main/java/dev/apexnative/navigation/options/StatusBarOptions.kt +7 -3
- package/android/src/main/java/dev/apexnative/navigation/options/TitleOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarAppearanceOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarOptions.kt +16 -7
- package/android/src/main/java/dev/apexnative/navigation/options/UserChoices.kt +159 -0
- package/android/src/main/java/dev/apexnative/navigation/react/CommandAnswer.kt +29 -36
- package/android/src/main/java/dev/apexnative/navigation/react/CommandContract.kt +59 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ContentHeights.kt +95 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ContentMounts.kt +66 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ErrorTexts.kt +75 -60
- package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +35 -23
- package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +12 -7
- package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +42 -4
- package/android/src/main/java/dev/apexnative/navigation/react/PendingCalls.kt +48 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +54 -20
- package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +7 -6
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenEnvironment.kt +177 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +19 -50
- package/android/src/main/java/dev/apexnative/navigation/react/ScrollEvents.kt +49 -128
- package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +50 -81
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventContract.kt +226 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +135 -94
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationState.kt +154 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/ScreenAppearance.kt +0 -6
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +12 -10
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +10 -7
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +39 -19
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +16 -4
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotViews.kt +40 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageKey.kt +66 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageLoader.kt +7 -89
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageRequests.kt +76 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/MaterialTheme.kt +5 -6
- package/android/src/main/java/dev/apexnative/navigation/utils/OptionImages.kt +262 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/SystemAnimations.kt +36 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/UiUtils.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +3 -1
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewExtensions.kt +0 -13
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +10 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/SecondaryScreenPresenter.kt +13 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/AppliedTabCalls.kt +49 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +5 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +108 -34
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +25 -24
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +22 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +0 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +28 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +12 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +27 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +103 -56
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +29 -11
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +2 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +22 -24
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +109 -21
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +21 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +476 -73
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +57 -25
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetBack.kt +42 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetStops.kt +83 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackCheck.kt +50 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +49 -14
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +71 -12
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +37 -11
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +10 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +11 -4
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +42 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +19 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +16 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +43 -4
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +23 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +77 -17
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/BackPreview.kt +315 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +30 -20
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +216 -18
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +26 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +149 -41
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +26 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +115 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabMotion.kt +142 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +222 -48
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +3 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +30 -34
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +5 -51
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarRowTransition.kt +3 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +11 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +13 -56
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +219 -54
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +9 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +6 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +75 -21
- package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationLayer.kt +73 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +29 -11
- package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +14 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +9 -7
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +61 -2
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +0 -5
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +72 -10
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStep.kt +31 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +143 -135
- package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +13 -5
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +37 -112
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +9 -6
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionViews.kt +100 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +112 -4
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +346 -36
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMorph.kt +199 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +56 -41
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextMorph.kt +176 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewMorph.kt +108 -0
- package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +12 -3
- package/android/src/main/java/dev/apexnative/navigation/views/stack/ScreenEdge.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +140 -1
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +14 -10
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCopy.kt +85 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +13 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +5 -17
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +73 -34
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonView.kt +113 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarMenu.kt +219 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +125 -178
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +34 -64
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonRow.kt +216 -0
- package/android/src/main/jni/ANNContentHeights.cpp +82 -0
- package/android/src/main/res/drawable/apex_navigation_ic_arrow_right.xml +14 -0
- package/android/src/main/res/layout/apex_navigation_menu_header.xml +19 -0
- package/android/src/main/res/layout/apex_navigation_menu_item.xml +68 -0
- package/android/src/main/res/values/styles.xml +1 -1
- package/android/src/main/res/values-night/styles.xml +1 -1
- package/cli/app.js +1 -1
- package/cli/doctor/checks/app.js +77 -14
- package/cli/doctor/checks/splash.js +4 -22
- package/cli/migrate/native.js +18 -0
- package/cli/project.js +10 -2
- package/cli/setup/index.js +18 -0
- package/cli/setup/source.js +2 -1
- package/cli/setup/steps/appDelegate.js +66 -11
- package/cli/setup/steps/mainApplication.js +134 -19
- package/cli/setup/steps/metro.js +46 -0
- package/cli/setup/steps/sceneDelegate.js +108 -0
- package/cli/splash/index.js +3 -1
- package/cli/upgrade/changelog.js +2 -2
- package/docs-md/architecture/native-screens.md +4 -0
- package/docs-md/architecture/theme-and-context.md +131 -12
- package/docs-md/architecture/transitions.md +58 -12
- package/docs-md/containers/modals.md +8 -4
- package/docs-md/containers/overlays.md +3 -1
- package/docs-md/containers/side-menu.md +19 -2
- package/docs-md/containers/tabs.md +5 -1
- package/docs-md/flows/bottom-sheets.md +4 -2
- package/docs-md/flows/forms-in-a-modal.md +1 -1
- package/docs-md/fundamentals/screens-and-props.md +9 -1
- package/docs-md/fundamentals/starting-the-app.md +1 -1
- package/docs-md/guides/cli.md +4 -3
- package/docs-md/guides/deep-links.md +15 -33
- package/docs-md/help/glossary.md +4 -4
- package/docs-md/help/troubleshooting.md +44 -6
- package/docs-md/index.json +57 -1
- package/docs-md/migration/from-expo-router.md +1 -1
- package/docs-md/migration/from-react-native-navigation.md +9 -3
- package/docs-md/migration/from-react-navigation.md +2 -2
- package/docs-md/screen-ui/back-and-gestures.md +46 -2
- package/docs-md/screen-ui/bar-buttons.md +5 -5
- package/docs-md/screen-ui/search.md +1 -1
- package/docs-md/screen-ui/system-ui.md +17 -12
- package/docs-md/screen-ui/toolbar-and-fab.md +4 -2
- package/docs-md/screen-ui/top-bar.md +8 -4
- package/docs-md/start/installation.md +21 -3
- package/ios/Animations/ANNFrameDriver.h +55 -15
- package/ios/Animations/ANNFrameDriver.mm +216 -60
- package/ios/Animations/ANNTransitionAnimator.h +26 -5
- package/ios/Animations/ANNTransitionAnimator.mm +61 -13
- package/ios/Animations/ANNTransitionPlan.h +2 -2
- package/ios/Animations/ANNTransitionPlan.mm +10 -0
- package/ios/Animations/ANNTransitionWait.mm +6 -7
- package/ios/Animations/Elements/ANNElementFinder.h +57 -0
- package/ios/Animations/Elements/ANNElementFinder.mm +174 -2
- package/ios/Animations/Elements/ANNElementTransition.h +10 -8
- package/ios/Animations/Elements/ANNElementTransition.mm +19 -21
- package/ios/Animations/Elements/ANNSharedElementFlight.h +16 -11
- package/ios/Animations/Elements/ANNSharedElementFlight.mm +308 -69
- package/ios/Animations/Interpolators/ANNInterpolate.h +2 -30
- package/ios/Animations/Interpolators/ANNTransformParts.h +48 -0
- package/ios/Animations/Interpolators/ANNTransformParts.mm +507 -0
- package/ios/Animations/Interpolators/ANNViewTracks.h +9 -6
- package/ios/Animations/Interpolators/ANNViewTracks.mm +100 -30
- package/ios/CLAUDE.md +60 -24
- package/ios/CORE.md +44 -34
- package/ios/Contract/ANNCommandAnswer.h +13 -5
- package/ios/Contract/ANNCommandAnswer.mm +40 -32
- package/ios/Contract/ANNCommandContract.h +15 -0
- package/ios/Contract/ANNCommandContract.mm +78 -0
- package/ios/Contract/ANNCommandRunner.h +10 -9
- package/ios/Contract/ANNCommandRunner.mm +22 -28
- package/ios/Contract/ANNErrorTexts.h +6 -2
- package/ios/Contract/ANNErrorTexts.mm +18 -10
- package/ios/Contract/ANNLayoutNode.h +3 -3
- package/ios/Contract/ANNLayoutReader.h +3 -3
- package/ios/Core/ANNAppDelegate.mm +0 -2
- package/ios/Core/ANNAppearanceDispatcher.h +5 -4
- package/ios/Core/ANNAppearanceDispatcher.mm +12 -1
- package/ios/Core/ANNDeepLinkQueue.h +22 -2
- package/ios/Core/ANNDeepLinkQueue.mm +121 -14
- package/ios/Core/ANNErrorHandler.h +9 -4
- package/ios/Core/ANNErrorHandler.mm +20 -2
- package/ios/Core/ANNEventContract.h +246 -0
- package/ios/Core/ANNEventContract.mm +225 -0
- package/ios/Core/ANNEventEmitter.h +6 -2
- package/ios/Core/ANNEventEmitter.mm +117 -80
- package/ios/Core/ANNHinge.h +6 -0
- package/ios/Core/ANNHinge.mm +15 -4
- package/ios/Core/ANNJavaScriptCalls.h +33 -0
- package/ios/Core/ANNJavaScriptCalls.mm +52 -0
- package/ios/Core/ANNLayoutProtocol.h +5 -5
- package/ios/Core/ANNNavigationState.h +7 -5
- package/ios/Core/ANNNavigationState.mm +8 -7
- package/ios/Core/ANNNodeHelper.h +32 -12
- package/ios/Core/ANNNodeHelper.mm +100 -3
- package/ios/Core/ANNParking.h +5 -4
- package/ios/Core/ANNReloadCoordinator.mm +5 -12
- package/ios/Core/ANNRenderWait.h +20 -6
- package/ios/Core/ANNRenderWait.mm +143 -56
- package/ios/Core/ANNSceneDelegate.mm +25 -15
- package/ios/Core/ANNSystemUI.h +3 -2
- package/ios/Core/ANNSystemUI.mm +7 -0
- package/ios/Core/ANNUtils.h +7 -0
- package/ios/Core/ANNUtils.mm +10 -0
- package/ios/Core/ApexNavigation+Internal.h +1 -1
- package/ios/Core/ApexNavigation.mm +7 -6
- package/ios/Core/UIViewController+LayoutProtocol.h +9 -2
- package/ios/Core/UIViewController+LayoutProtocol.mm +8 -0
- package/ios/Layouts/Arrangement/ANNArrangementState.h +2 -17
- package/ios/Layouts/Arrangement/ANNArrangementState.mm +0 -38
- package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +10 -8
- package/ios/Layouts/Modal/ANNModalCoordinator.h +1 -1
- package/ios/Layouts/Modal/ANNModalCoordinator.mm +57 -16
- package/ios/Layouts/Modal/ANNModalPresentation.h +8 -5
- package/ios/Layouts/Modal/ANNModalPresentation.mm +12 -12
- package/ios/Layouts/Modal/ANNSheetPresenter.mm +83 -1
- package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +2 -8
- package/ios/Layouts/Root/ANNRootCoordinator.mm +58 -19
- package/ios/Layouts/Root/ANNSplashViewController.h +5 -3
- package/ios/Layouts/Root/ANNSplashViewController.mm +147 -0
- package/ios/Layouts/Screen/ANNComponentPresenter.h +11 -3
- package/ios/Layouts/Screen/ANNComponentPresenter.mm +34 -6
- package/ios/Layouts/Screen/ANNComponentViewController.h +15 -13
- package/ios/Layouts/Screen/ANNComponentViewController.mm +130 -75
- package/ios/Layouts/Screen/ANNNativeScreenContext.mm +7 -5
- package/ios/Layouts/Screen/ANNPreviewInteraction.h +7 -4
- package/ios/Layouts/Screen/ANNPreviewInteraction.mm +72 -10
- package/ios/Layouts/Screen/ANNScreenEnvironment.h +63 -0
- package/ios/Layouts/Screen/ANNScreenEnvironment.mm +181 -0
- package/ios/Layouts/Screen/ANNScreenPlace.h +53 -0
- package/ios/Layouts/Screen/ANNScreenPlace.mm +205 -0
- package/ios/Layouts/Screen/ANNScreenRegions.h +3 -18
- package/ios/Layouts/Screen/ANNScreenRegions.mm +9 -44
- package/ios/Layouts/Screen/ANNScreenSafeArea.h +4 -9
- package/ios/Layouts/Screen/ANNScreenSafeArea.mm +14 -16
- package/ios/Layouts/Screen/ANNScreenSettling.h +32 -0
- package/ios/Layouts/Screen/ANNScreenSettling.mm +137 -0
- package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +8 -0
- package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +83 -14
- package/ios/Layouts/SplitView/ANNSplitViewCommands.h +3 -2
- package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +105 -39
- package/ios/Layouts/SplitView/ANNSplitViewController.mm +7 -8
- package/ios/Layouts/Stack/ANNPreviewPush.h +7 -6
- package/ios/Layouts/Stack/ANNPreviewPush.mm +142 -27
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +11 -2
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +14 -7
- package/ios/Layouts/Stack/ANNStackCommands.mm +1 -0
- package/ios/Layouts/Stack/ANNStackController.h +8 -0
- package/ios/Layouts/Stack/ANNStackController.mm +184 -16
- package/ios/Layouts/Stack/ANNStackQueue.h +5 -2
- package/ios/Layouts/Stack/ANNStackQueue.mm +56 -43
- package/ios/Layouts/Stack/ANNSwipePopInteraction.h +26 -0
- package/ios/Layouts/Stack/ANNSwipePopInteraction.mm +185 -0
- package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +28 -4
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +4 -2
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +2 -3
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +4 -0
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +11 -0
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.h +12 -1
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +23 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.h +3 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.mm +237 -57
- package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +8 -3
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +6 -2
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +232 -43
- package/ios/Layouts/Tabs/ANNTabsDesign.h +6 -5
- package/ios/Layouts/Tabs/ANNTabsDesign.mm +9 -1
- package/ios/Layouts/Tabs/UITabBar+utils.h +5 -5
- package/ios/Layouts/Tabs/UITabBar+utils.mm +32 -13
- package/ios/Options/ANNAnimationOptions.h +2 -1
- package/ios/Options/ANNAnimationOptions.mm +1 -1
- package/ios/Options/ANNBottomTabsOptions.h +2 -0
- package/ios/Options/ANNBottomTabsOptions.mm +1 -0
- package/ios/Options/ANNOptions.h +25 -0
- package/ios/Options/ANNOptions.mm +157 -1
- package/ios/Options/ANNOptionsCache.h +7 -6
- package/ios/Options/ANNOptionsReader.mm +108 -0
- package/ios/Options/ANNSearchBarOptions.h +4 -3
- package/ios/Options/ANNSheetOptions.h +4 -1
- package/ios/Options/ANNSideMenuOptions.h +2 -0
- package/ios/Options/ANNSideMenuOptions.mm +2 -0
- package/ios/Options/ANNStackPopAnimationOptions.h +13 -0
- package/ios/Options/ANNStackPopAnimationOptions.mm +11 -0
- package/ios/Options/ANNUserChoice.h +57 -0
- package/ios/Options/ANNUserChoice.mm +44 -0
- package/ios/Options/Params/ANNImageSource.h +61 -0
- package/ios/Options/Params/ANNImageSource.mm +101 -0
- package/ios/Options/Params/ANNOptionImages.h +37 -0
- package/ios/Options/Params/ANNOptionImages.mm +284 -0
- package/ios/Options/Params/ANNParam.h +15 -0
- package/ios/Options/Params/ANNParam.mm +61 -0
- package/ios/Options/Params/Color.h +3 -0
- package/ios/Options/Params/Color.mm +21 -0
- package/ios/Options/Params/ColorParser.h +4 -3
- package/ios/Options/Params/ColorParser.mm +22 -4
- package/ios/Options/Params/Image.h +15 -2
- package/ios/Options/Params/Image.mm +35 -2
- package/ios/Options/Params/ImageParser.h +5 -5
- package/ios/Options/Params/ImageParser.mm +28 -46
- package/ios/Public/ApexNavigation/ANNSceneDelegate.h +3 -0
- package/ios/Public/ApexNavigation/ApexNavigation.h +1 -1
- package/ios/RECIPES.md +13 -6
- package/ios/React/ANNReactView.mm +6 -25
- package/ios/React/ANNSafeAreaViewComponentView.mm +28 -17
- package/ios/React/ANNSurfaceHostingView.h +14 -0
- package/ios/React/ANNSurfaceHostingView.mm +144 -1
- package/ios/React/Slots/ANNSlotComponentView.mm +24 -17
- package/ios/React/Slots/ANNSlotContainers.h +14 -6
- package/ios/React/Slots/ANNSlotContainers.mm +75 -2
- package/ios/React/Slots/ANNSlotHost.mm +1 -3
- package/ios/React/Slots/ANNSlotScreenView.mm +8 -2
- package/ios/TopBar/ANNBackButtonPresenter.mm +6 -5
- package/ios/TopBar/ANNBarAppearance.h +2 -1
- package/ios/TopBar/ANNBarAppearance.mm +111 -30
- package/ios/TopBar/ANNBarBackgroundComponent.mm +16 -0
- package/ios/TopBar/ANNBarButtonComponentView.h +4 -4
- package/ios/TopBar/ANNBarButtonComponentView.mm +1 -1
- package/ios/TopBar/ANNBarButtons.h +14 -8
- package/ios/TopBar/ANNBarButtons.mm +397 -80
- package/ios/TopBar/ANNIconButtonImage.h +1 -0
- package/ios/TopBar/ANNIconButtonImage.mm +34 -1
- package/ios/TopBar/ANNLargeTitlePresenter.h +13 -0
- package/ios/TopBar/ANNLargeTitlePresenter.mm +50 -7
- package/ios/TopBar/ANNMainList.h +3 -0
- package/ios/TopBar/ANNMainList.mm +4 -0
- package/ios/TopBar/ANNScrollEdgeEffects.h +22 -6
- package/ios/TopBar/ANNScrollEdgeEffects.mm +123 -16
- package/ios/TopBar/ANNSearchPresenter.mm +172 -21
- package/ios/TopBar/ANNSearchResultsViewController.mm +29 -6
- package/ios/TopBar/ANNTopBarPresenter.h +8 -2
- package/ios/TopBar/ANNTopBarPresenter.mm +155 -33
- package/ios/TurboModules/ANNTurboEventEmitter.mm +4 -35
- package/ios/TurboModules/ANNTurboModule.mm +104 -33
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.cpp +20 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +5 -14
- package/lib/module/ARCHITECTURE.md +40 -27
- package/lib/module/adapters/NativeANNTurboModule.js.map +1 -1
- package/lib/module/api/app/AppRegistry.js +14 -2
- package/lib/module/api/app/AppRegistry.js.map +1 -1
- package/lib/module/api/app/createNavigation.js +190 -66
- package/lib/module/api/app/createNavigation.js.map +1 -1
- package/lib/module/api/commands/commands.js +54 -6
- package/lib/module/api/commands/commands.js.map +1 -1
- package/lib/module/api/events/navigationEvents.js +6 -2
- package/lib/module/api/events/navigationEvents.js.map +1 -1
- package/lib/module/api/hooks/useNavigation.js +8 -3
- package/lib/module/api/hooks/useNavigation.js.map +1 -1
- package/lib/module/api/hooks/useSafeAreaInsets.js +4 -3
- package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -1
- package/lib/module/api/linking/dispatchedLinks.js +23 -0
- package/lib/module/api/linking/dispatchedLinks.js.map +1 -0
- package/lib/module/api/linking/linking.js +11 -0
- package/lib/module/api/linking/linking.js.map +1 -1
- package/lib/module/api/navigation.js.map +1 -1
- package/lib/module/api/options/OptionsChain.js +2 -2
- package/lib/module/api/screens/defineScreen.js +45 -3
- package/lib/module/api/screens/defineScreen.js.map +1 -1
- package/lib/module/api/screens/nativeScreens.js +31 -6
- package/lib/module/api/screens/nativeScreens.js.map +1 -1
- package/lib/module/api/screens/registerScreens.js +193 -35
- package/lib/module/api/screens/registerScreens.js.map +1 -1
- package/lib/module/api/theme/theme.js +5 -0
- package/lib/module/api/theme/theme.js.map +1 -1
- package/lib/module/engine/commands.js +51 -9
- package/lib/module/engine/commands.js.map +1 -1
- package/lib/module/engine/layout.js +20 -11
- package/lib/module/engine/layout.js.map +1 -1
- package/lib/module/engine/nativeScreens.js +9 -0
- package/lib/module/engine/nativeScreens.js.map +1 -1
- package/lib/module/engine/options.js +49 -15
- package/lib/module/engine/options.js.map +1 -1
- package/lib/module/engine/optionsChange.js +102 -0
- package/lib/module/engine/optionsChange.js.map +1 -0
- package/lib/module/engine/places.js +52 -7
- package/lib/module/engine/places.js.map +1 -1
- package/lib/module/engine/props.js +30 -1
- package/lib/module/engine/props.js.map +1 -1
- package/lib/module/engine/refresh.js +85 -0
- package/lib/module/engine/refresh.js.map +1 -0
- package/lib/module/engine/rememberedOptions.js +61 -1
- package/lib/module/engine/rememberedOptions.js.map +1 -1
- package/lib/module/engine/screens.js +77 -16
- package/lib/module/engine/screens.js.map +1 -1
- package/lib/module/interfaces/contract/commands.json +101 -0
- package/lib/module/interfaces/contract/errors.json +275 -0
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts +12 -2
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -1
- package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -1
- package/lib/typescript/api/app/createNavigation.d.ts +8 -3
- package/lib/typescript/api/app/createNavigation.d.ts.map +1 -1
- package/lib/typescript/api/commands/commands.d.ts.map +1 -1
- package/lib/typescript/api/commands/presentation.d.ts +4 -3
- package/lib/typescript/api/commands/presentation.d.ts.map +1 -1
- package/lib/typescript/api/events/navigationEvents.d.ts +3 -3
- package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -1
- package/lib/typescript/api/hooks/useNavigation.d.ts +1 -1
- package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -1
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts +4 -3
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -1
- package/lib/typescript/api/index.d.ts +1 -1
- package/lib/typescript/api/index.d.ts.map +1 -1
- package/lib/typescript/api/linking/dispatchedLinks.d.ts +7 -0
- package/lib/typescript/api/linking/dispatchedLinks.d.ts.map +1 -0
- package/lib/typescript/api/linking/linking.d.ts +8 -0
- package/lib/typescript/api/linking/linking.d.ts.map +1 -1
- package/lib/typescript/api/navigation.d.ts +4 -1
- package/lib/typescript/api/navigation.d.ts.map +1 -1
- package/lib/typescript/api/options/OptionsChain.d.ts +2 -2
- package/lib/typescript/api/screens/defineScreen.d.ts +23 -4
- package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -1
- package/lib/typescript/api/screens/nativeScreens.d.ts +8 -1
- package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -1
- package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -1
- package/lib/typescript/api/theme/theme.d.ts +2 -0
- package/lib/typescript/api/theme/theme.d.ts.map +1 -1
- package/lib/typescript/engine/commands.d.ts +5 -0
- package/lib/typescript/engine/commands.d.ts.map +1 -1
- package/lib/typescript/engine/layout.d.ts.map +1 -1
- package/lib/typescript/engine/nativeScreens.d.ts +5 -0
- package/lib/typescript/engine/nativeScreens.d.ts.map +1 -1
- package/lib/typescript/engine/options.d.ts +5 -2
- package/lib/typescript/engine/options.d.ts.map +1 -1
- package/lib/typescript/engine/optionsChange.d.ts +28 -0
- package/lib/typescript/engine/optionsChange.d.ts.map +1 -0
- package/lib/typescript/engine/places.d.ts +7 -2
- package/lib/typescript/engine/places.d.ts.map +1 -1
- package/lib/typescript/engine/props.d.ts +8 -1
- package/lib/typescript/engine/props.d.ts.map +1 -1
- package/lib/typescript/engine/refresh.d.ts +35 -0
- package/lib/typescript/engine/refresh.d.ts.map +1 -0
- package/lib/typescript/engine/rememberedOptions.d.ts +13 -0
- package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -1
- package/lib/typescript/engine/screens.d.ts +27 -6
- package/lib/typescript/engine/screens.d.ts.map +1 -1
- package/lib/typescript/interfaces/ComponentEvents.d.ts +4 -4
- package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -1
- package/lib/typescript/interfaces/Events.d.ts +28 -10
- package/lib/typescript/interfaces/Events.d.ts.map +1 -1
- package/lib/typescript/interfaces/Options.d.ts +1 -1
- package/lib/typescript/interfaces/Options.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/animations.d.ts +80 -22
- package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/bottomTabs.d.ts +21 -7
- package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/buttons.d.ts +23 -15
- package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/modals.d.ts +34 -26
- package/lib/typescript/interfaces/options/modals.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/sideMenu.d.ts +23 -6
- package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/stack.d.ts +17 -3
- package/lib/typescript/interfaces/options/stack.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/system.d.ts +18 -11
- package/lib/typescript/interfaces/options/system.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/toolbar.d.ts +2 -2
- package/lib/typescript/interfaces/options/topBar.d.ts +68 -38
- package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -1
- package/metro/acceptPlugin.js +57 -0
- package/metro/babelTransformer.js +45 -0
- package/metro/index.js +36 -0
- package/package.json +4 -25
- package/src/ARCHITECTURE.md +40 -27
- package/src/adapters/NativeANNTurboModule.ts +12 -2
- package/src/api/app/AppRegistry.ts +16 -2
- package/src/api/app/createNavigation.ts +203 -69
- package/src/api/commands/commands.ts +48 -7
- package/src/api/commands/presentation.ts +4 -3
- package/src/api/events/navigationEvents.ts +10 -4
- package/src/api/hooks/useNavigation.ts +9 -4
- package/src/api/hooks/useSafeAreaInsets.ts +4 -3
- package/src/api/index.ts +1 -0
- package/src/api/linking/dispatchedLinks.ts +18 -0
- package/src/api/linking/linking.ts +22 -1
- package/src/api/navigation.ts +4 -1
- package/src/api/options/OptionsChain.ts +2 -2
- package/src/api/screens/defineScreen.ts +49 -5
- package/src/api/screens/nativeScreens.ts +40 -4
- package/src/api/screens/registerScreens.tsx +185 -42
- package/src/api/theme/theme.ts +5 -0
- package/src/engine/commands.ts +70 -13
- package/src/engine/layout.ts +27 -11
- package/src/engine/nativeScreens.ts +10 -1
- package/src/engine/options.ts +45 -19
- package/src/engine/optionsChange.ts +107 -0
- package/src/engine/places.ts +65 -7
- package/src/engine/props.ts +30 -1
- package/src/engine/refresh.ts +97 -0
- package/src/engine/rememberedOptions.ts +74 -1
- package/src/engine/screens.tsx +76 -21
- package/src/interfaces/ComponentEvents.ts +4 -4
- package/src/interfaces/Events.ts +29 -10
- package/src/interfaces/Options.ts +1 -0
- package/src/interfaces/contract/commands.json +101 -0
- package/src/interfaces/contract/errors.json +275 -0
- package/src/interfaces/options/animations.ts +81 -22
- package/src/interfaces/options/bottomTabs.ts +21 -7
- package/src/interfaces/options/buttons.ts +23 -15
- package/src/interfaces/options/modals.ts +34 -26
- package/src/interfaces/options/sideMenu.ts +24 -6
- package/src/interfaces/options/stack.ts +17 -3
- package/src/interfaces/options/system.ts +18 -11
- package/src/interfaces/options/toolbar.ts +2 -2
- package/src/interfaces/options/topBar.ts +68 -38
- package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +0 -41
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +0 -69
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +0 -62
- package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +0 -62
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +0 -223
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +0 -31
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +0 -138
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +0 -88
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +0 -33
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +0 -66
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +0 -179
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +0 -139
- package/ios/Layouts/Screen/ANNScreenInsets.h +0 -30
- package/ios/Layouts/Screen/ANNScreenInsets.mm +0 -68
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +0 -27
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +0 -55
|
@@ -29,9 +29,77 @@ export function rememberMergedOptions(id: string, options: Options): void {
|
|
|
29
29
|
remembered.set(id, before ? mergeOptions(before, kept) : kept);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
/** Takes the options at the paths, such as `['topBar', 'subtitle']`, out of those remembered for the node with the id. */
|
|
33
|
+
export function forgetMergedPaths(id: string, paths: readonly string[][]): void {
|
|
34
|
+
const own = ownOptions.get(id);
|
|
35
|
+
if (own) own.options = withoutPaths(own.options, paths);
|
|
36
|
+
const options = remembered.get(id);
|
|
37
|
+
if (options) remembered.set(id, withoutPaths(options, paths));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// A copy of the options without the values at the paths.
|
|
41
|
+
function withoutPaths(options: Options, paths: readonly string[][]): Options {
|
|
42
|
+
const kept = structuredCopy(options);
|
|
43
|
+
for (const path of paths) {
|
|
44
|
+
const parent = path
|
|
45
|
+
.slice(0, -1)
|
|
46
|
+
.reduce<Record<string, unknown> | undefined>(
|
|
47
|
+
(group, key) => group?.[key] as Record<string, unknown> | undefined,
|
|
48
|
+
kept
|
|
49
|
+
);
|
|
50
|
+
if (parent) delete parent[path[path.length - 1]!];
|
|
51
|
+
}
|
|
52
|
+
return kept as Options;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// A copy of the plain objects of options, the other values shared.
|
|
56
|
+
function structuredCopy(options: Options): Record<string, unknown> {
|
|
57
|
+
return Object.fromEntries(
|
|
58
|
+
Object.entries(options).map(([key, value]) => [
|
|
59
|
+
key,
|
|
60
|
+
isGroup(value) ? structuredCopy(value as Options) : value,
|
|
61
|
+
])
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function isGroup(value: unknown): boolean {
|
|
66
|
+
return (
|
|
67
|
+
typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
32
71
|
/** Forgets the merged options of a node that went; a node of the last root keeps them until another root goes out. */
|
|
33
72
|
export function forgetMergedOptions(id: string): void {
|
|
34
73
|
if (!lastRoot?.ids.has(id)) remembered.delete(id);
|
|
74
|
+
ownOptions.delete(id);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The own options of each screen as JavaScript sent them, in development: those it showed with, and every merge and
|
|
78
|
+
// clear since. An edit of a screen's options (Fast Refresh) changes only what still has the old definition's value.
|
|
79
|
+
const ownOptions = new Map<string, { name: string; options: Options }>();
|
|
80
|
+
|
|
81
|
+
/** Notes the own options a screen of the name shows with (development). */
|
|
82
|
+
export function noteOwnOptions(id: string, name: string, options: Options): void {
|
|
83
|
+
if (__DEV__) ownOptions.set(id, { name, options });
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Notes a merge into a screen's own options (development). */
|
|
87
|
+
export function noteMergedOwnOptions(id: string, options: Options): void {
|
|
88
|
+
const noted = __DEV__ ? ownOptions.get(id) : undefined;
|
|
89
|
+
if (noted) noted.options = mergeOptions(noted.options, options);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** The own options of a screen as JavaScript sent them (development); undefined for a screen it didn't note. */
|
|
93
|
+
export function ownOptionsOf(id: string): Options | undefined {
|
|
94
|
+
return ownOptions.get(id)?.options;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The ids of the screens of the name the native side has, mounted in React or not yet (a tab not selected yet), as
|
|
99
|
+
* development notes them.
|
|
100
|
+
*/
|
|
101
|
+
export function notedScreens(name: string): string[] {
|
|
102
|
+
return [...ownOptions].filter(([, noted]) => noted.name === name).map(([id]) => id);
|
|
35
103
|
}
|
|
36
104
|
|
|
37
105
|
/** The options merged into the node with the id, as remembered; undefined without any. */
|
|
@@ -55,12 +123,17 @@ export function rootGoesOut(nodes: LayoutNode[], again: SentRoot | undefined): v
|
|
|
55
123
|
const before = lastRoot;
|
|
56
124
|
lastRoot = { nodes, ids: new Set(nodes.flatMap(idsOf)) };
|
|
57
125
|
if (!before) return;
|
|
126
|
+
// The screens of the root before go with it, the tabs React never mounted too.
|
|
127
|
+
for (const id of before.ids) if (!lastRoot.ids.has(id)) ownOptions.delete(id);
|
|
58
128
|
const moved = new Map<string, Options>();
|
|
59
129
|
if (again === before) {
|
|
60
130
|
pairNodes(before.nodes, nodes, (old, node) => {
|
|
61
131
|
const options = remembered.get(old.id);
|
|
62
132
|
if (!options) return;
|
|
63
|
-
node.data.options = mergeNativeOptions(
|
|
133
|
+
node.data.options = mergeNativeOptions(
|
|
134
|
+
node.data.options ?? {},
|
|
135
|
+
toNativeOptions(options, node.id)
|
|
136
|
+
);
|
|
64
137
|
moved.set(node.id, options);
|
|
65
138
|
});
|
|
66
139
|
}
|
package/src/engine/screens.tsx
CHANGED
|
@@ -2,7 +2,7 @@ import React, { type ComponentType, useCallback, useEffect, useSyncExternalStore
|
|
|
2
2
|
import { AppRegistry } from 'react-native';
|
|
3
3
|
import type { Options } from '../interfaces/Options';
|
|
4
4
|
import { forgetPlace } from './places';
|
|
5
|
-
import { forgetProps, propsOf, watchProps } from './props';
|
|
5
|
+
import { forgetProps, isOptionsComponent, propsOf, watchProps } from './props';
|
|
6
6
|
import { forgetMergedOptions } from './rememberedOptions';
|
|
7
7
|
import { hasSlot } from './slots';
|
|
8
8
|
import type { NativeControllerProps } from './nativeScreens';
|
|
@@ -52,14 +52,50 @@ export type EngineScreen =
|
|
|
52
52
|
/** What the root of a React screen renders: the screen's id, and the props the command gave it. */
|
|
53
53
|
export type ScreenRootProps = { componentId: string } & Record<string, unknown>;
|
|
54
54
|
|
|
55
|
+
/**
|
|
56
|
+
* What React Native gives the root of a React screen: the screen's id, its root tag (none in a slot of the app's one
|
|
57
|
+
* tree), and the props the native side gives that root, a tab cell's `tabIndex`, `selected`, `badge`, `dot` and
|
|
58
|
+
* `dotColor`.
|
|
59
|
+
*/
|
|
60
|
+
export type NativeRootProps = { componentId: string; rootTag?: number } & Record<string, unknown>;
|
|
61
|
+
|
|
55
62
|
const screens = new Map<string, EngineScreen>();
|
|
56
|
-
const roots = new Map<string, ComponentType<
|
|
63
|
+
const roots = new Map<string, ComponentType<NativeRootProps>>();
|
|
57
64
|
let unmounted: ((screenId: string) => void) | undefined;
|
|
58
|
-
// The React
|
|
59
|
-
// the old screens again in the new runtime, under the ids the new screens get too, and
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
|
|
65
|
+
// The React roots mounted under each id, by their root tags. One id can have several: after a JavaScript reload React
|
|
66
|
+
// Native starts the roots of the old screens again in the new runtime, under the ids the new screens get too, and
|
|
67
|
+
// unmounts them once the new ones show; a component of the default or a stack's options has one id and a root in the
|
|
68
|
+
// bar of every screen that shows it. The id lets its props go only with the last of them. A slot of the app's one tree
|
|
69
|
+
// has no tag: while the one tree shows a screen with the id, no root of that id lets it go.
|
|
70
|
+
const owners = new Map<string, Set<number>>();
|
|
71
|
+
// The screens that show by their ids: the name, and how many roots or slots of the id are mounted (a component of the
|
|
72
|
+
// options has a root in the bar of every screen that shows it).
|
|
73
|
+
const shown = new Map<string, { name: string; mounts: number }>();
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Notes a screen as shown, a React root or slot of it or the controller of a native screen, until the function it
|
|
77
|
+
* gives is called.
|
|
78
|
+
*/
|
|
79
|
+
export function noteShown(componentId: string, name: string): () => void {
|
|
80
|
+
const entry = shown.get(componentId);
|
|
81
|
+
if (entry?.name === name) entry.mounts++;
|
|
82
|
+
else shown.set(componentId, { name, mounts: 1 });
|
|
83
|
+
return () => {
|
|
84
|
+
const current = shown.get(componentId);
|
|
85
|
+
if (current?.name !== name) return;
|
|
86
|
+
if (--current.mounts === 0) shown.delete(componentId);
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** The ids of the screens with the name that show now. */
|
|
91
|
+
export function shownScreens(name: string): string[] {
|
|
92
|
+
return [...shown].filter(([, entry]) => entry.name === name).map(([id]) => id);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Whether a React root of the screen with the id is mounted now (a slot of the app's one tree doesn't count). */
|
|
96
|
+
export function hasRoot(componentId: string): boolean {
|
|
97
|
+
return owners.has(componentId);
|
|
98
|
+
}
|
|
63
99
|
|
|
64
100
|
/** What runs when the root of a screen unmounts: the screen is gone. */
|
|
65
101
|
export function onScreenUnmounted(listener: (screenId: string) => void): void {
|
|
@@ -192,20 +228,29 @@ export function isReactScreen(name: string): boolean {
|
|
|
192
228
|
return screen !== undefined && 'component' in screen;
|
|
193
229
|
}
|
|
194
230
|
|
|
231
|
+
/**
|
|
232
|
+
* The props a screen's component renders with: those a command left under its id ([stored]), the props the native side
|
|
233
|
+
* gave its root over them ([root]: a tab cell's state, which the docs promise arrives on top of `passProps`), and its
|
|
234
|
+
* id. The root tag stays with the root.
|
|
235
|
+
*/
|
|
236
|
+
export function screenProps(stored: object, root: NativeRootProps): ScreenRootProps {
|
|
237
|
+
const props: ScreenRootProps = { ...stored, ...root, componentId: root.componentId };
|
|
238
|
+
delete props.rootTag;
|
|
239
|
+
return props;
|
|
240
|
+
}
|
|
241
|
+
|
|
195
242
|
/**
|
|
196
243
|
* The root a React screen runs in: the screen with the props a command left for it under its id, and the new ones when
|
|
197
|
-
* options give its id new props
|
|
198
|
-
*
|
|
244
|
+
* options give its id new props, under the props the native side gives the root ([screenProps]). The slot of the app's
|
|
245
|
+
* one tree renders the same root.
|
|
199
246
|
*/
|
|
200
|
-
export function screenRoot(
|
|
201
|
-
name: string
|
|
202
|
-
): ComponentType<{ componentId: string; rootTag?: number }> | undefined {
|
|
247
|
+
export function screenRoot(name: string): ComponentType<NativeRootProps> | undefined {
|
|
203
248
|
const screen = screens.get(name);
|
|
204
249
|
if (!screen || !('component' in screen)) return undefined;
|
|
205
250
|
let root = roots.get(name);
|
|
206
251
|
if (!root) {
|
|
207
252
|
const Screen = screen.component();
|
|
208
|
-
root = function ScreenRoot(rootProps:
|
|
253
|
+
root = function ScreenRoot(rootProps: NativeRootProps) {
|
|
209
254
|
// In the app's one tree the slot renders the root, without a tag of its own.
|
|
210
255
|
const { componentId, rootTag } = rootProps;
|
|
211
256
|
const watch = useCallback(
|
|
@@ -213,24 +258,34 @@ export function screenRoot(
|
|
|
213
258
|
[componentId]
|
|
214
259
|
);
|
|
215
260
|
const props = useSyncExternalStore(watch, () => propsOf(componentId));
|
|
261
|
+
useEffect(() => noteShown(componentId, name), [componentId]);
|
|
216
262
|
useEffect(() => {
|
|
217
|
-
if (rootTag !== undefined
|
|
218
|
-
owners.
|
|
263
|
+
if (rootTag !== undefined) {
|
|
264
|
+
const tags = owners.get(componentId) ?? new Set<number>();
|
|
265
|
+
tags.add(rootTag);
|
|
266
|
+
owners.set(componentId, tags);
|
|
219
267
|
}
|
|
220
268
|
return () => {
|
|
221
|
-
//
|
|
222
|
-
// with the id: a later screen under the id, the restarted root of a screen after a
|
|
223
|
-
// (its slot may mount only once the app's provider lets it), the screen rendering
|
|
224
|
-
|
|
269
|
+
// A root while another root of the id is mounted leaves the screen alone, and so does any root while the one
|
|
270
|
+
// tree still has a slot with the id: a later screen under the id, the restarted root of a screen after a
|
|
271
|
+
// reload into the one tree (its slot may mount only once the app's provider lets it), the screen rendering
|
|
272
|
+
// again under the provider.
|
|
273
|
+
const tags = owners.get(componentId);
|
|
274
|
+
if (rootTag !== undefined && tags) {
|
|
275
|
+
tags.delete(rootTag);
|
|
276
|
+
if (tags.size > 0) return;
|
|
277
|
+
}
|
|
225
278
|
if (hasSlot(componentId)) return;
|
|
226
279
|
owners.delete(componentId);
|
|
227
|
-
|
|
280
|
+
// A component the library named in options keeps its props for the next root under its id (the node shows
|
|
281
|
+
// it again, or another screen shows the same default): they go with the node.
|
|
282
|
+
if (!isOptionsComponent(componentId)) forgetProps(componentId);
|
|
228
283
|
forgetPlace(componentId);
|
|
229
284
|
forgetMergedOptions(componentId);
|
|
230
285
|
unmounted?.(componentId);
|
|
231
286
|
};
|
|
232
287
|
}, [componentId, rootTag]);
|
|
233
|
-
return <Screen {...props
|
|
288
|
+
return <Screen {...screenProps(props, rootProps)} />;
|
|
234
289
|
};
|
|
235
290
|
root.displayName = `ScreenRoot(${name})`;
|
|
236
291
|
roots.set(name, root);
|
|
@@ -10,7 +10,7 @@ export type ComponentType =
|
|
|
10
10
|
|
|
11
11
|
/** The fields every appearance event has. */
|
|
12
12
|
interface ComponentAppearanceEvent {
|
|
13
|
-
/** The id of the component: the screen, or the
|
|
13
|
+
/** The id of the component: of the screen, or the bar component's own id. */
|
|
14
14
|
componentId: string;
|
|
15
15
|
/** The name of the component: for a screen, its name without any internal prefix. */
|
|
16
16
|
componentName: string;
|
|
@@ -60,7 +60,7 @@ export interface NavigationButtonPressedEvent {
|
|
|
60
60
|
* `ApexNavigation.back`; the hardware back of a modal has `ApexNavigation.hardwareBackButton`.
|
|
61
61
|
*/
|
|
62
62
|
buttonId: string;
|
|
63
|
-
/** (iOS) For a button with `toggle`: its new state,
|
|
63
|
+
/** (iOS) For a button with `toggle`: its new state, which the screen keeps. */
|
|
64
64
|
selected?: boolean;
|
|
65
65
|
}
|
|
66
66
|
|
|
@@ -95,8 +95,8 @@ export interface SheetDetentChangedEvent {
|
|
|
95
95
|
/** The id of the visible screen of the modal. */
|
|
96
96
|
componentId: string;
|
|
97
97
|
/**
|
|
98
|
-
* The detent the sheet stopped at: `'medium'`, `'large'`,
|
|
99
|
-
*
|
|
98
|
+
* The detent the sheet stopped at: `'medium'`, `'large'`, `'content'` (the detent that fits the content), or a
|
|
99
|
+
* height (points on iOS, dp on Android).
|
|
100
100
|
*/
|
|
101
101
|
detent: 'medium' | 'large' | 'content' | number;
|
|
102
102
|
}
|
package/src/interfaces/Events.ts
CHANGED
|
@@ -54,8 +54,12 @@ export interface NavigationStateChangedEvent {
|
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
* A tab was selected by the user: a press on the tab, a pick from the "More" list or a press on "More" that showed a
|
|
57
|
-
* tab (iOS). It
|
|
58
|
-
* `
|
|
57
|
+
* tab (iOS). It goes right after the `ComponentDidAppear` of the new tab's screen, before the navigation state and
|
|
58
|
+
* before the tab that was left goes back to its first screen (`popToRootOnBlur`), and only when the tab changed: a
|
|
59
|
+
* press on the selected tab or on a `selectTabOnPress: false` tab is reported by `BottomTabPressedEvent` alone.
|
|
60
|
+
* Selecting a tab from code sends nothing. A switch still running when another press, long press or choice from code
|
|
61
|
+
* comes ends first, with this event, so the events of one press never mix with the next; when that tab's screen
|
|
62
|
+
* hasn't drawn yet, this event goes before its held `ComponentDidAppear`.
|
|
59
63
|
*/
|
|
60
64
|
export interface BottomTabSelectedEvent {
|
|
61
65
|
/** The index of the tab that is now selected. */
|
|
@@ -67,24 +71,28 @@ export interface BottomTabSelectedEvent {
|
|
|
67
71
|
}
|
|
68
72
|
|
|
69
73
|
/**
|
|
70
|
-
* A tab was pressed, the
|
|
71
|
-
* the
|
|
74
|
+
* A tab was pressed, on the bar or on a cell of `bottomTabs.customRow`, the selected one too. It goes first, before
|
|
75
|
+
* anything the press does. Another tab: then the switch's `ComponentWillAppear`, `ComponentDidDisappear` and
|
|
76
|
+
* `ComponentDidAppear`, then `BottomTabSelectedEvent`. The selected tab again (`wasSelected: true`): its stack goes
|
|
77
|
+
* back to its first screen with the events of the user's back (`ScreenPopped`), or, on the first screen, its content
|
|
78
|
+
* scrolls to the top; with `popToRootOnPress: false` nothing follows. With `selectTabOnPress: false` it is the only
|
|
79
|
+
* event and the selection stays. A long press sends `BottomTabLongPressedEvent` instead.
|
|
72
80
|
*/
|
|
73
81
|
export interface BottomTabPressedEvent {
|
|
74
82
|
/** The index of the tab that was pressed. */
|
|
75
83
|
tabIndex: number;
|
|
76
84
|
/** The id of the tabs. */
|
|
77
85
|
bottomTabsId: string;
|
|
78
|
-
/** The id of the screen the tab shows: the top of its stack. */
|
|
86
|
+
/** The id of the screen the tab shows: the top of its stack, or the tab itself when it is a screen. */
|
|
79
87
|
screenId?: string;
|
|
80
88
|
/** Whether the tab was the selected one already; a press on the selected tab scrolls its content to the top. */
|
|
81
89
|
wasSelected: boolean;
|
|
82
90
|
}
|
|
83
91
|
|
|
84
92
|
/**
|
|
85
|
-
* A tab was pressed and held
|
|
86
|
-
*
|
|
87
|
-
*
|
|
93
|
+
* A tab was pressed and held, on the bar or on a cell of `bottomTabs.customRow`. The tab is not selected and gets no
|
|
94
|
+
* press event. On iOS it is not sent for "More" or for the tab strip at the top of an iPad. On Android it replaces the
|
|
95
|
+
* tooltip of the tab.
|
|
88
96
|
*/
|
|
89
97
|
export interface BottomTabLongPressedEvent {
|
|
90
98
|
/** The index of the tab that was pressed. */
|
|
@@ -105,6 +113,16 @@ export interface SplitViewColumnsStackedEvent {
|
|
|
105
113
|
stacked: boolean;
|
|
106
114
|
}
|
|
107
115
|
|
|
116
|
+
/**
|
|
117
|
+
* (iOS) A link the app dispatched (`dispatchDeepLinkURL`) that React Native's `Linking` doesn't take from the native
|
|
118
|
+
* side: on React Native 0.88 and newer, in an app whose Info.plist names a scene delegate, it takes only the links a
|
|
119
|
+
* scene opened. JavaScript hands it to `Linking` as a `url` event.
|
|
120
|
+
*/
|
|
121
|
+
export interface DeepLinkDispatchedEvent {
|
|
122
|
+
/** The link. */
|
|
123
|
+
url: string;
|
|
124
|
+
}
|
|
125
|
+
|
|
108
126
|
/**
|
|
109
127
|
* A screen of the single React tree was destroyed and the slot still belongs to it: JavaScript removes the slot from
|
|
110
128
|
* its tree. It is not sent for a prepared screen that was never pushed, nor when JavaScript reloads.
|
|
@@ -185,11 +203,12 @@ export type HingeState = 'closed' | 'partiallyOpen' | 'fullyOpen' | 'unknown';
|
|
|
185
203
|
*/
|
|
186
204
|
export interface HingeChangedEvent {
|
|
187
205
|
/**
|
|
188
|
-
* The state of the hinge. On Android `closed` means the
|
|
206
|
+
* The state of the hinge. On Android `closed` means the app's window has no fold, or the angle is below 90 degrees,
|
|
207
|
+
* so a device open flat with a window off the fold (split screen) reports `closed`; Android never gives `unknown`.
|
|
189
208
|
*/
|
|
190
209
|
state?: HingeState;
|
|
191
210
|
/**
|
|
192
|
-
* The angle of the hinge in degrees
|
|
211
|
+
* The angle of the hinge in degrees, to tenths. Missing when the state is `unknown` and where the system
|
|
193
212
|
* gives no angle.
|
|
194
213
|
*/
|
|
195
214
|
angle?: number;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Every command with a promise (an async method of src/adapters/NativeANNTurboModule.ts): what it resolves with, whether the navigation state goes before its answer (`state`), and whether `ANN.CommandCompleted` follows the answer (`completed`). scripts/contract.mjs makes ios/Contract/ANNCommandContract.{h,mm} and android/.../react/CommandContract.kt from it, and fails when a command of the spec is missing here or a command here is not in the spec.",
|
|
3
|
+
"commands": [
|
|
4
|
+
{
|
|
5
|
+
"name": "setRoot",
|
|
6
|
+
"resolves": "the id of the root, once the root and the layout's modals and overlays show",
|
|
7
|
+
"state": true,
|
|
8
|
+
"completed": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"name": "push",
|
|
12
|
+
"resolves": "the id of the screen that shows; of a pair, the pair's id",
|
|
13
|
+
"state": true,
|
|
14
|
+
"completed": true
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "preparePush",
|
|
18
|
+
"resolves": "the frame `{ width, height, padding }` of the prepared screen, or null; always null on iOS",
|
|
19
|
+
"state": false,
|
|
20
|
+
"completed": false
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "pop",
|
|
24
|
+
"resolves": "the id of the screen that went",
|
|
25
|
+
"state": true,
|
|
26
|
+
"completed": true
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "popTo",
|
|
30
|
+
"resolves": "the id of the screen it went back to",
|
|
31
|
+
"state": true,
|
|
32
|
+
"completed": true
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "popToRoot",
|
|
36
|
+
"resolves": "the id of the first screen of the stack",
|
|
37
|
+
"state": true,
|
|
38
|
+
"completed": true
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "setStackRoot",
|
|
42
|
+
"resolves": "the id of the new top screen",
|
|
43
|
+
"state": true,
|
|
44
|
+
"completed": true
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"name": "showModal",
|
|
48
|
+
"resolves": "the id of the modal's root",
|
|
49
|
+
"state": true,
|
|
50
|
+
"completed": true
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "dismissModal",
|
|
54
|
+
"resolves": "the id of the modal's root",
|
|
55
|
+
"state": true,
|
|
56
|
+
"completed": true
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "dismissAllModals",
|
|
60
|
+
"resolves": "an empty string",
|
|
61
|
+
"state": true,
|
|
62
|
+
"completed": true
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "showOverlay",
|
|
66
|
+
"resolves": "the id of the overlay's root",
|
|
67
|
+
"state": true,
|
|
68
|
+
"completed": true
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "dismissOverlay",
|
|
72
|
+
"resolves": "the id of the overlay's root",
|
|
73
|
+
"state": true,
|
|
74
|
+
"completed": true
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "dismissAllOverlays",
|
|
78
|
+
"resolves": "an empty string",
|
|
79
|
+
"state": true,
|
|
80
|
+
"completed": true
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"name": "showInColumn",
|
|
84
|
+
"resolves": "the id of the screen that shows",
|
|
85
|
+
"state": true,
|
|
86
|
+
"completed": true
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "setColumnShown",
|
|
90
|
+
"resolves": "nothing once the columns stopped moving (`undefined` on iOS, `null` on Android)",
|
|
91
|
+
"state": true,
|
|
92
|
+
"completed": false
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "getLaunchLink",
|
|
96
|
+
"resolves": "the link that launched the app, or null",
|
|
97
|
+
"state": false,
|
|
98
|
+
"completed": false
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
}
|