@apexnative/navigation 1.0.0-alpha.1 → 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 +120 -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/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 +3 -1
- 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
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#import "ANNSearchPresenter.h"
|
|
2
2
|
#import "ANNEventEmitter.h"
|
|
3
|
-
#import "
|
|
3
|
+
#import "ANNScreenEnvironment.h"
|
|
4
4
|
#import "ANNSearchResultsViewController.h"
|
|
5
|
+
#import "ANNUserChoice.h"
|
|
5
6
|
|
|
6
7
|
static void *ANNSearchFieldColorContext = &ANNSearchFieldColorContext;
|
|
7
8
|
|
|
@@ -49,6 +50,47 @@ static NSString *ANNResultsKey(ANNComponentOptions *component) {
|
|
|
49
50
|
return [NSString stringWithFormat:@"%@\n%@", component.name.get, component.componentId.get];
|
|
50
51
|
}
|
|
51
52
|
|
|
53
|
+
static NSString *const ANNScopeChoiceKey = @"topBar.searchBar.selectedScope";
|
|
54
|
+
static NSString *const ANNTokensChoiceKey = @"topBar.searchBar.tokens";
|
|
55
|
+
static NSString *const ANNSuggestionsChoiceKey = @"topBar.searchBar.suggestions";
|
|
56
|
+
|
|
57
|
+
static BOOL ANNHasScope(ANNNavigationOptions *options, NSString *scopeId) {
|
|
58
|
+
for (ANNSearchScopeOptions *scope in options.topBar.searchBar.scopes) {
|
|
59
|
+
if ([[scope.identifier withDefault:nil] isEqualToString:scopeId]) {
|
|
60
|
+
return YES;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return NO;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// The scope the user picked, by its id: it stays over the app's `selectedScope` where the scopes have it, as on
|
|
67
|
+
// Android (`UserChoices.yieldTo`). It goes at a merge into the screen that gives another `selectedScope` than the app
|
|
68
|
+
// had there (the own options', else the screen's resolution before the merge), or after which the screen's scopes
|
|
69
|
+
// don't have it.
|
|
70
|
+
static ANNUserChoice *ANNScopeChoice(NSString *scope) {
|
|
71
|
+
return [ANNUserChoice choiceWithValue:scope
|
|
72
|
+
apply:^(ANNNavigationOptions *options, id value) {
|
|
73
|
+
if (ANNHasScope(options, value)) {
|
|
74
|
+
options.topBar.searchBar.selectedScope = [Text withValue:value];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
merged:^id(id value, ANNNavigationOptions *merge, ANNNavigationOptions *own,
|
|
78
|
+
ANNNavigationOptions *before, ANNNavigationOptions *after) {
|
|
79
|
+
if (!ANNHasScope(after, value)) {
|
|
80
|
+
return nil;
|
|
81
|
+
}
|
|
82
|
+
Text *given = merge.topBar.searchBar.selectedScope;
|
|
83
|
+
if (!given.hasValue) {
|
|
84
|
+
return value;
|
|
85
|
+
}
|
|
86
|
+
Text *ownScope = own.topBar.searchBar.selectedScope;
|
|
87
|
+
Text *was = ownScope.hasValue ? ownScope : before.topBar.searchBar.selectedScope;
|
|
88
|
+
NSString *merged = [given withDefault:nil];
|
|
89
|
+
NSString *had = [was withDefault:nil];
|
|
90
|
+
return merged == had || [merged isEqualToString:had] ? value : nil;
|
|
91
|
+
}];
|
|
92
|
+
}
|
|
93
|
+
|
|
52
94
|
@interface ANNSearchPresenter () <UISearchResultsUpdating, UISearchBarDelegate, UISearchControllerDelegate>
|
|
53
95
|
@end
|
|
54
96
|
|
|
@@ -256,7 +298,7 @@ static NSString *ANNResultsKey(ANNComponentOptions *component) {
|
|
|
256
298
|
_appliedSuggestions = nil;
|
|
257
299
|
if (_resultsComponentId) {
|
|
258
300
|
[_componentRegistry removeChildComponent:_resultsComponentId];
|
|
259
|
-
[
|
|
301
|
+
[ANNScreenEnvironment removeScreenId:_resultsComponentId];
|
|
260
302
|
}
|
|
261
303
|
_resultsKey = nil;
|
|
262
304
|
_resultsComponentId = nil;
|
|
@@ -380,9 +422,11 @@ static NSString *ANNResultsKey(ANNComponentOptions *component) {
|
|
|
380
422
|
|
|
381
423
|
#pragma mark - Tokens
|
|
382
424
|
|
|
425
|
+
// A token's key names its icon by the source the options give, never by the decoded image: a key read before and after
|
|
426
|
+
// the cache lets the image go, or a file at the same path changes, stays the same, and computing it loads nothing.
|
|
383
427
|
static NSString *ANNTokenKey(ANNSearchTokenOptions *token) {
|
|
384
428
|
return [NSString stringWithFormat:@"%@\n%@\n%@\n%@", [token.identifier withDefault:@""], [token.text withDefault:@""],
|
|
385
|
-
[token.sfSymbol withDefault:@""],
|
|
429
|
+
[token.sfSymbol withDefault:@""], token.icon.source.sourceKey ?: @""];
|
|
386
430
|
}
|
|
387
431
|
|
|
388
432
|
static NSArray<NSString *> *ANNTokenIds(NSArray<UISearchToken *> *tokens) {
|
|
@@ -395,6 +439,59 @@ static NSArray<NSString *> *ANNTokenIds(NSArray<UISearchToken *> *tokens) {
|
|
|
395
439
|
return ids;
|
|
396
440
|
}
|
|
397
441
|
|
|
442
|
+
static NSArray<NSString *> *ANNTokenKeys(NSArray<ANNSearchTokenOptions *> *tokens) {
|
|
443
|
+
NSMutableArray<NSString *> *keys = [NSMutableArray new];
|
|
444
|
+
for (ANNSearchTokenOptions *token in tokens) {
|
|
445
|
+
[keys addObject:ANNTokenKey(token)];
|
|
446
|
+
}
|
|
447
|
+
return keys;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// The tokens the field has after the user deleted some (or brought them back with Undo), as copies of their options:
|
|
451
|
+
// they stay over the app's `tokens` until a merge gives a list other than the app had there (the own options', else
|
|
452
|
+
// the screen's resolution before the merge), as the other choices. After a merge the tokens the screen's resolution no
|
|
453
|
+
// longer has (by id) leave the choice, and all of them when it has no `tokens`.
|
|
454
|
+
static ANNUserChoice *ANNTokensChoice(NSArray<ANNSearchTokenOptions *> *tokens) {
|
|
455
|
+
return [ANNUserChoice choiceWithValue:tokens
|
|
456
|
+
apply:^(ANNNavigationOptions *options, id value) {
|
|
457
|
+
// Copies: two trees never share a group.
|
|
458
|
+
NSArray<ANNSearchTokenOptions *> *kept = value;
|
|
459
|
+
NSMutableArray<ANNSearchTokenOptions *> *copies =
|
|
460
|
+
[NSMutableArray arrayWithCapacity:kept.count];
|
|
461
|
+
for (ANNSearchTokenOptions *token in kept) {
|
|
462
|
+
[copies addObject:[token copy]];
|
|
463
|
+
}
|
|
464
|
+
options.topBar.searchBar.tokens = copies;
|
|
465
|
+
}
|
|
466
|
+
merged:^id(id value, ANNNavigationOptions *merge, ANNNavigationOptions *own,
|
|
467
|
+
ANNNavigationOptions *before, ANNNavigationOptions *after) {
|
|
468
|
+
NSArray<ANNSearchTokenOptions *> *now = after.topBar.searchBar.tokens;
|
|
469
|
+
if (!now) {
|
|
470
|
+
return nil;
|
|
471
|
+
}
|
|
472
|
+
NSArray<ANNSearchTokenOptions *> *given = merge.topBar.searchBar.tokens;
|
|
473
|
+
if (given) {
|
|
474
|
+
NSArray<ANNSearchTokenOptions *> *was =
|
|
475
|
+
own.topBar.searchBar.tokens ?: before.topBar.searchBar.tokens;
|
|
476
|
+
if (!was || ![ANNTokenKeys(given) isEqualToArray:ANNTokenKeys(was)]) {
|
|
477
|
+
return nil;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
NSMutableSet<NSString *> *ids = [NSMutableSet new];
|
|
481
|
+
for (ANNSearchTokenOptions *token in now) {
|
|
482
|
+
[ids addObject:[token.identifier withDefault:@""]];
|
|
483
|
+
}
|
|
484
|
+
NSArray<ANNSearchTokenOptions *> *chosen = value;
|
|
485
|
+
NSMutableArray<ANNSearchTokenOptions *> *kept = [NSMutableArray new];
|
|
486
|
+
for (ANNSearchTokenOptions *token in chosen) {
|
|
487
|
+
if ([ids containsObject:[token.identifier withDefault:@""]]) {
|
|
488
|
+
[kept addObject:token];
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return kept.count == chosen.count ? value : kept;
|
|
492
|
+
}];
|
|
493
|
+
}
|
|
494
|
+
|
|
398
495
|
// The field gets the tokens again only when the options changed: setting them resets the user's selection.
|
|
399
496
|
- (void)applyTokens:(NSArray<ANNSearchTokenOptions *> *)tokens field:(UISearchTextField *)field {
|
|
400
497
|
if (!tokens) {
|
|
@@ -426,7 +523,7 @@ static NSArray<NSString *> *ANNTokenIds(NSArray<UISearchToken *> *tokens) {
|
|
|
426
523
|
field.tokens = searchTokens;
|
|
427
524
|
}
|
|
428
525
|
|
|
429
|
-
// The tokens the field has now,
|
|
526
|
+
// The tokens the field has now, kept in the screen's user layer when the user deleted some (or brought them back with
|
|
430
527
|
// Undo), so the options apply them as they are. Their ids, or nil when the search bar has no tokens option.
|
|
431
528
|
- (NSArray<NSString *> *)syncTokens:(UISearchTextField *)field {
|
|
432
529
|
if (!_tokenOptions) {
|
|
@@ -444,24 +541,73 @@ static NSArray<NSString *> *ANNTokenIds(NSArray<UISearchToken *> *tokens) {
|
|
|
444
541
|
}
|
|
445
542
|
if (![_appliedTokens isEqualToArray:keys]) {
|
|
446
543
|
_appliedTokens = keys;
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
}];
|
|
544
|
+
// Copies: the objects above belong to the applied tree, and two trees never share a group.
|
|
545
|
+
NSMutableArray<ANNSearchTokenOptions *> *kept =
|
|
546
|
+
[NSMutableArray arrayWithCapacity:tokens.count];
|
|
547
|
+
for (ANNSearchTokenOptions *token in tokens) {
|
|
548
|
+
[kept addObject:[token copy]];
|
|
549
|
+
}
|
|
550
|
+
[_viewController setUserChoice:ANNTokensChoice(kept) forKey:ANNTokensChoiceKey];
|
|
455
551
|
}
|
|
456
552
|
return ids;
|
|
457
553
|
}
|
|
458
554
|
|
|
459
555
|
#pragma mark - Suggestions
|
|
460
556
|
|
|
557
|
+
// A suggestion's key names its icon by its source, as a token's does (`ANNTokenKey`).
|
|
461
558
|
static NSString *ANNSuggestionKey(ANNSearchSuggestionOptions *suggestion) {
|
|
462
559
|
return [NSString stringWithFormat:@"%@\n%@\n%@\n%@\n%@", [suggestion.identifier withDefault:@""],
|
|
463
560
|
[suggestion.title withDefault:@""], [suggestion.accessibilityLabel withDefault:@""],
|
|
464
|
-
[suggestion.sfSymbol withDefault:@""],
|
|
561
|
+
[suggestion.sfSymbol withDefault:@""], suggestion.icon.source.sourceKey ?: @""];
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
static NSArray<NSString *> *ANNSuggestionKeys(NSArray<ANNSearchSuggestionOptions *> *suggestions) {
|
|
565
|
+
NSMutableArray<NSString *> *keys = [NSMutableArray new];
|
|
566
|
+
for (ANNSearchSuggestionOptions *suggestion in suggestions) {
|
|
567
|
+
[keys addObject:ANNSuggestionKey(suggestion)];
|
|
568
|
+
}
|
|
569
|
+
return keys;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// The suggestions UIKit removed, by their keys: they stay out of the app's `suggestions` until the next merge that
|
|
573
|
+
// gives `suggestions`, any list, the same one again too (a fixed list sent on every search-updated event shows each
|
|
574
|
+
// time), as on Android, which shows whatever list a merge gives. After a merge without them the removed ones the
|
|
575
|
+
// screen's resolution no longer has leave the choice.
|
|
576
|
+
static ANNUserChoice *ANNRemovedSuggestionsChoice(NSArray<NSString *> *removed) {
|
|
577
|
+
return [ANNUserChoice choiceWithValue:removed
|
|
578
|
+
apply:^(ANNNavigationOptions *options, id value) {
|
|
579
|
+
NSArray<ANNSearchSuggestionOptions *> *suggestions = options.topBar.searchBar.suggestions;
|
|
580
|
+
if (!suggestions) {
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
NSSet<NSString *> *gone = [NSSet setWithArray:value];
|
|
584
|
+
NSMutableArray<ANNSearchSuggestionOptions *> *kept = [NSMutableArray new];
|
|
585
|
+
for (ANNSearchSuggestionOptions *suggestion in suggestions) {
|
|
586
|
+
if (![gone containsObject:ANNSuggestionKey(suggestion)]) {
|
|
587
|
+
[kept addObject:suggestion];
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
options.topBar.searchBar.suggestions = kept;
|
|
591
|
+
}
|
|
592
|
+
merged:^id(id value, ANNNavigationOptions *merge, ANNNavigationOptions *own,
|
|
593
|
+
ANNNavigationOptions *before, ANNNavigationOptions *after) {
|
|
594
|
+
if (merge.topBar.searchBar.suggestions) {
|
|
595
|
+
return nil;
|
|
596
|
+
}
|
|
597
|
+
NSSet<NSString *> *now =
|
|
598
|
+
[NSSet setWithArray:ANNSuggestionKeys(after.topBar.searchBar.suggestions)];
|
|
599
|
+
NSArray<NSString *> *removed = value;
|
|
600
|
+
NSMutableArray<NSString *> *kept = [NSMutableArray new];
|
|
601
|
+
for (NSString *key in removed) {
|
|
602
|
+
if ([now containsObject:key]) {
|
|
603
|
+
[kept addObject:key];
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
if (kept.count == 0) {
|
|
607
|
+
return nil;
|
|
608
|
+
}
|
|
609
|
+
return kept.count == removed.count ? value : kept;
|
|
610
|
+
}];
|
|
465
611
|
}
|
|
466
612
|
|
|
467
613
|
- (void)applySuggestions:(NSArray<ANNSearchSuggestionOptions *> *)suggestions
|
|
@@ -491,13 +637,20 @@ static NSString *ANNSuggestionKey(ANNSearchSuggestionOptions *suggestion) {
|
|
|
491
637
|
search.searchSuggestions = items.count ? items : nil;
|
|
492
638
|
}
|
|
493
639
|
|
|
494
|
-
// UIKit has removed the suggestions:
|
|
640
|
+
// UIKit has removed the suggestions: the screen's user layer keeps them out, with those it removed before, until the
|
|
641
|
+
// next mergeOptions that gives suggestions, which show.
|
|
495
642
|
- (void)syncSuggestions:(UISearchController *)search API_AVAILABLE(ios(16.0)) {
|
|
496
643
|
if (_appliedSuggestions.count && !search.searchSuggestions.count) {
|
|
644
|
+
NSArray<NSString *> *removed = _appliedSuggestions;
|
|
497
645
|
_appliedSuggestions = @[];
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
646
|
+
UIViewController<ANNLayoutProtocol> *viewController = _viewController;
|
|
647
|
+
ANNUserChoice *before = [viewController userChoiceForKey:ANNSuggestionsChoiceKey];
|
|
648
|
+
NSArray<NSString *> *removedBefore = before.value;
|
|
649
|
+
if (removedBefore.count) {
|
|
650
|
+
removed = [removedBefore arrayByAddingObjectsFromArray:removed];
|
|
651
|
+
}
|
|
652
|
+
[viewController setUserChoice:ANNRemovedSuggestionsChoice(removed)
|
|
653
|
+
forKey:ANNSuggestionsChoiceKey];
|
|
501
654
|
}
|
|
502
655
|
}
|
|
503
656
|
|
|
@@ -606,14 +759,12 @@ static NSString *ANNSuggestionKey(ANNSearchSuggestionOptions *suggestion) {
|
|
|
606
759
|
}
|
|
607
760
|
}
|
|
608
761
|
|
|
609
|
-
// The pick is
|
|
762
|
+
// The pick is kept in the screen's user layer, so it stays when the options apply again. UIKit then updates the
|
|
610
763
|
// search results: searchBarUpdated carries the new scope.
|
|
611
764
|
- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope {
|
|
612
765
|
NSString *scope = [self selectedScope:searchBar];
|
|
613
766
|
if (scope) {
|
|
614
|
-
[_viewController
|
|
615
|
-
options.topBar.searchBar.selectedScope = [Text withValue:scope];
|
|
616
|
-
}];
|
|
767
|
+
[_viewController setUserChoice:ANNScopeChoice(scope) forKey:ANNScopeChoiceKey];
|
|
617
768
|
}
|
|
618
769
|
}
|
|
619
770
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#import "ANNSearchResultsViewController.h"
|
|
2
|
-
#import "
|
|
2
|
+
#import "ANNScreenEnvironment.h"
|
|
3
|
+
#import "ANNScreenSettling.h"
|
|
3
4
|
|
|
4
5
|
@implementation ANNSearchResultsViewController {
|
|
5
6
|
NSString *_componentId;
|
|
@@ -13,6 +14,10 @@
|
|
|
13
14
|
_reactView = reactView;
|
|
14
15
|
_componentId = [componentId copy];
|
|
15
16
|
_eventEmitter = eventEmitter;
|
|
17
|
+
[NSNotificationCenter.defaultCenter addObserver:self
|
|
18
|
+
selector:@selector(screenSettlingDidEnd:)
|
|
19
|
+
name:ANNScreenSettlingDidEndNotification
|
|
20
|
+
object:nil];
|
|
16
21
|
return self;
|
|
17
22
|
}
|
|
18
23
|
|
|
@@ -29,11 +34,29 @@
|
|
|
29
34
|
- (void)viewDidLayoutSubviews {
|
|
30
35
|
[super viewDidLayoutSubviews];
|
|
31
36
|
_reactView.frame = self.view.bounds;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
+
[self updateInsets];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Not while the geometry settles: the steps of a fold would reach JavaScript one by one, and its end sends them. The
|
|
41
|
+
// first values go at once: JavaScript reads them as it renders the results.
|
|
42
|
+
- (void)updateInsets {
|
|
43
|
+
if (!_componentId) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (!ANNScreenSettling.isSettling || ![ANNScreenEnvironment insetsForScreenId:_componentId]) {
|
|
47
|
+
[ANNScreenEnvironment setInsets:self.view.safeAreaInsets
|
|
48
|
+
padding:UIEdgeInsetsZero
|
|
49
|
+
forScreenId:_componentId
|
|
50
|
+
eventEmitter:_eventEmitter];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Only results that show, for the JavaScript they were made for, and while their record is kept: the search bar's
|
|
55
|
+
// removal removed it, and hidden results send theirs as they lay out again.
|
|
56
|
+
- (void)screenSettlingDidEnd:(NSNotification *)notification {
|
|
57
|
+
if (_componentId && self.viewIfLoaded.window && _eventEmitter.isCurrent &&
|
|
58
|
+
[ANNScreenEnvironment insetsForScreenId:_componentId]) {
|
|
59
|
+
[self updateInsets];
|
|
37
60
|
}
|
|
38
61
|
}
|
|
39
62
|
|
|
@@ -70,8 +70,9 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
70
70
|
- (void)screenDidLayOut;
|
|
71
71
|
- (void)contentDidMount;
|
|
72
72
|
|
|
73
|
-
/// The screen's content is about to go (a pop removes it before `viewDidDisappear`): its lists get the
|
|
74
|
-
/// effect back and the large title's color leaves them; the place of the large title during a pop leaves
|
|
73
|
+
/// The screen's content is about to go (its destroy; a pop removes it before `viewDidDisappear`): its lists get the
|
|
74
|
+
/// system edge effect back and the large title's color leaves them; the place of the large title during a pop leaves
|
|
75
|
+
/// the screen. At `screenDidDisappear` the same, the lists of the edge effects kept for the screen's next appearance.
|
|
75
76
|
- (void)releaseLists;
|
|
76
77
|
|
|
77
78
|
/// Every root of the screen's bar still alive stops, once, on the main queue.
|
|
@@ -88,6 +89,11 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
88
89
|
/// had no large title: a large title that doesn't fold into the list fills its place there until the screen appeared.
|
|
89
90
|
- (void)shownFromLowerBarWithBottom:(CGFloat)oldBarBottom;
|
|
90
91
|
|
|
92
|
+
/// iOS 26, a push starts that brings the screen in with its content drawn, before UIKit's push: its large title keeps
|
|
93
|
+
/// a place in the screen for the whole transition (`screenInPush:` of `ANNLargeTitlePresenter`). Nothing for a screen
|
|
94
|
+
/// that didn't wait parked for its content: its content comes in the push.
|
|
95
|
+
- (void)arrivesByPushOn:(UINavigationController *)navigation;
|
|
96
|
+
|
|
91
97
|
/// iOS 26, a pop or a swipe back starts that reveals the screen, after its will-appear and before UIKit lays it out
|
|
92
98
|
/// for the transition: its large title keeps a place in the window for the whole transition. Returns whether the title
|
|
93
99
|
/// is in that place.
|