@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
package/ios/Options/ANNOptions.h
CHANGED
|
@@ -20,6 +20,13 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
20
20
|
/// The group of options under `key`: nil when it is not an object (`null` included), which reads as an empty group.
|
|
21
21
|
NSDictionary *_Nullable ANNOptionsDictionary(NSDictionary *_Nullable dict, NSString *key);
|
|
22
22
|
|
|
23
|
+
/// Two values a group of options holds are the same: params and groups by `isSameValueAs:`, arrays item by item,
|
|
24
|
+
/// anything else as `ANNJSONValuesSame` says. nil is the same only as nil (an unset array is not an empty one).
|
|
25
|
+
BOOL ANNOptionValuesSame(id _Nullable a, id _Nullable b);
|
|
26
|
+
|
|
27
|
+
/// A hash of a value `ANNOptionValuesSame` compares: values that are the same have the same hash.
|
|
28
|
+
NSUInteger ANNOptionValueHash(id _Nullable value);
|
|
29
|
+
|
|
23
30
|
#if DEBUG
|
|
24
31
|
/// Development only: checks the field table of `root` and of every group class reached through its group and
|
|
25
32
|
/// group-array fields.
|
|
@@ -51,12 +58,30 @@ void ANNCheckOptionClassesFrom(Class root);
|
|
|
51
58
|
/// The group has any value.
|
|
52
59
|
- (BOOL)hasValue;
|
|
53
60
|
|
|
61
|
+
/// Takes the value at `path` out, in place: the JSON keys from this group, the last one a value, an array or a whole
|
|
62
|
+
/// group, which gets what a freshly made group has there (unset). A key of a text's font goes through the text. A
|
|
63
|
+
/// module's group (an empty field table) is walked by its properties named as the keys. NO, and nothing changes, when
|
|
64
|
+
/// a key of the path is none of the group's or a key before the last is no group. Only on a copy of own options
|
|
65
|
+
/// (`changeOwnOptions:`), never on options in use.
|
|
66
|
+
- (BOOL)clearValueAtPath:(NSArray<NSString *> *)path;
|
|
67
|
+
|
|
54
68
|
/// A deep copy: a new group of the same class with these merged into it. The copy shares values, never groups.
|
|
55
69
|
- (instancetype)copy;
|
|
56
70
|
|
|
57
71
|
/// These over a copy of `defaults`; neither changes.
|
|
58
72
|
- (instancetype)withDefault:(nullable ANNOptions *)defaults;
|
|
59
73
|
|
|
74
|
+
/// A group of the same class with the same options, field by field at any depth: two reads of the same JSON, a copy,
|
|
75
|
+
/// two resolutions of the same layers. The fields are the field table's; a module's group (an empty table) compares
|
|
76
|
+
/// every property of an options kind it declares. A value that is nil is the same only as nil.
|
|
77
|
+
///
|
|
78
|
+
/// Not `isEqual:`: a group changes in place (a merge, the pick of a menu's item), so a hash by value would move under
|
|
79
|
+
/// a set or a dictionary that holds it. `==` and `isEqual:` stay identity.
|
|
80
|
+
- (BOOL)isSameValueAs:(nullable ANNOptions *)other;
|
|
81
|
+
|
|
82
|
+
/// A hash consistent with `isSameValueAs:`; it changes when the group does.
|
|
83
|
+
- (NSUInteger)valueHash;
|
|
84
|
+
|
|
60
85
|
@end
|
|
61
86
|
|
|
62
87
|
NS_ASSUME_NONNULL_END
|
|
@@ -11,7 +11,6 @@ NSDictionary *ANNOptionsDictionary(NSDictionary *dict, NSString *key) {
|
|
|
11
11
|
return [value isKindOfClass:NSDictionary.class] ? value : nil;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
#if DEBUG
|
|
15
14
|
// The kinds of property a group holds options in.
|
|
16
15
|
static BOOL ANNIsOptionClass(Class cls) {
|
|
17
16
|
return [cls isSubclassOfClass:ANNParam.class] || [cls isSubclassOfClass:ANNOptions.class] ||
|
|
@@ -33,6 +32,7 @@ static Class ANNPropertyClass(objc_property_t property) {
|
|
|
33
32
|
return name ? NSClassFromString(name) : nil;
|
|
34
33
|
}
|
|
35
34
|
|
|
35
|
+
#if DEBUG
|
|
36
36
|
// There is no iOS test target: in development each group of the core checks once that its table names every property
|
|
37
37
|
// that holds options, and that every field of the table has its property (the stand-in for the whole-tree test of
|
|
38
38
|
// Android). A missing field would be neither read, merged, copied nor given defaults.
|
|
@@ -86,6 +86,94 @@ static NSArray<ANNOptionField *> *ANNFieldsOf(Class cls) {
|
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
+
// The properties that hold the options of a group, asked once per class: its field table's, or for a module's group
|
|
90
|
+
// (its own read and merge, an empty table) every property of an options kind its classes declare up to `ANNOptions`.
|
|
91
|
+
static NSArray<NSString *> *ANNValuePropertiesOf(Class cls) {
|
|
92
|
+
static NSMutableDictionary<NSString *, NSArray<NSString *> *> *propertiesByClass;
|
|
93
|
+
NSString *name = NSStringFromClass(cls);
|
|
94
|
+
@synchronized(ANNOptions.class) {
|
|
95
|
+
if (!propertiesByClass) {
|
|
96
|
+
propertiesByClass = [NSMutableDictionary new];
|
|
97
|
+
}
|
|
98
|
+
NSArray<NSString *> *names = propertiesByClass[name];
|
|
99
|
+
if (names) {
|
|
100
|
+
return names;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
NSArray<ANNOptionField *> *fields = ANNFieldsOf(cls);
|
|
104
|
+
NSMutableArray<NSString *> *found = [NSMutableArray new];
|
|
105
|
+
if (fields.count) {
|
|
106
|
+
for (ANNOptionField *field in fields) {
|
|
107
|
+
[found addObject:field.property];
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
NSSet<NSString *> *inherited =
|
|
111
|
+
[NSSet setWithArray:@[ @"description", @"debugDescription" ]];
|
|
112
|
+
for (Class current = cls; current && current != ANNOptions.class;
|
|
113
|
+
current = class_getSuperclass(current)) {
|
|
114
|
+
unsigned int count = 0;
|
|
115
|
+
objc_property_t *properties = class_copyPropertyList(current, &count);
|
|
116
|
+
for (unsigned int i = 0; i < count; i++) {
|
|
117
|
+
NSString *property = @(property_getName(properties[i]));
|
|
118
|
+
Class propertyClass = ANNPropertyClass(properties[i]);
|
|
119
|
+
if (propertyClass && ANNIsOptionClass(propertyClass) &&
|
|
120
|
+
![inherited containsObject:property] && ![found containsObject:property]) {
|
|
121
|
+
[found addObject:property];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
free(properties);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
NSArray<NSString *> *names = [found copy];
|
|
128
|
+
@synchronized(ANNOptions.class) {
|
|
129
|
+
propertiesByClass[name] = names;
|
|
130
|
+
}
|
|
131
|
+
return names;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
BOOL ANNOptionValuesSame(id a, id b) {
|
|
135
|
+
if (a == b) {
|
|
136
|
+
return YES;
|
|
137
|
+
}
|
|
138
|
+
if ([a isKindOfClass:ANNParam.class]) {
|
|
139
|
+
return [b isKindOfClass:ANNParam.class] && [(ANNParam *)a isSameValueAs:b];
|
|
140
|
+
}
|
|
141
|
+
if ([a isKindOfClass:ANNOptions.class]) {
|
|
142
|
+
return [b isKindOfClass:ANNOptions.class] && [(ANNOptions *)a isSameValueAs:b];
|
|
143
|
+
}
|
|
144
|
+
if ([a isKindOfClass:NSArray.class]) {
|
|
145
|
+
if (![b isKindOfClass:NSArray.class] || [a count] != [b count]) {
|
|
146
|
+
return NO;
|
|
147
|
+
}
|
|
148
|
+
NSArray *items = b;
|
|
149
|
+
NSUInteger index = 0;
|
|
150
|
+
for (id item in (NSArray *)a) {
|
|
151
|
+
if (!ANNOptionValuesSame(item, items[index++])) {
|
|
152
|
+
return NO;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return YES;
|
|
156
|
+
}
|
|
157
|
+
return ANNJSONValuesSame(a, b);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
NSUInteger ANNOptionValueHash(id value) {
|
|
161
|
+
if ([value isKindOfClass:ANNParam.class]) {
|
|
162
|
+
return [(ANNParam *)value valueHash];
|
|
163
|
+
}
|
|
164
|
+
if ([value isKindOfClass:ANNOptions.class]) {
|
|
165
|
+
return [(ANNOptions *)value valueHash];
|
|
166
|
+
}
|
|
167
|
+
if ([value isKindOfClass:NSArray.class]) {
|
|
168
|
+
NSUInteger hash = [value count];
|
|
169
|
+
for (id item in value) {
|
|
170
|
+
hash = hash * 31 + ANNOptionValueHash(item);
|
|
171
|
+
}
|
|
172
|
+
return hash;
|
|
173
|
+
}
|
|
174
|
+
return ANNJSONValueHash(value);
|
|
175
|
+
}
|
|
176
|
+
|
|
89
177
|
#if DEBUG
|
|
90
178
|
// Runs the check on `root` and on every class reached through its group and group-array fields, so a class that only
|
|
91
179
|
// an array holds (a button, an action of a fab, a token of the search bar) is checked although no object of it is made.
|
|
@@ -310,6 +398,51 @@ static NSArray *ANNCopyItems(NSArray *items) {
|
|
|
310
398
|
return NO;
|
|
311
399
|
}
|
|
312
400
|
|
|
401
|
+
// Generic over the whole tree, so that any option an edit takes out (`clearOptions`) goes without a list of options:
|
|
402
|
+
// the field table names each key's property; a module's group, which reads its JSON itself, names its properties as
|
|
403
|
+
// the keys.
|
|
404
|
+
- (BOOL)clearValueAtPath:(NSArray<NSString *> *)path {
|
|
405
|
+
NSString *key = path.firstObject;
|
|
406
|
+
if (key.length == 0) {
|
|
407
|
+
return NO;
|
|
408
|
+
}
|
|
409
|
+
NSArray<ANNOptionField *> *fields = ANNFieldsOf(self.class);
|
|
410
|
+
NSString *property = nil;
|
|
411
|
+
if (fields.count) {
|
|
412
|
+
for (ANNOptionField *field in fields) {
|
|
413
|
+
if ([field.key isEqualToString:key]) {
|
|
414
|
+
property = field.property;
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
if (!property) {
|
|
419
|
+
// A group without a key (the font of a text) holds keys of its parent's object.
|
|
420
|
+
for (ANNOptionField *field in fields) {
|
|
421
|
+
if (field.kind == ANNOptionFieldKindGroup && !field.key &&
|
|
422
|
+
[[self valueForKey:field.property] clearValueAtPath:path]) {
|
|
423
|
+
return YES;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return NO;
|
|
427
|
+
}
|
|
428
|
+
} else if ([ANNValuePropertiesOf(self.class) containsObject:key]) {
|
|
429
|
+
property = key;
|
|
430
|
+
} else {
|
|
431
|
+
return NO;
|
|
432
|
+
}
|
|
433
|
+
if (path.count == 1) {
|
|
434
|
+
ANNOptions *fresh = [[self.class alloc] initWithDict:nil];
|
|
435
|
+
[self setValue:[fresh valueForKey:property] forKey:property];
|
|
436
|
+
return YES;
|
|
437
|
+
}
|
|
438
|
+
id value = [self valueForKey:property];
|
|
439
|
+
if (![value isKindOfClass:ANNOptions.class]) {
|
|
440
|
+
return NO;
|
|
441
|
+
}
|
|
442
|
+
NSArray<NSString *> *rest = [path subarrayWithRange:NSMakeRange(1, path.count - 1)];
|
|
443
|
+
return [(ANNOptions *)value clearValueAtPath:rest];
|
|
444
|
+
}
|
|
445
|
+
|
|
313
446
|
- (id)copyWithZone:(NSZone *)zone {
|
|
314
447
|
ANNOptions *copy = [[self.class alloc] initWithDict:nil];
|
|
315
448
|
[copy mergeOptions:self];
|
|
@@ -326,4 +459,27 @@ static NSArray *ANNCopyItems(NSArray *items) {
|
|
|
326
459
|
return result;
|
|
327
460
|
}
|
|
328
461
|
|
|
462
|
+
- (BOOL)isSameValueAs:(ANNOptions *)other {
|
|
463
|
+
if (other == self) {
|
|
464
|
+
return YES;
|
|
465
|
+
}
|
|
466
|
+
if (other.class != self.class) {
|
|
467
|
+
return NO;
|
|
468
|
+
}
|
|
469
|
+
for (NSString *property in ANNValuePropertiesOf(self.class)) {
|
|
470
|
+
if (!ANNOptionValuesSame([self valueForKey:property], [other valueForKey:property])) {
|
|
471
|
+
return NO;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
return YES;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
- (NSUInteger)valueHash {
|
|
478
|
+
NSUInteger hash = (NSUInteger)(__bridge void *)self.class;
|
|
479
|
+
for (NSString *property in ANNValuePropertiesOf(self.class)) {
|
|
480
|
+
hash = hash * 31 + ANNOptionValueHash([self valueForKey:property]);
|
|
481
|
+
}
|
|
482
|
+
return hash;
|
|
483
|
+
}
|
|
484
|
+
|
|
329
485
|
@end
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
NS_ASSUME_NONNULL_BEGIN
|
|
4
4
|
|
|
5
|
-
/// The one point where options change: a number for the whole process that grows each time a node's own options
|
|
6
|
-
/// default options change. A node's resolved options are cached with the number they were built at,
|
|
7
|
-
/// every cache miss. Main queue.
|
|
5
|
+
/// The one point where options change: a number for the whole process that grows each time a node's own options, its
|
|
6
|
+
/// user layer or the default options change. A node's resolved options are cached with the number they were built at,
|
|
7
|
+
/// so any change makes every cache miss. Main queue.
|
|
8
8
|
///
|
|
9
|
-
/// Exactly
|
|
10
|
-
/// `mergeOwnOptions:` and `changeOwnOptions:` go through)
|
|
11
|
-
///
|
|
9
|
+
/// Exactly three places call `optionsChanged`: the setter of a node's own options (`ANNNodeHelper.options`, which
|
|
10
|
+
/// `mergeOwnOptions:` and `changeOwnOptions:` go through), the setter of its user layer
|
|
11
|
+
/// (`ANNNodeHelper setUserChoice:forKey:`) and the store of new default options (`ANNDefaultOptions`). Nothing else may
|
|
12
|
+
/// change own options, choices or defaults: a write past them would leave caches stale.
|
|
12
13
|
@interface ANNOptionsCache : NSObject
|
|
13
14
|
|
|
14
15
|
/// The generation of the options now.
|
|
@@ -1,12 +1,119 @@
|
|
|
1
1
|
#import "ANNOptionsReader.h"
|
|
2
2
|
#import "ANNAssert.h"
|
|
3
3
|
#import "ANNNavigationOptions.h"
|
|
4
|
+
#if DEBUG
|
|
5
|
+
#import <React/RCTLog.h>
|
|
6
|
+
#endif
|
|
4
7
|
|
|
5
8
|
// The parse runs on the main queue, one tree at a time: the path and the first failure are its state. A group read
|
|
6
9
|
// outside a parse (a module that reads its own JSON) finds an empty path and keeps no failure.
|
|
7
10
|
static NSMutableArray<NSString *> *ANNPathComponents;
|
|
8
11
|
static NSString *ANNFirstFailure;
|
|
9
12
|
|
|
13
|
+
#if DEBUG
|
|
14
|
+
// A deep mutable copy of `json` with `value` at `path` (keys, and indexes of arrays); nil `value` removes the key.
|
|
15
|
+
static id ANNJSONWith(id json, NSArray *path, id value) {
|
|
16
|
+
if (path.count == 0) {
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
NSArray *rest = [path subarrayWithRange:NSMakeRange(1, path.count - 1)];
|
|
20
|
+
if ([json isKindOfClass:NSArray.class]) {
|
|
21
|
+
NSMutableArray *items = [json mutableCopy];
|
|
22
|
+
NSUInteger index = [path[0] unsignedIntegerValue];
|
|
23
|
+
items[index] = ANNJSONWith(items[index], rest, value);
|
|
24
|
+
return items;
|
|
25
|
+
}
|
|
26
|
+
NSMutableDictionary *fields = [json mutableCopy];
|
|
27
|
+
id inner = ANNJSONWith(fields[path[0]], rest, value);
|
|
28
|
+
if (inner) {
|
|
29
|
+
fields[path[0]] = inner;
|
|
30
|
+
} else {
|
|
31
|
+
[fields removeObjectForKey:path[0]];
|
|
32
|
+
}
|
|
33
|
+
return fields;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// There is no iOS test target: in development the value equality of the options (`isSameValueAs:`) checks itself
|
|
37
|
+
// once on a tree with a value of each kind: two reads, a copy and a merge give the same options and the same hash, and
|
|
38
|
+
// a change of one value at any depth gives other options. A module's group (the menu) compares by its properties.
|
|
39
|
+
static void ANNCheckSameValues(void) {
|
|
40
|
+
NSDictionary *button = @{
|
|
41
|
+
@"id" : @"save",
|
|
42
|
+
@"text" : @"Save",
|
|
43
|
+
@"icon" : @{@"system" : @"star"},
|
|
44
|
+
@"enabled" : @YES,
|
|
45
|
+
@"badge" : @1,
|
|
46
|
+
@"fontSize" : @15,
|
|
47
|
+
@"menu" : @{
|
|
48
|
+
@"title" : @"More",
|
|
49
|
+
@"items" : @[ @{@"id" : @"details", @"title" : @"Details", @"checked" : @YES} ],
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
NSDictionary *json = @{
|
|
53
|
+
@"topBar" : @{
|
|
54
|
+
@"title" : @{@"text" : @"Home", @"color" : @(0xFF112233)},
|
|
55
|
+
@"rightButtonColor" : @{@"light" : @(0xFF000000), @"dark" : @(0xFFFFFFFF)},
|
|
56
|
+
@"leftButtonColor" : NSNull.null,
|
|
57
|
+
@"rightButtons" : @[ button ],
|
|
58
|
+
@"leftButtons" : @[],
|
|
59
|
+
@"height" : @44,
|
|
60
|
+
},
|
|
61
|
+
@"keyCommands" : @[ @{@"input" : @"k", @"modifiers" : @[ @"command" ]} ],
|
|
62
|
+
};
|
|
63
|
+
ANNNavigationOptions *options = [[ANNNavigationOptions alloc] initWithDict:json];
|
|
64
|
+
ANNNavigationOptions *again = [[ANNNavigationOptions alloc] initWithDict:json];
|
|
65
|
+
ANNNavigationOptions *copy = [options copy];
|
|
66
|
+
ANNNavigationOptions *overEmpty = [options withDefault:[ANNNavigationOptions new]];
|
|
67
|
+
for (ANNNavigationOptions *same in @[ again, copy, overEmpty ]) {
|
|
68
|
+
if (![options isSameValueAs:same] || options.valueHash != same.valueHash) {
|
|
69
|
+
RCTLogError(@"[ApexNavigation] options read, copied or resolved from the same JSON are "
|
|
70
|
+
@"not the same value");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Each change: the path of one value and its new value; an unset key is not the same as `null` or `[]`.
|
|
74
|
+
NSDictionary<NSString *, NSArray *> *changes = @{
|
|
75
|
+
@"a text" : @[ @[ @"topBar", @"title", @"text" ], @"Profile" ],
|
|
76
|
+
@"a color" : @[ @[ @"topBar", @"title", @"color" ], @(0xFF112234) ],
|
|
77
|
+
@"a side of a color pair" : @[ @[ @"topBar", @"rightButtonColor", @"dark" ], @(0xFFEEEEEE) ],
|
|
78
|
+
@"a number" : @[ @[ @"topBar", @"height" ], @45 ],
|
|
79
|
+
@"an image" : @[ @[ @"topBar", @"rightButtons", @0, @"icon", @"system" ], @"heart" ],
|
|
80
|
+
@"a boolean" : @[ @[ @"topBar", @"rightButtons", @0, @"enabled" ], @NO ],
|
|
81
|
+
@"a boolean for a number" : @[ @[ @"topBar", @"rightButtons", @0, @"badge" ], @YES ],
|
|
82
|
+
@"a font" : @[ @[ @"topBar", @"rightButtons", @0, @"fontSize" ], @16 ],
|
|
83
|
+
@"a module's group" :
|
|
84
|
+
@[ @[ @"topBar", @"rightButtons", @0, @"menu", @"items", @0, @"checked" ], @NO ],
|
|
85
|
+
@"an object of an array" : @[ @[ @"keyCommands", @0, @"modifiers", @0 ], @"shift" ],
|
|
86
|
+
};
|
|
87
|
+
NSDictionary<NSString *, NSArray *> *removals = @{
|
|
88
|
+
@"a color of `null` and no color" : @[ @"topBar", @"leftButtonColor" ],
|
|
89
|
+
@"an empty array and no array" : @[ @"topBar", @"leftButtons" ],
|
|
90
|
+
};
|
|
91
|
+
NSMutableDictionary<NSString *, id> *variants = [NSMutableDictionary new];
|
|
92
|
+
[changes enumerateKeysAndObjectsUsingBlock:^(NSString *what, NSArray *change, BOOL *stop) {
|
|
93
|
+
variants[what] = ANNJSONWith(json, change[0], change[1]);
|
|
94
|
+
}];
|
|
95
|
+
[removals enumerateKeysAndObjectsUsingBlock:^(NSString *what, NSArray *path, BOOL *stop) {
|
|
96
|
+
variants[what] = ANNJSONWith(json, path, nil);
|
|
97
|
+
}];
|
|
98
|
+
[variants enumerateKeysAndObjectsUsingBlock:^(NSString *what, NSDictionary *variant,
|
|
99
|
+
BOOL *stop) {
|
|
100
|
+
ANNNavigationOptions *changed = [[ANNNavigationOptions alloc] initWithDict:variant];
|
|
101
|
+
if ([options isSameValueAs:changed] || [changed isSameValueAs:options]) {
|
|
102
|
+
RCTLogError(@"[ApexNavigation] options that differ in %@ are the same value", what);
|
|
103
|
+
}
|
|
104
|
+
}];
|
|
105
|
+
ANNNavigationOptions *merged = [options copy];
|
|
106
|
+
[merged mergeOptions:[[ANNNavigationOptions alloc]
|
|
107
|
+
initWithDict:@{@"topBar" : @{@"title" : @{@"text" : @"Profile"}}}]];
|
|
108
|
+
ANNNavigationOptions *read = [[ANNNavigationOptions alloc]
|
|
109
|
+
initWithDict:ANNJSONWith(json, @[ @"topBar", @"title", @"text" ], @"Profile")];
|
|
110
|
+
if (![merged isSameValueAs:read] || merged.valueHash != read.valueHash) {
|
|
111
|
+
RCTLogError(@"[ApexNavigation] merged options are not the same value as the same options "
|
|
112
|
+
@"read at once");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
#endif
|
|
116
|
+
|
|
10
117
|
@implementation ANNOptionsReader
|
|
11
118
|
|
|
12
119
|
+ (ANNNavigationOptions *)optionsFrom:(NSDictionary *)json unreadablePath:(NSString **)unreadablePath {
|
|
@@ -15,6 +122,7 @@ static NSString *ANNFirstFailure;
|
|
|
15
122
|
static dispatch_once_t checkOnce;
|
|
16
123
|
dispatch_once(&checkOnce, ^{
|
|
17
124
|
ANNCheckOptionClassesFrom(ANNNavigationOptions.class);
|
|
125
|
+
ANNCheckSameValues();
|
|
18
126
|
});
|
|
19
127
|
#endif
|
|
20
128
|
NSMutableArray<NSString *> *outerPath = ANNPathComponents;
|
|
@@ -15,9 +15,10 @@ typedef NS_ENUM(NSInteger, SearchBarPlacement) {
|
|
|
15
15
|
SearchBarPlacementIntegratedCentered,
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
-
/// `topBar.searchBar` (`OptionsSearchBar`): the search of a screen. `ANNSearchPresenter` applies it. The scope
|
|
19
|
-
/// tokens
|
|
20
|
-
/// stay when the options apply again
|
|
18
|
+
/// `topBar.searchBar` (`OptionsSearchBar`): the search of a screen. `ANNSearchPresenter` applies it. The scope the user
|
|
19
|
+
/// picks, the tokens the user deletes or brings back and the suggestions UIKit removes go into the screen's user layer
|
|
20
|
+
/// (`setUserChoice:forKey:`), not into these options: they stay when the options apply again and through a
|
|
21
|
+
/// `mergeOptions` that sends the same values, and give way when a merge changes the field.
|
|
21
22
|
@interface ANNSearchBarOptions : ANNOptions
|
|
22
23
|
|
|
23
24
|
@property(nonatomic, strong) Bool *visible;
|
|
@@ -7,7 +7,10 @@
|
|
|
7
7
|
*/
|
|
8
8
|
@interface ANNSheetOptions : ANNOptions
|
|
9
9
|
|
|
10
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* The detents as the options give them, in any order and with repeats: NSString ('medium', 'large', 'content') or
|
|
12
|
+
* NSNumber. ANNSheetPresenter sorts them and drops the repeats.
|
|
13
|
+
*/
|
|
11
14
|
@property(nonatomic, strong) NSArray *detents;
|
|
12
15
|
@property(nonatomic, strong) Param *selectedDetent;
|
|
13
16
|
/** The largest detent the screen below stays undimmed and touchable at. */
|
|
@@ -12,6 +12,8 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
12
12
|
@property(nonatomic, strong) Text *openGestureMode;
|
|
13
13
|
/// `'parallax'`, `'slide'`, `'slide-and-scale'` or `'door'`.
|
|
14
14
|
@property(nonatomic, strong) Text *animationType;
|
|
15
|
+
/// `'together'`, `'afterCenter'` or `'onOpen'`.
|
|
16
|
+
@property(nonatomic, strong) Text *menusAttachMode;
|
|
15
17
|
@property(nonatomic, strong) Text *testID;
|
|
16
18
|
|
|
17
19
|
@end
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
[ANNOptionField enumField:@"openGestureMode" values:@[ @"bezel", @"entireScreen" ]],
|
|
10
10
|
[ANNOptionField enumField:@"animationType"
|
|
11
11
|
values:@[ @"parallax", @"slide", @"slide-and-scale", @"door" ]],
|
|
12
|
+
[ANNOptionField enumField:@"menusAttachMode"
|
|
13
|
+
values:@[ @"together", @"afterCenter", @"onOpen" ]],
|
|
12
14
|
[ANNOptionField textField:@"testID"],
|
|
13
15
|
];
|
|
14
16
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#import "ANNStackAnimationOptions.h"
|
|
2
|
+
|
|
3
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
4
|
+
|
|
5
|
+
/// `animations.pop` (`StackPopAnimationOptions`).
|
|
6
|
+
@interface ANNStackPopAnimationOptions : ANNStackAnimationOptions
|
|
7
|
+
|
|
8
|
+
/// The swipe back plays the screen's own pop under the finger.
|
|
9
|
+
@property(nonatomic, strong) Bool *interactive;
|
|
10
|
+
|
|
11
|
+
@end
|
|
12
|
+
|
|
13
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#import "ANNStackPopAnimationOptions.h"
|
|
2
|
+
|
|
3
|
+
@implementation ANNStackPopAnimationOptions
|
|
4
|
+
|
|
5
|
+
+ (NSArray<ANNOptionField *> *)optionFields {
|
|
6
|
+
return [[super optionFields] arrayByAddingObjectsFromArray:@[
|
|
7
|
+
[ANNOptionField boolField:@"interactive"],
|
|
8
|
+
]];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
@end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#import "ANNNavigationOptions.h"
|
|
2
|
+
#import <Foundation/Foundation.h>
|
|
3
|
+
|
|
4
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
5
|
+
|
|
6
|
+
/// Writes a choice into options being resolved: `options` is a copy the block may change, but its lists and their
|
|
7
|
+
/// items are shared with other trees, so the block puts in a new list with a copy of what it changes, never a change in
|
|
8
|
+
/// place. It finds what it changes by identity (a button by its id, a menu item by its id, a scope by its id) and
|
|
9
|
+
/// leaves the options as they are when that is not there.
|
|
10
|
+
typedef void (^ANNUserChoiceApply)(ANNNavigationOptions *options, id value);
|
|
11
|
+
|
|
12
|
+
/// The value of a choice after the app's `mergeOptions` into the node, by Android's rules (`UserChoices.yieldTo`):
|
|
13
|
+
/// `merge` is what the app sent, `own` the node's own options before it, `before` and `after` the node's resolution
|
|
14
|
+
/// with the defaults and without any user layer (the app's options alone) before and after the merge. The same `value`
|
|
15
|
+
/// keeps the choice, a smaller value keeps part of it, nil drops it. A part leaves when what it was made in is gone
|
|
16
|
+
/// from `after` (a button, a menu item, a scope), or when `merge` gives its field a value other than the one the app
|
|
17
|
+
/// had there: `own`'s, or `before`'s where `own` has no such field (a list the node takes from its stack or the
|
|
18
|
+
/// defaults). The same value sent again (a re-render) keeps it.
|
|
19
|
+
typedef id _Nullable (^ANNUserChoiceMerged)(id value, ANNNavigationOptions *merge,
|
|
20
|
+
ANNNavigationOptions *own,
|
|
21
|
+
ANNNavigationOptions *before,
|
|
22
|
+
ANNNavigationOptions *after);
|
|
23
|
+
|
|
24
|
+
/// One choice the user made in native UI (a toggled button, the check of a single-selection menu, the search scope, the
|
|
25
|
+
/// tokens and the suggestions UIKit removed, a renamed title), kept in the node's user layer
|
|
26
|
+
/// (`ANNNodeHelper setUserChoice:forKey:`) apart from its own options. The node's resolution writes it over the own
|
|
27
|
+
/// options (`applyTo:`); the app's real change of the same field, or a merge after which what it is about is gone,
|
|
28
|
+
/// takes it away (`choiceAfterMerge:own:before:after:`). The blocks capture only plain data (a side, an id, a key),
|
|
29
|
+
/// never a presenter: the node keeps them as long as the choice.
|
|
30
|
+
@interface ANNUserChoice : NSObject
|
|
31
|
+
|
|
32
|
+
/// What the user chose, never changed: a number, a string, an array of ids or of option copies.
|
|
33
|
+
@property(nonatomic, strong, readonly) id value;
|
|
34
|
+
|
|
35
|
+
+ (instancetype)choiceWithValue:(id)value
|
|
36
|
+
apply:(ANNUserChoiceApply)apply
|
|
37
|
+
merged:(ANNUserChoiceMerged)merged;
|
|
38
|
+
|
|
39
|
+
- (instancetype)init NS_UNAVAILABLE;
|
|
40
|
+
+ (instancetype)new NS_UNAVAILABLE;
|
|
41
|
+
|
|
42
|
+
/// The same choice with another value.
|
|
43
|
+
- (instancetype)choiceWithValue:(id)value;
|
|
44
|
+
|
|
45
|
+
/// The choice written into `options` (a copy being resolved).
|
|
46
|
+
- (void)applyTo:(ANNNavigationOptions *)options;
|
|
47
|
+
|
|
48
|
+
/// The choice after the app's `mergeOptions` (`ANNUserChoiceMerged`): itself, the choice with a smaller value, or nil
|
|
49
|
+
/// when it goes.
|
|
50
|
+
- (nullable ANNUserChoice *)choiceAfterMerge:(ANNNavigationOptions *)merge
|
|
51
|
+
own:(ANNNavigationOptions *)own
|
|
52
|
+
before:(ANNNavigationOptions *)before
|
|
53
|
+
after:(ANNNavigationOptions *)after;
|
|
54
|
+
|
|
55
|
+
@end
|
|
56
|
+
|
|
57
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#import "ANNUserChoice.h"
|
|
2
|
+
|
|
3
|
+
@implementation ANNUserChoice {
|
|
4
|
+
ANNUserChoiceApply _apply;
|
|
5
|
+
ANNUserChoiceMerged _merged;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
+ (instancetype)choiceWithValue:(id)value
|
|
9
|
+
apply:(ANNUserChoiceApply)apply
|
|
10
|
+
merged:(ANNUserChoiceMerged)merged {
|
|
11
|
+
return [[self alloc] initWithValue:value apply:apply merged:merged];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
- (instancetype)initWithValue:(id)value
|
|
15
|
+
apply:(ANNUserChoiceApply)apply
|
|
16
|
+
merged:(ANNUserChoiceMerged)merged {
|
|
17
|
+
if (self = [super init]) {
|
|
18
|
+
_value = value;
|
|
19
|
+
_apply = [apply copy];
|
|
20
|
+
_merged = [merged copy];
|
|
21
|
+
}
|
|
22
|
+
return self;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
- (instancetype)choiceWithValue:(id)value {
|
|
26
|
+
return [[ANNUserChoice alloc] initWithValue:value apply:_apply merged:_merged];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
- (void)applyTo:(ANNNavigationOptions *)options {
|
|
30
|
+
_apply(options, _value);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
- (ANNUserChoice *)choiceAfterMerge:(ANNNavigationOptions *)merge
|
|
34
|
+
own:(ANNNavigationOptions *)own
|
|
35
|
+
before:(ANNNavigationOptions *)before
|
|
36
|
+
after:(ANNNavigationOptions *)after {
|
|
37
|
+
id value = _merged(_value, merge, own, before, after);
|
|
38
|
+
if (!value) {
|
|
39
|
+
return nil;
|
|
40
|
+
}
|
|
41
|
+
return value == _value ? self : [self choiceWithValue:value];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#import <UIKit/UIKit.h>
|
|
2
|
+
|
|
3
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
4
|
+
|
|
5
|
+
/// Where an image of the options comes from.
|
|
6
|
+
typedef NS_ENUM(NSInteger, ANNImageSourceKind) {
|
|
7
|
+
/// An SF Symbol (`{ system, fallback? }`); a name the system doesn't have takes the fallback.
|
|
8
|
+
ANNImageSourceKindSymbol,
|
|
9
|
+
/// A `file:` address: a file, or an asset of the app's bundle that React Native resolved.
|
|
10
|
+
ANNImageSourceKindFile,
|
|
11
|
+
/// A `data:` address.
|
|
12
|
+
ANNImageSourceKindData,
|
|
13
|
+
/// Metro's asset in development, read from the dev server.
|
|
14
|
+
ANNImageSourceKindMetro,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/// An image the options name, as they name it: read when the options are read, loaded when an element shows it
|
|
18
|
+
/// (`ANNOptionImages`). Immutable; any thread.
|
|
19
|
+
@interface ANNImageSource : NSObject
|
|
20
|
+
|
|
21
|
+
- (instancetype)init NS_UNAVAILABLE;
|
|
22
|
+
+ (instancetype)new NS_UNAVAILABLE;
|
|
23
|
+
|
|
24
|
+
/// An SF Symbol, with the source a name the system doesn't have takes.
|
|
25
|
+
+ (instancetype)symbolNamed:(NSString *)name fallback:(nullable ANNImageSource *)fallback;
|
|
26
|
+
|
|
27
|
+
/// An address of `kind` (not a symbol) with the source's `scale`, `width` and `height` (0 without them).
|
|
28
|
+
+ (instancetype)sourceOfKind:(ANNImageSourceKind)kind
|
|
29
|
+
url:(NSURL *)url
|
|
30
|
+
address:(NSString *)address
|
|
31
|
+
scale:(CGFloat)scale
|
|
32
|
+
width:(CGFloat)width
|
|
33
|
+
height:(CGFloat)height;
|
|
34
|
+
|
|
35
|
+
@property(nonatomic, readonly) ANNImageSourceKind kind;
|
|
36
|
+
@property(nonatomic, copy, readonly, nullable) NSString *symbolName;
|
|
37
|
+
@property(nonatomic, strong, readonly, nullable) ANNImageSource *fallback;
|
|
38
|
+
@property(nonatomic, strong, readonly, nullable) NSURL *url;
|
|
39
|
+
/// The address as the options gave it (with its bundle); the symbol's name for a symbol.
|
|
40
|
+
@property(nonatomic, copy, readonly) NSString *address;
|
|
41
|
+
@property(nonatomic, readonly) CGFloat scale;
|
|
42
|
+
@property(nonatomic, readonly) CGFloat width;
|
|
43
|
+
@property(nonatomic, readonly) CGFloat height;
|
|
44
|
+
|
|
45
|
+
/// What the decoded image depends on: the address, the scale and the width (the scale without one), and for a `file:`
|
|
46
|
+
/// source outside the app's bundle the file's modification date and size, read at each ask, so a file the app writes
|
|
47
|
+
/// again at the same path shows its new content. The cache's key.
|
|
48
|
+
@property(nonatomic, copy, readonly) NSString *key;
|
|
49
|
+
|
|
50
|
+
/// What the options name, as text: the kind, the address, the scale and the width, and a symbol's fallback, without the
|
|
51
|
+
/// file's stamp, so what the file holds now never changes it. Reads nothing from the disk. For telling whether two
|
|
52
|
+
/// options name the same image (`key` is for the decoded one).
|
|
53
|
+
@property(nonatomic, copy, readonly) NSString *sourceKey;
|
|
54
|
+
|
|
55
|
+
/// The image reads from the device alone (a file, an asset of the app, a `data:` address), so it may load off the main
|
|
56
|
+
/// queue; Metro's asset reads from the network and a symbol is the system's.
|
|
57
|
+
@property(nonatomic, readonly) BOOL loadsLater;
|
|
58
|
+
|
|
59
|
+
@end
|
|
60
|
+
|
|
61
|
+
NS_ASSUME_NONNULL_END
|