@apexnative/navigation 1.0.0-alpha.5 → 1.0.0-alpha.7
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 +32 -0
- package/README.md +1 -1
- package/android/CLAUDE.md +31 -20
- package/android/CORE.md +12 -8
- package/android/consumer-rules.pro +6 -0
- package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +36 -5
- 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/ButtonOptions.kt +1 -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/SheetOptions.kt +7 -4
- 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/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/NavigationTurboModule.kt +7 -3
- package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +41 -3
- package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +16 -1
- package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +0 -2
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenEnvironment.kt +177 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +12 -49
- package/android/src/main/java/dev/apexnative/navigation/react/ScrollEvents.kt +49 -128
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +27 -7
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +12 -1
- package/android/src/main/java/dev/apexnative/navigation/utils/MaterialTheme.kt +5 -6
- package/android/src/main/java/dev/apexnative/navigation/utils/SystemAnimations.kt +36 -0
- 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 +9 -7
- 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 +13 -10
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +22 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +0 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +7 -8
- 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/ModalCoordinator.kt +20 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +443 -58
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +33 -5
- 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 +60 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +4 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +3 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +8 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/BackPreview.kt +32 -4
- 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 +2 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +50 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +15 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +10 -4
- 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 +215 -43
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +25 -26
- 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/TopBarPresenter.kt +36 -38
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +6 -9
- package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationLayer.kt +73 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +14 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +61 -2
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +72 -10
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +129 -179
- package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +8 -1
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +37 -112
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +67 -3
- 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 +55 -42
- 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/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 -24
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +51 -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 +121 -175
- 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/doctor/checks/app.js +16 -1
- package/cli/project.js +4 -0
- package/cli/setup/index.js +5 -0
- package/cli/setup/steps/metro.js +46 -0
- 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 +46 -5
- package/docs-md/containers/modals.md +2 -0
- package/docs-md/containers/overlays.md +1 -1
- package/docs-md/containers/side-menu.md +1 -1
- package/docs-md/containers/tabs.md +2 -0
- package/docs-md/flows/bottom-sheets.md +4 -2
- 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 +3 -1
- package/docs-md/help/glossary.md +2 -2
- package/docs-md/help/troubleshooting.md +22 -1
- package/docs-md/index.json +41 -1
- package/docs-md/migration/from-expo-router.md +1 -1
- package/docs-md/migration/from-react-native-navigation.md +1 -1
- package/docs-md/migration/from-react-navigation.md +2 -2
- package/docs-md/screen-ui/back-and-gestures.md +17 -1
- 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 +16 -11
- 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 +16 -1
- 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 +49 -3
- package/ios/Animations/ANNTransitionPlan.h +2 -2
- package/ios/Animations/ANNTransitionPlan.mm +10 -0
- package/ios/Animations/Elements/ANNElementFinder.h +2 -2
- package/ios/Animations/Elements/ANNElementFinder.mm +2 -2
- package/ios/Animations/Elements/ANNElementTransition.h +3 -3
- package/ios/Animations/Elements/ANNElementTransition.mm +2 -2
- package/ios/Animations/Elements/ANNSharedElementFlight.h +3 -3
- package/ios/Animations/Elements/ANNSharedElementFlight.mm +249 -45
- 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 +32 -22
- package/ios/CORE.md +25 -21
- package/ios/Contract/ANNCommandRunner.h +8 -7
- package/ios/Contract/ANNCommandRunner.mm +21 -27
- package/ios/Contract/ANNLayoutNode.h +3 -3
- package/ios/Contract/ANNLayoutReader.h +3 -3
- package/ios/Core/ANNAppDelegate.mm +0 -2
- package/ios/Core/ANNDeepLinkQueue.h +6 -5
- package/ios/Core/ANNDeepLinkQueue.mm +22 -10
- package/ios/Core/ANNJavaScriptCalls.h +11 -12
- package/ios/Core/ANNJavaScriptCalls.mm +7 -16
- package/ios/Core/ANNReloadCoordinator.mm +4 -8
- package/ios/Core/ANNSceneDelegate.mm +2 -2
- package/ios/Core/ApexNavigation+Internal.h +1 -1
- package/ios/Core/ApexNavigation.mm +6 -2
- package/ios/Layouts/Arrangement/ANNArrangementState.h +2 -17
- package/ios/Layouts/Arrangement/ANNArrangementState.mm +0 -38
- package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +4 -4
- package/ios/Layouts/Root/ANNRootCoordinator.mm +45 -15
- package/ios/Layouts/Screen/ANNComponentViewController.h +2 -2
- package/ios/Layouts/Screen/ANNComponentViewController.mm +13 -23
- 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/ANNScreenRegions.h +3 -18
- package/ios/Layouts/Screen/ANNScreenRegions.mm +0 -38
- package/ios/Layouts/Screen/ANNScreenSafeArea.h +4 -9
- package/ios/Layouts/Screen/ANNScreenSafeArea.mm +14 -16
- package/ios/Layouts/Stack/ANNPreviewPush.h +7 -6
- package/ios/Layouts/Stack/ANNPreviewPush.mm +57 -5
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +11 -2
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +14 -7
- package/ios/Layouts/Stack/ANNStackController.h +8 -0
- package/ios/Layouts/Stack/ANNStackController.mm +153 -11
- 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/Tabs/ANNBottomTabsAccessoryView.h +12 -1
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +23 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.mm +2 -1
- package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +8 -3
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +4 -0
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +123 -36
- 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/ANNOptionsReader.mm +108 -0
- package/ios/Options/ANNStackPopAnimationOptions.h +13 -0
- package/ios/Options/ANNStackPopAnimationOptions.mm +11 -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 +4 -0
- package/ios/Options/Params/Image.mm +20 -0
- package/ios/React/ANNReactView.mm +6 -25
- package/ios/React/ANNSafeAreaViewComponentView.mm +26 -15
- package/ios/React/ANNSurfaceHostingView.h +14 -0
- package/ios/React/ANNSurfaceHostingView.mm +144 -1
- 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 +5 -3
- package/ios/TopBar/ANNBarButtons.mm +186 -17
- package/ios/TopBar/ANNLargeTitlePresenter.mm +24 -4
- 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 +2 -2
- package/ios/TopBar/ANNSearchResultsViewController.mm +5 -5
- package/ios/TopBar/ANNTopBarPresenter.h +3 -2
- package/ios/TopBar/ANNTopBarPresenter.mm +95 -22
- package/ios/TurboModules/ANNTurboModule.mm +66 -16
- 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 +17 -7
- 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 +188 -66
- package/lib/module/api/app/createNavigation.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/useSafeAreaInsets.js +4 -3
- package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -1
- package/lib/module/api/linking/linking.js +11 -0
- package/lib/module/api/linking/linking.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 +172 -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 +42 -2
- package/lib/module/engine/commands.js.map +1 -1
- package/lib/module/engine/layout.js +7 -2
- 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 +5 -4
- 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/refresh.js +85 -0
- package/lib/module/engine/refresh.js.map +1 -0
- package/lib/module/engine/rememberedOptions.js +60 -0
- package/lib/module/engine/rememberedOptions.js.map +1 -1
- package/lib/module/engine/screens.js +55 -4
- package/lib/module/engine/screens.js.map +1 -1
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts +7 -0
- 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/events/navigationEvents.d.ts +2 -2
- package/lib/typescript/api/events/navigationEvents.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/linking.d.ts +8 -0
- package/lib/typescript/api/linking/linking.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/optionsChange.d.ts +28 -0
- package/lib/typescript/engine/optionsChange.d.ts.map +1 -0
- 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 +2 -2
- package/lib/typescript/interfaces/options/animations.d.ts +44 -14
- package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/bottomTabs.d.ts +19 -6
- package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/buttons.d.ts +10 -10
- package/lib/typescript/interfaces/options/modals.d.ts +6 -7
- package/lib/typescript/interfaces/options/modals.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/stack.d.ts +8 -3
- package/lib/typescript/interfaces/options/stack.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/system.d.ts +8 -5
- 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 +46 -29
- 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 +17 -7
- package/src/adapters/NativeANNTurboModule.ts +7 -0
- package/src/api/app/AppRegistry.ts +16 -2
- package/src/api/app/createNavigation.ts +201 -69
- package/src/api/events/navigationEvents.ts +9 -3
- package/src/api/hooks/useSafeAreaInsets.ts +4 -3
- package/src/api/index.ts +1 -0
- package/src/api/linking/linking.ts +22 -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 +170 -42
- package/src/api/theme/theme.ts +5 -0
- package/src/engine/commands.ts +51 -6
- package/src/engine/layout.ts +11 -2
- package/src/engine/nativeScreens.ts +10 -1
- package/src/engine/options.ts +6 -8
- package/src/engine/optionsChange.ts +107 -0
- package/src/engine/refresh.ts +97 -0
- package/src/engine/rememberedOptions.ts +70 -0
- package/src/engine/screens.tsx +53 -8
- package/src/interfaces/ComponentEvents.ts +2 -2
- package/src/interfaces/options/animations.ts +44 -14
- package/src/interfaces/options/bottomTabs.ts +19 -6
- package/src/interfaces/options/buttons.ts +10 -10
- package/src/interfaces/options/modals.ts +6 -7
- package/src/interfaces/options/stack.ts +8 -3
- package/src/interfaces/options/system.ts +8 -5
- package/src/interfaces/options/toolbar.ts +2 -2
- package/src/interfaces/options/topBar.ts +46 -29
- package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +0 -42
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +0 -70
- 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 -136
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +0 -86
- 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 -64
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +0 -177
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +0 -137
- package/ios/Layouts/Screen/ANNScreenInsets.h +0 -30
- package/ios/Layouts/Screen/ANNScreenInsets.mm +0 -70
|
@@ -2,45 +2,35 @@ package dev.apexnative.navigation.views.element
|
|
|
2
2
|
|
|
3
3
|
import android.annotation.SuppressLint
|
|
4
4
|
import android.content.Context
|
|
5
|
-
import android.graphics.
|
|
6
|
-
import android.graphics.Rect
|
|
5
|
+
import android.graphics.Canvas
|
|
7
6
|
import android.view.MotionEvent
|
|
8
7
|
import android.view.View
|
|
9
8
|
import android.view.ViewGroup
|
|
9
|
+
import dev.apexnative.navigation.views.element.animators.FlightPicture
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* The layer of a transition's elements: full size over the screens' common parent (a stack's
|
|
13
|
-
* the modals layer and the overlays layer), there only while the transition runs.
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* accessibility doesn't see it. Main thread only.
|
|
12
|
+
* The layer the copies of a transition's shared elements fly in: full size over the screens' common parent (a stack's
|
|
13
|
+
* view; for a modal, between the modals layer and the overlays layer), there only while the transition runs. It holds
|
|
14
|
+
* no views: it draws the pictures of the flights ([FlightPicture]) in the order they are added, each while it is shown,
|
|
15
|
+
* on every frame while one of them is [FlightPicture.live]. A picture whose drawing fails draws no more, and its
|
|
16
|
+
* [FlightPicture.onFailed] runs after the frame. It takes no touches, accessibility doesn't see it. Main thread only.
|
|
17
17
|
*/
|
|
18
18
|
@SuppressLint("ViewConstructor")
|
|
19
|
-
internal class TransitionLayer(context: Context) :
|
|
20
|
-
|
|
21
|
-
private val reactFrames = HashMap<View, Rect>()
|
|
19
|
+
internal class TransitionLayer(context: Context) : View(context) {
|
|
20
|
+
private val pictures = ArrayList<FlightPicture>()
|
|
22
21
|
|
|
23
22
|
init {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
|
|
23
|
+
importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO
|
|
24
|
+
setWillNotDraw(false)
|
|
27
25
|
}
|
|
28
26
|
|
|
29
|
-
/** The layer's top left corner on the screen, in pixels: what the views in it are placed from. */
|
|
30
|
-
val originOnScreen: Point
|
|
31
|
-
get() {
|
|
32
|
-
val location = IntArray(2)
|
|
33
|
-
getLocationOnScreen(location)
|
|
34
|
-
return Point(location[0], location[1])
|
|
35
|
-
}
|
|
36
|
-
|
|
37
27
|
/**
|
|
38
|
-
* Joins [parent] at [index] (its top without one), laid out at once at the parent's size:
|
|
39
|
-
*
|
|
28
|
+
* Joins [parent] at [index] (its top without one), laid out at once at the parent's size: the places of the views
|
|
29
|
+
* are measured from it on the frame the transition starts.
|
|
40
30
|
*/
|
|
41
31
|
fun attachTo(parent: ViewGroup, index: Int = parent.childCount) {
|
|
42
32
|
// The parent turns these into its own kind of params.
|
|
43
|
-
parent.addView(this, index.coerceIn(0, parent.childCount), LayoutParams(MATCH, MATCH))
|
|
33
|
+
parent.addView(this, index.coerceIn(0, parent.childCount), ViewGroup.LayoutParams(MATCH, MATCH))
|
|
44
34
|
measure(
|
|
45
35
|
MeasureSpec.makeMeasureSpec(parent.width, MeasureSpec.EXACTLY),
|
|
46
36
|
MeasureSpec.makeMeasureSpec(parent.height, MeasureSpec.EXACTLY),
|
|
@@ -48,51 +38,10 @@ internal class TransitionLayer(context: Context) : ViewGroup(context) {
|
|
|
48
38
|
layout(0, 0, parent.width, parent.height)
|
|
49
39
|
}
|
|
50
40
|
|
|
51
|
-
/** [
|
|
52
|
-
fun
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
topMargin = top
|
|
56
|
-
}
|
|
57
|
-
addView(view, params)
|
|
58
|
-
layOut(view, left, top, width, height)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** [view], in the layer, lies at [left], [top] at the size [width] × [height] from now on. */
|
|
62
|
-
fun place(view: View, left: Int, top: Int, width: Int, height: Int) {
|
|
63
|
-
noteReactFrame(view)
|
|
64
|
-
(view.layoutParams as? MarginLayoutParams)?.let {
|
|
65
|
-
it.leftMargin = left
|
|
66
|
-
it.topMargin = top
|
|
67
|
-
it.width = width
|
|
68
|
-
it.height = height
|
|
69
|
-
}
|
|
70
|
-
layOut(view, left, top, width, height)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
private fun layOut(view: View, left: Int, top: Int, width: Int, height: Int) {
|
|
74
|
-
view.measure(
|
|
75
|
-
MeasureSpec.makeMeasureSpec(width.coerceAtLeast(0), MeasureSpec.EXACTLY),
|
|
76
|
-
MeasureSpec.makeMeasureSpec(height.coerceAtLeast(0), MeasureSpec.EXACTLY),
|
|
77
|
-
)
|
|
78
|
-
view.layout(left, top, left + width, top + height)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* The newest frame React gave [view] while it was in the layer, in its parent's coordinates; none when React
|
|
83
|
-
* didn't lay it out meanwhile. A frame other than the one the layer gave it can only be React's.
|
|
84
|
-
*/
|
|
85
|
-
fun frameFromReact(view: View): Rect? {
|
|
86
|
-
noteReactFrame(view)
|
|
87
|
-
return reactFrames.remove(view)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// The view's frame isn't where the layer put it: React laid it out since.
|
|
91
|
-
private fun noteReactFrame(view: View) {
|
|
92
|
-
val params = view.layoutParams as? MarginLayoutParams ?: return
|
|
93
|
-
val placed = view.left == params.leftMargin && view.top == params.topMargin &&
|
|
94
|
-
view.width == params.width && view.height == params.height
|
|
95
|
-
if (!placed) reactFrames[view] = Rect(view.left, view.top, view.right, view.bottom)
|
|
41
|
+
/** [picture] is drawn over those added before it. */
|
|
42
|
+
fun add(picture: FlightPicture) {
|
|
43
|
+
pictures += picture
|
|
44
|
+
invalidate()
|
|
96
45
|
}
|
|
97
46
|
|
|
98
47
|
/** The layer leaves its parent. */
|
|
@@ -100,53 +49,29 @@ internal class TransitionLayer(context: Context) : ViewGroup(context) {
|
|
|
100
49
|
(parent as? ViewGroup)?.removeView(this)
|
|
101
50
|
}
|
|
102
51
|
|
|
103
|
-
override fun
|
|
104
|
-
|
|
105
|
-
for (
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
val child = getChildAt(index)
|
|
118
|
-
val params = child.layoutParams as? MarginLayoutParams ?: continue
|
|
119
|
-
noteReactFrame(child)
|
|
120
|
-
child.layout(
|
|
121
|
-
params.leftMargin,
|
|
122
|
-
params.topMargin,
|
|
123
|
-
params.leftMargin + child.measuredWidth,
|
|
124
|
-
params.topMargin + child.measuredHeight,
|
|
125
|
-
)
|
|
52
|
+
override fun onDraw(canvas: Canvas) {
|
|
53
|
+
var live = false
|
|
54
|
+
for (picture in pictures) {
|
|
55
|
+
if (!picture.shown) continue
|
|
56
|
+
live = live || picture.live
|
|
57
|
+
val count = canvas.save()
|
|
58
|
+
try {
|
|
59
|
+
picture.draw(canvas)
|
|
60
|
+
} catch (e: RuntimeException) {
|
|
61
|
+
picture.shown = false
|
|
62
|
+
post { picture.onFailed(e) }
|
|
63
|
+
} finally {
|
|
64
|
+
canvas.restoreToCount(count)
|
|
65
|
+
}
|
|
126
66
|
}
|
|
67
|
+
// A landed copy gets no more frames from its flight: one that changes by itself asks for them.
|
|
68
|
+
if (live) postInvalidateOnAnimation()
|
|
127
69
|
}
|
|
128
70
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
override fun generateDefaultLayoutParams(): LayoutParams = MarginLayoutParams(0, 0)
|
|
132
|
-
|
|
133
|
-
override fun generateLayoutParams(params: LayoutParams?): LayoutParams = MarginLayoutParams(params)
|
|
134
|
-
|
|
71
|
+
@SuppressLint("ClickableViewAccessibility")
|
|
135
72
|
override fun dispatchTouchEvent(event: MotionEvent?): Boolean = false
|
|
136
73
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
companion object {
|
|
140
|
-
private const val MATCH = LayoutParams.MATCH_PARENT
|
|
141
|
-
|
|
142
|
-
/** Whether [view] is in a transition's layer now (an element of another transition). */
|
|
143
|
-
fun holds(view: View): Boolean {
|
|
144
|
-
var parent = view.parent
|
|
145
|
-
while (parent != null) {
|
|
146
|
-
if (parent is TransitionLayer) return true
|
|
147
|
-
parent = parent.parent
|
|
148
|
-
}
|
|
149
|
-
return false
|
|
150
|
-
}
|
|
74
|
+
private companion object {
|
|
75
|
+
const val MATCH = ViewGroup.LayoutParams.MATCH_PARENT
|
|
151
76
|
}
|
|
152
77
|
}
|
package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt
CHANGED
|
@@ -4,7 +4,12 @@ import android.animation.Animator
|
|
|
4
4
|
import android.animation.AnimatorListenerAdapter
|
|
5
5
|
import android.animation.TimeInterpolator
|
|
6
6
|
import android.animation.ValueAnimator
|
|
7
|
+
import android.graphics.Canvas
|
|
8
|
+
import android.graphics.Paint
|
|
7
9
|
import android.graphics.Picture
|
|
10
|
+
import android.graphics.PorterDuff
|
|
11
|
+
import android.graphics.PorterDuffXfermode
|
|
12
|
+
import android.graphics.RectF
|
|
8
13
|
import android.util.Log
|
|
9
14
|
import android.view.View
|
|
10
15
|
import android.view.animation.LinearInterpolator
|
|
@@ -13,8 +18,7 @@ import dev.apexnative.navigation.views.element.elementStep
|
|
|
13
18
|
|
|
14
19
|
/**
|
|
15
20
|
* The view's own drawing with its children, as drawing commands: sharp at any scale. Its opacity and place belong to
|
|
16
|
-
* the parent. Recording can fail (a hardware bitmap in an image
|
|
17
|
-
* pictures.
|
|
21
|
+
* the parent. Recording can fail (a hardware bitmap in an image before Android 9): the pair then doesn't fly.
|
|
18
22
|
*/
|
|
19
23
|
internal fun recordPicture(view: View): Picture? = try {
|
|
20
24
|
Picture().also {
|
|
@@ -26,10 +30,59 @@ internal fun recordPicture(view: View): Picture? = try {
|
|
|
26
30
|
}
|
|
27
31
|
}
|
|
28
32
|
} catch (e: RuntimeException) {
|
|
29
|
-
Log.w(NavigationLog.TAG, "Element transition: no picture of the element
|
|
33
|
+
Log.w(NavigationLog.TAG, "[ApexNavigation] Element transition: no picture of the element", e)
|
|
30
34
|
null
|
|
31
35
|
}
|
|
32
36
|
|
|
37
|
+
/**
|
|
38
|
+
* What a shared pair's flight draws in its transition's layer, in the layer's coordinates: the copy where the flight
|
|
39
|
+
* has brought it ([update]). The layer draws it while it is [shown]: from the start of the flight, and after a landing
|
|
40
|
+
* until the layer goes.
|
|
41
|
+
*/
|
|
42
|
+
internal abstract class FlightPicture {
|
|
43
|
+
/** Whether the layer draws it now. */
|
|
44
|
+
var shown = false
|
|
45
|
+
|
|
46
|
+
/** Whether what it draws changes by itself (an animated image): the layer draws it on every frame while shown. */
|
|
47
|
+
open val live: Boolean get() = false
|
|
48
|
+
|
|
49
|
+
/** What runs after its drawing failed: it is drawn no more, and the views of its pair show again. */
|
|
50
|
+
var onFailed: (Exception) -> Unit = {}
|
|
51
|
+
|
|
52
|
+
/** The copy at [time] (the part of the time), [progress] the curve's value. */
|
|
53
|
+
abstract fun update(time: Float, progress: Float)
|
|
54
|
+
|
|
55
|
+
/** The copy, on the layer's canvas; the layer saves and restores the canvas around it. */
|
|
56
|
+
abstract fun draw(canvas: Canvas)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* The cut of a copy whose views' parents hide part of them ([FlightMask]): it keeps, of the mask the copy draws on its
|
|
61
|
+
* layer, only the part that shows. A layer of that part's rounded rect laid over the mask (`DST_IN`), not a clip path:
|
|
62
|
+
* its edges stay smooth.
|
|
63
|
+
*/
|
|
64
|
+
internal class MaskCut(private val mask: FlightMask) {
|
|
65
|
+
private val values = FloatArray(FlightMask.SIZE)
|
|
66
|
+
private val rect = RectF()
|
|
67
|
+
private val shape = Paint(Paint.ANTI_ALIAS_FLAG)
|
|
68
|
+
private val cut = Paint().apply { xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_IN) }
|
|
69
|
+
|
|
70
|
+
/** The cut at [time] (the part of the time), [progress] the curve's value. */
|
|
71
|
+
fun update(time: Float, progress: Float) = mask.at(progress, time, values)
|
|
72
|
+
|
|
73
|
+
/** Cuts the mask drawn so far on the copy's layer of [bounds], in the copy's coordinates (0, 0 its center). */
|
|
74
|
+
fun draw(canvas: Canvas, bounds: RectF) {
|
|
75
|
+
rect.set(values[0], values[1], values[2], values[3])
|
|
76
|
+
canvas.saveLayer(bounds, cut)
|
|
77
|
+
if (!rect.isEmpty) canvas.drawRoundRect(rect, values[RADIUS], values[RADIUS], shape)
|
|
78
|
+
canvas.restore()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private companion object {
|
|
82
|
+
const val RADIUS = 4
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
33
86
|
// Runs in linear time and keeps the curve it is given for the move: an element moves along the transition's curve,
|
|
34
87
|
// while what has to follow the clock (the pictures of a text changing over) can. Its start and its frames each run in
|
|
35
88
|
// [elementStep]: one that fails stops the element — it is cancelled, so its ends put back what it changed and the
|
|
@@ -45,6 +98,13 @@ internal class MoveAnimator : ValueAnimator() {
|
|
|
45
98
|
private val frames = ArrayList<(Float) -> Unit>()
|
|
46
99
|
private val ends = ArrayList<() -> Unit>()
|
|
47
100
|
private var failed = false
|
|
101
|
+
private var cancelled = false
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Whether the flight ran to its end: it wasn't cancelled and nothing in it failed. Read at its end; a flight that
|
|
105
|
+
* landed may keep showing its last frame until the transition gives its views back.
|
|
106
|
+
*/
|
|
107
|
+
val landed: Boolean get() = !cancelled
|
|
48
108
|
|
|
49
109
|
init {
|
|
50
110
|
setFloatValues(0f, 1f)
|
|
@@ -52,6 +112,10 @@ internal class MoveAnimator : ValueAnimator() {
|
|
|
52
112
|
addListener(object : AnimatorListenerAdapter() {
|
|
53
113
|
override fun onAnimationStart(animation: Animator) = guarded { for (start in starts) start() }
|
|
54
114
|
|
|
115
|
+
override fun onAnimationCancel(animation: Animator) {
|
|
116
|
+
cancelled = true
|
|
117
|
+
}
|
|
118
|
+
|
|
55
119
|
override fun onAnimationEnd(animation: Animator) {
|
|
56
120
|
for (end in ends) elementStep(element) { end() }
|
|
57
121
|
}
|