@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
|
@@ -5,12 +5,13 @@
|
|
|
5
5
|
|
|
6
6
|
NS_ASSUME_NONNULL_BEGIN
|
|
7
7
|
|
|
8
|
-
/// The preview of a push (`usePreview`): a push that waits for a tap on its preview. Its screen is made
|
|
9
|
-
///
|
|
10
|
-
///
|
|
11
|
-
///
|
|
12
|
-
/// the
|
|
13
|
-
///
|
|
8
|
+
/// The preview of a push (`usePreview`): a push that waits for a tap on its preview. Its screen is made at once, out of
|
|
9
|
+
/// the stack, its key kept, and renders unseen: a React screen with a root of its own as a press on the view starts, a
|
|
10
|
+
/// native screen or one of the app's one tree at once. The view with `preview.nativeID` is looked for on the source
|
|
11
|
+
/// screen at once, then at each mount of the source's content (on each frame for a slot screen), for at most 0.5 s;
|
|
12
|
+
/// found, the preview module (`ANNPreviewInteraction`) shows the screen from it on a long press. A tap that commits
|
|
13
|
+
/// pushes the screen without an animation (and without a wait once its content is there), or goes back to the entry
|
|
14
|
+
/// with its key; a preview that goes without being opened destroys its screen and rejects the push. Main queue.
|
|
14
15
|
@interface ANNPreviewPush : NSObject
|
|
15
16
|
|
|
16
17
|
- (instancetype)init NS_UNAVAILABLE;
|
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
#import "ANNPreviewPush.h"
|
|
2
2
|
#import "ANNAssert.h"
|
|
3
|
+
#import "ANNCommandRunner.h"
|
|
4
|
+
#import "ANNComponentViewController.h"
|
|
3
5
|
#import "ANNErrorTexts.h"
|
|
6
|
+
#import "ANNExternalViewController.h"
|
|
4
7
|
#import "ANNLayoutFactory.h"
|
|
5
8
|
#import "ANNParking.h"
|
|
6
9
|
#import "ANNPopoverPresenter.h"
|
|
7
10
|
#import "ANNPreviewInteraction.h"
|
|
8
11
|
#import "ANNReloadCoordinator.h"
|
|
12
|
+
#import "ANNSlotContainers.h"
|
|
13
|
+
#import "ANNSlotScreenView.h"
|
|
9
14
|
#import "ANNStackCommands.h"
|
|
10
15
|
#import "ANNStackController.h"
|
|
11
16
|
#import "ApexNavigation+Internal.h"
|
|
12
17
|
#import "UIViewController+LayoutProtocol.h"
|
|
13
18
|
|
|
14
|
-
// The view of a component mounts a frame or so after the command that rendered it: it is looked for
|
|
15
|
-
// a
|
|
16
|
-
static const
|
|
19
|
+
// The view of a component mounts a frame or so after the command that rendered it: it is looked for at each mount of
|
|
20
|
+
// the source's content until this limit (30 frames), then the preview goes, as with a `nativeID` no view has.
|
|
21
|
+
static const NSTimeInterval ANNPreviewSearchLimit = 30.0 / 60;
|
|
22
|
+
// Where the source's mounts can't be heard, a frame apart.
|
|
17
23
|
static const NSTimeInterval ANNPreviewSearchInterval = 1.0 / 60;
|
|
18
24
|
|
|
19
25
|
// One preview from its push to its end: the tap took it, or it went.
|
|
@@ -28,9 +34,14 @@ static const NSTimeInterval ANNPreviewSearchInterval = 1.0 / 60;
|
|
|
28
34
|
@property(nonatomic, copy) NSString *componentId;
|
|
29
35
|
@property(nonatomic, copy) NSString *what;
|
|
30
36
|
@property(nonatomic) NSUInteger generation;
|
|
31
|
-
|
|
37
|
+
// The content whose mounts the search hears, while it looks.
|
|
38
|
+
@property(nonatomic, weak, nullable) UIView<ANNComponentProtocol> *watched;
|
|
32
39
|
@property(nonatomic) BOOL attached;
|
|
33
40
|
@property(nonatomic) BOOL done;
|
|
41
|
+
// The size of the preview, taken at the push.
|
|
42
|
+
@property(nonatomic) CGSize size;
|
|
43
|
+
// The screen rendered: at the push, or at the press for a screen of its own React root.
|
|
44
|
+
@property(nonatomic) BOOL rendered;
|
|
34
45
|
// The screen's unseen place in the main window, at its preview size, until UIKit takes its view for the menu.
|
|
35
46
|
@property(nonatomic, strong, nullable) UIView *host;
|
|
36
47
|
@property(nonatomic, strong, nullable) ANNParking *parking;
|
|
@@ -48,6 +59,15 @@ static NSMutableDictionary<NSString *, ANNPreviewRecord *> *ANNPreviewRecords(vo
|
|
|
48
59
|
return records;
|
|
49
60
|
}
|
|
50
61
|
|
|
62
|
+
// A React screen with a root of its own renders at the press: a view with a preview costs no React root, no render and
|
|
63
|
+
// no effects of the screen until the user presses it. A native screen (a kind of component screen) renders as it is
|
|
64
|
+
// made, and a screen of the app's one tree renders in JavaScript as its slot is added: both render at the push.
|
|
65
|
+
static BOOL ANNPreviewRendersAtPress(UIViewController *screen) {
|
|
66
|
+
return [screen isKindOfClass:ANNComponentViewController.class] &&
|
|
67
|
+
![screen isKindOfClass:ANNExternalViewController.class] &&
|
|
68
|
+
![screen.layoutInfo.name hasPrefix:ANNSlotPrefix];
|
|
69
|
+
}
|
|
70
|
+
|
|
51
71
|
@implementation ANNPreviewPush
|
|
52
72
|
|
|
53
73
|
+ (void)push:(ANNLayoutNode *)layout
|
|
@@ -68,6 +88,7 @@ static NSMutableDictionary<NSString *, ANNPreviewRecord *> *ANNPreviewRecords(vo
|
|
|
68
88
|
ANNPreviewRecord *record = [ANNPreviewRecord new];
|
|
69
89
|
record.previewId = layout.nodeId;
|
|
70
90
|
record.screen = screen;
|
|
91
|
+
record.size = size;
|
|
71
92
|
record.source = source;
|
|
72
93
|
record.answer = answer;
|
|
73
94
|
// The key applies only once the tap made the preview a screen of the stack.
|
|
@@ -78,18 +99,22 @@ static NSMutableDictionary<NSString *, ANNPreviewRecord *> *ANNPreviewRecords(vo
|
|
|
78
99
|
record.generation = answer.generation;
|
|
79
100
|
ANNPreviewRecords()[record.previewId] = record;
|
|
80
101
|
@try {
|
|
81
|
-
|
|
102
|
+
if (!ANNPreviewRendersAtPress(screen)) {
|
|
103
|
+
[self parkAndRender:record];
|
|
104
|
+
}
|
|
82
105
|
} @catch (NSException *exception) {
|
|
83
106
|
[self finish:record];
|
|
84
107
|
[screen destroy];
|
|
85
108
|
@throw;
|
|
86
109
|
}
|
|
87
|
-
[self
|
|
110
|
+
[self startSearch:record];
|
|
88
111
|
}
|
|
89
112
|
|
|
90
|
-
// The screen renders
|
|
113
|
+
// The screen renders, once: its view waits unseen in the main window, at the size of the preview, so that its content
|
|
91
114
|
// lays out; nothing waits for it.
|
|
92
|
-
+ (void)parkAndRender:(ANNPreviewRecord *)record
|
|
115
|
+
+ (void)parkAndRender:(ANNPreviewRecord *)record {
|
|
116
|
+
record.rendered = YES;
|
|
117
|
+
CGSize size = record.size;
|
|
93
118
|
UIWindow *window = ApexNavigation.mainWindow;
|
|
94
119
|
if (window) {
|
|
95
120
|
UIView *host = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
|
|
@@ -110,42 +135,103 @@ static NSMutableDictionary<NSString *, ANNPreviewRecord *> *ANNPreviewRecords(vo
|
|
|
110
135
|
|
|
111
136
|
#pragma mark - The search
|
|
112
137
|
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
|
|
138
|
+
// The view is looked for at once; else again at each mount of the source's content, where it comes with one of them,
|
|
139
|
+
// and a last time at the limit, when the preview goes. Both later steps keep the generation they were made with: after
|
|
140
|
+
// a reload they do nothing.
|
|
141
|
+
+ (void)startSearch:(ANNPreviewRecord *)record {
|
|
142
|
+
if ([self search:record last:NO]) {
|
|
116
143
|
return;
|
|
117
144
|
}
|
|
145
|
+
UIViewController *source = record.source;
|
|
146
|
+
// A source that is a container (a stack) is heard through the screen it shows.
|
|
147
|
+
UIView<ANNComponentProtocol> *content =
|
|
148
|
+
source.reactView ?: source.presentedComponentViewController.reactView;
|
|
149
|
+
__weak ANNPreviewRecord *weakRecord = record;
|
|
150
|
+
NSUInteger generation = record.generation;
|
|
151
|
+
// A slot screen hears only the first mount of its slot, not those deeper in it, and a container may show no React
|
|
152
|
+
// content yet: there the view is looked for on each frame until the limit.
|
|
153
|
+
if (!content || [content isKindOfClass:ANNSlotScreenView.class]) {
|
|
154
|
+
[self searchNextFrame:record];
|
|
155
|
+
} else {
|
|
156
|
+
record.watched = content;
|
|
157
|
+
[content setContentDidMount:^{
|
|
158
|
+
ANNPreviewRecord *searching = weakRecord;
|
|
159
|
+
if (searching && generation == ANNReloadCoordinator.generation) {
|
|
160
|
+
[ANNPreviewPush search:searching last:NO];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
forKey:[self mountKeyOf:record]];
|
|
164
|
+
}
|
|
165
|
+
int64_t delay = (int64_t)(ANNPreviewSearchLimit * NSEC_PER_SEC);
|
|
166
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay), dispatch_get_main_queue(), ^{
|
|
167
|
+
ANNPreviewRecord *searching = weakRecord;
|
|
168
|
+
if (searching && generation == ANNReloadCoordinator.generation) {
|
|
169
|
+
[ANNPreviewPush search:searching last:YES];
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// One more search on the next frame, and so on until the view is found or the preview goes; after a reload, none.
|
|
175
|
+
+ (void)searchNextFrame:(ANNPreviewRecord *)record {
|
|
176
|
+
__weak ANNPreviewRecord *weakRecord = record;
|
|
177
|
+
NSUInteger generation = record.generation;
|
|
178
|
+
int64_t delay = (int64_t)(ANNPreviewSearchInterval * NSEC_PER_SEC);
|
|
179
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay), dispatch_get_main_queue(), ^{
|
|
180
|
+
ANNPreviewRecord *searching = weakRecord;
|
|
181
|
+
if (searching && generation == ANNReloadCoordinator.generation &&
|
|
182
|
+
![ANNPreviewPush search:searching last:NO]) {
|
|
183
|
+
[ANNPreviewPush searchNextFrame:searching];
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// YES when the search is over: the view was found, or the preview went or stopped. Each search asks first whether the
|
|
189
|
+
// preview still lives: a source that went makes it go, a reload stops it silently. The last one, not finding the view,
|
|
190
|
+
// makes the preview go.
|
|
191
|
+
+ (BOOL)search:(ANNPreviewRecord *)record last:(BOOL)last {
|
|
192
|
+
if (record.done || record.attached) {
|
|
193
|
+
return YES;
|
|
194
|
+
}
|
|
118
195
|
if (record.generation != ANNReloadCoordinator.generation) {
|
|
119
|
-
return;
|
|
196
|
+
return YES;
|
|
120
197
|
}
|
|
121
198
|
UIViewController *source = record.source;
|
|
122
199
|
if (!source || source.nodeHelper.destroyed) {
|
|
123
200
|
[self gone:record];
|
|
124
|
-
return;
|
|
201
|
+
return YES;
|
|
125
202
|
}
|
|
126
203
|
// Read only: the view is found by its `nativeID`, and its tag is its current Fabric tag.
|
|
127
204
|
UIView *view = [ANNPopoverPresenter viewWithNativeID:record.nativeID in:source.viewIfLoaded];
|
|
128
205
|
if (view) {
|
|
129
206
|
[self attach:record toView:view source:source];
|
|
130
|
-
return;
|
|
207
|
+
return YES;
|
|
131
208
|
}
|
|
132
|
-
if (
|
|
209
|
+
if (last) {
|
|
133
210
|
[self gone:record];
|
|
134
|
-
return;
|
|
211
|
+
return YES;
|
|
135
212
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
213
|
+
return NO;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// The key of the search's mount handler: one per preview, so that two previews of one source don't replace each other.
|
|
217
|
+
+ (NSString *)mountKeyOf:(ANNPreviewRecord *)record {
|
|
218
|
+
return [@"preview." stringByAppendingString:record.previewId];
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// The search stops hearing the mounts: only its own handler goes.
|
|
222
|
+
+ (void)stopWatching:(ANNPreviewRecord *)record {
|
|
223
|
+
UIView<ANNComponentProtocol> *content = record.watched;
|
|
224
|
+
record.watched = nil;
|
|
225
|
+
[content setContentDidMount:nil forKey:[self mountKeyOf:record]];
|
|
144
226
|
}
|
|
145
227
|
|
|
146
228
|
+ (void)attach:(ANNPreviewRecord *)record toView:(UIView *)view source:(UIViewController *)source {
|
|
147
229
|
record.attached = YES;
|
|
230
|
+
[self stopWatching:record];
|
|
148
231
|
__weak ANNPreviewRecord *weakRecord = record;
|
|
232
|
+
BOOL (^prepare)(void) = ^BOOL {
|
|
233
|
+
return [ANNPreviewPush renderAtPress:weakRecord];
|
|
234
|
+
};
|
|
149
235
|
BOOL (^commit)(void) = ^BOOL {
|
|
150
236
|
return [ANNPreviewPush commit:weakRecord];
|
|
151
237
|
};
|
|
@@ -156,10 +242,35 @@ static NSMutableDictionary<NSString *, ANNPreviewRecord *> *ANNPreviewRecords(vo
|
|
|
156
242
|
toView:view
|
|
157
243
|
reactTag:view.tag
|
|
158
244
|
source:source
|
|
245
|
+
prepare:prepare
|
|
159
246
|
commit:commit
|
|
160
247
|
dismissed:dismissed];
|
|
161
248
|
}
|
|
162
249
|
|
|
250
|
+
#pragma mark - The press
|
|
251
|
+
|
|
252
|
+
// The press starts (UIKit asks for the menu's configuration, about half a second before it shows the preview): the
|
|
253
|
+
// screen renders now if it hasn't yet, so that its content is there when the preview shows. Out of the command's
|
|
254
|
+
// runner, a failure rejects the push with its text and the preview goes. YES when the screen rendered. A preview of the
|
|
255
|
+
// JavaScript before a reload renders nothing: its screen would start in the new one.
|
|
256
|
+
+ (BOOL)renderAtPress:(ANNPreviewRecord *)record {
|
|
257
|
+
if (!record || record.done || !record.answer.isCurrent) {
|
|
258
|
+
return NO;
|
|
259
|
+
}
|
|
260
|
+
if (record.rendered) {
|
|
261
|
+
return YES;
|
|
262
|
+
}
|
|
263
|
+
@try {
|
|
264
|
+
[self parkAndRender:record];
|
|
265
|
+
} @catch (NSException *exception) {
|
|
266
|
+
[self finish:record];
|
|
267
|
+
[record.screen destroy];
|
|
268
|
+
[record.answer reject:[ANNCommandRunner rejectionOf:exception what:record.what]];
|
|
269
|
+
return NO;
|
|
270
|
+
}
|
|
271
|
+
return YES;
|
|
272
|
+
}
|
|
273
|
+
|
|
163
274
|
#pragma mark - The tap
|
|
164
275
|
|
|
165
276
|
// YES once the core took the preview: a key that leads back to an entry, or the push the queue accepted. From then on
|
|
@@ -206,7 +317,9 @@ static NSMutableDictionary<NSString *, ANNPreviewRecord *> *ANNPreviewRecords(vo
|
|
|
206
317
|
return YES;
|
|
207
318
|
}
|
|
208
319
|
// The preview grows into the screen: a push without an animation, and without a wait, as the screen rendered
|
|
209
|
-
// already; its answer at the end of the transaction.
|
|
320
|
+
// already; its answer at the end of the transaction. A screen that rendered only as the menu opened (a pointer's
|
|
321
|
+
// right click, then a quick tap) may have no content yet: its push waits for it as a push does.
|
|
322
|
+
BOOL waits = ANNPreviewRendersAtPress(screen) && !screen.reactView.isReady;
|
|
210
323
|
[stack setKey:key ofEntry:screen];
|
|
211
324
|
[stack.queue push:screen
|
|
212
325
|
answer:record.answer
|
|
@@ -214,7 +327,7 @@ static NSMutableDictionary<NSString *, ANNPreviewRecord *> *ANNPreviewRecords(vo
|
|
|
214
327
|
componentId:record.componentId
|
|
215
328
|
source:entry
|
|
216
329
|
animated:NO
|
|
217
|
-
waits:
|
|
330
|
+
waits:waits];
|
|
218
331
|
return YES;
|
|
219
332
|
}
|
|
220
333
|
|
|
@@ -231,9 +344,10 @@ static NSMutableDictionary<NSString *, ANNPreviewRecord *> *ANNPreviewRecords(vo
|
|
|
231
344
|
[record.answer reject:[ANNErrorTexts previewGone:record.previewId]];
|
|
232
345
|
}
|
|
233
346
|
|
|
234
|
-
// The record is done: the screen leaves its unseen place, the table forgets it.
|
|
347
|
+
// The record is done: the search stops, the screen leaves its unseen place, the table forgets it.
|
|
235
348
|
+ (void)finish:(ANNPreviewRecord *)record {
|
|
236
349
|
record.done = YES;
|
|
350
|
+
[self stopWatching:record];
|
|
237
351
|
[self unpark:record];
|
|
238
352
|
if (ANNPreviewRecords()[record.previewId] == record) {
|
|
239
353
|
[ANNPreviewRecords() removeObjectForKey:record.previewId];
|
|
@@ -286,6 +400,7 @@ static NSMutableDictionary<NSString *, ANNPreviewRecord *> *ANNPreviewRecords(vo
|
|
|
286
400
|
NSMutableArray<UIViewController *> *screens = [NSMutableArray new];
|
|
287
401
|
for (ANNPreviewRecord *record in ANNPreviewRecords().allValues) {
|
|
288
402
|
record.done = YES;
|
|
403
|
+
[self stopWatching:record];
|
|
289
404
|
[self unpark:record];
|
|
290
405
|
if (!record.attached) {
|
|
291
406
|
[screens addObject:record.screen];
|
|
@@ -12,13 +12,18 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
12
12
|
from:(UIViewController *)from
|
|
13
13
|
to:(UIViewController *)to;
|
|
14
14
|
|
|
15
|
+
/// The interaction of the swipe back that plays `animator`; nil for any other transition.
|
|
16
|
+
- (nullable id<UIViewControllerInteractiveTransitioning>)interactionForAnimator:
|
|
17
|
+
(id<UIViewControllerAnimatedTransitioning>)animator;
|
|
18
|
+
|
|
15
19
|
@end
|
|
16
20
|
|
|
17
21
|
/// The stack's delegate while a custom animation may be needed: it answers what the stack answers as its own delegate —
|
|
18
22
|
/// every method the stack implements goes to the stack — and also the choice of the transition object. A delegate with
|
|
19
23
|
/// that method turns the iOS 26 content swipe off, so the stack sets this one only while the top's `animations.pop`,
|
|
20
|
-
/// the pushed screen's `animations.push` or a running `setStackRoot` is its own, and itself otherwise.
|
|
21
|
-
///
|
|
24
|
+
/// the pushed screen's `animations.push` or a running `setStackRoot` is its own, and itself otherwise. An interaction
|
|
25
|
+
/// controller only while `answersInteraction`: the stack's own swipe back then plays the top's own pop under the
|
|
26
|
+
/// finger; otherwise UIKit doesn't see the method, and the swipe stays UIKit's.
|
|
22
27
|
@interface ANNStackAnimatingDelegate : NSObject <UINavigationControllerDelegate>
|
|
23
28
|
|
|
24
29
|
- (instancetype)initWithStack:(UINavigationController<ANNStackAnimating> *)stack
|
|
@@ -27,6 +32,10 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
27
32
|
- (instancetype)init NS_UNAVAILABLE;
|
|
28
33
|
+ (instancetype)new NS_UNAVAILABLE;
|
|
29
34
|
|
|
35
|
+
/// The top's pop follows the swipe back (`animations.pop.interactive`). UIKit reads the delegate's methods when it is
|
|
36
|
+
/// set: the stack sets the delegate again after a change.
|
|
37
|
+
@property(nonatomic) BOOL answersInteraction;
|
|
38
|
+
|
|
30
39
|
@end
|
|
31
40
|
|
|
32
41
|
NS_ASSUME_NONNULL_END
|
|
@@ -12,16 +12,16 @@
|
|
|
12
12
|
return self;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
// The choice of the transition object is this delegate's own; the interaction controller
|
|
16
|
-
// methods of `UINavigationControllerDelegate` are the stack's when the
|
|
17
|
-
// forwarded (design 11).
|
|
15
|
+
// The choice of the transition object is this delegate's own; the interaction controller too, answered only while
|
|
16
|
+
// the top's pop follows the swipe. The other methods of `UINavigationControllerDelegate` are the stack's when the
|
|
17
|
+
// stack has them; nothing outside the protocol is forwarded (design 11).
|
|
18
18
|
static BOOL ANNIsOwnSelector(SEL selector) {
|
|
19
19
|
SEL animation = @selector(navigationController:
|
|
20
20
|
animationControllerForOperation:fromViewController:toViewController:);
|
|
21
21
|
return selector == animation;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
static BOOL
|
|
24
|
+
static BOOL ANNIsInteractionSelector(SEL selector) {
|
|
25
25
|
return selector == @selector(navigationController:interactionControllerForAnimationController:);
|
|
26
26
|
}
|
|
27
27
|
|
|
@@ -33,7 +33,7 @@ static BOOL ANNIsDelegateSelector(SEL selector) {
|
|
|
33
33
|
|
|
34
34
|
// A method of the protocol this delegate passes to the stack.
|
|
35
35
|
- (BOOL)forwardsToStack:(SEL)selector {
|
|
36
|
-
return !ANNIsOwnSelector(selector) && !
|
|
36
|
+
return !ANNIsOwnSelector(selector) && !ANNIsInteractionSelector(selector) &&
|
|
37
37
|
ANNIsDelegateSelector(selector) && [_stack respondsToSelector:selector];
|
|
38
38
|
}
|
|
39
39
|
|
|
@@ -41,8 +41,8 @@ static BOOL ANNIsDelegateSelector(SEL selector) {
|
|
|
41
41
|
if (ANNIsOwnSelector(selector)) {
|
|
42
42
|
return YES;
|
|
43
43
|
}
|
|
44
|
-
if (
|
|
45
|
-
return
|
|
44
|
+
if (ANNIsInteractionSelector(selector)) {
|
|
45
|
+
return _answersInteraction;
|
|
46
46
|
}
|
|
47
47
|
if ([super respondsToSelector:selector]) {
|
|
48
48
|
return YES;
|
|
@@ -89,4 +89,11 @@ static BOOL ANNIsDelegateSelector(SEL selector) {
|
|
|
89
89
|
return [_stack animatorForOperation:operation from:fromVC to:toVC];
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
- (id<UIViewControllerInteractiveTransitioning>)
|
|
93
|
+
navigationController:(UINavigationController *)navigationController
|
|
94
|
+
interactionControllerForAnimationController:
|
|
95
|
+
(id<UIViewControllerAnimatedTransitioning>)animationController {
|
|
96
|
+
return [_stack interactionForAnimator:animationController];
|
|
97
|
+
}
|
|
98
|
+
|
|
92
99
|
@end
|
|
@@ -93,6 +93,14 @@ FOUNDATION_EXPORT NSString *_Nullable ANNStackKeyOfLayout(ANNLayoutNode *node);
|
|
|
93
93
|
/// it), or UIKit's More navigation shows the stack's first screen only (its swipe goes back to the More list).
|
|
94
94
|
- (BOOL)swipeBackIsUIKits:(UIGestureRecognizer *)recognizer;
|
|
95
95
|
|
|
96
|
+
/// The swipe of `recognizer` may play the pop: the stack's own swipe (from the leading edge, toward the trailing side)
|
|
97
|
+
/// only while the top's pop follows the finger (`animations.pop.interactive`) and the screen under is in place, UIKit's
|
|
98
|
+
/// swipes of the stack's navigation only while it doesn't. Every other swipe may.
|
|
99
|
+
- (BOOL)swipeBackTakes:(UIGestureRecognizer *)recognizer;
|
|
100
|
+
|
|
101
|
+
/// `recognizer` is the stack's own swipe back, not one of UIKit's.
|
|
102
|
+
- (BOOL)swipeBackIsStacks:(UIGestureRecognizer *)recognizer;
|
|
103
|
+
|
|
96
104
|
/// The stack has one entry: there is nowhere to go back to.
|
|
97
105
|
@property(nonatomic, readonly) BOOL hasOneEntry;
|
|
98
106
|
|