@apexnative/navigation 1.0.0-alpha.1 → 1.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ApexNavigation.podspec +2 -1
- package/CHANGELOG.md +120 -0
- package/README.md +147 -51
- package/android/CLAUDE.md +78 -25
- package/android/CORE.md +49 -25
- package/android/RECIPES.md +13 -6
- package/android/consumer-rules.pro +6 -0
- package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +85 -10
- package/android/src/main/java/dev/apexnative/navigation/NavigationApplication.kt +34 -13
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutChecks.kt +5 -1
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutNode.kt +6 -2
- package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenContext.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/AnimationsOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabsOptions.kt +13 -8
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +9 -1
- package/android/src/main/java/dev/apexnative/navigation/options/LargeTitleOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/LayoutAnimation.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/OptionKey.kt +18 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionPaths.kt +91 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +8 -4
- package/android/src/main/java/dev/apexnative/navigation/options/SheetOptions.kt +7 -4
- package/android/src/main/java/dev/apexnative/navigation/options/SideMenuOptions.kt +6 -1
- package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +40 -2
- package/android/src/main/java/dev/apexnative/navigation/options/StatusBarOptions.kt +7 -3
- package/android/src/main/java/dev/apexnative/navigation/options/TitleOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarAppearanceOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarOptions.kt +16 -7
- package/android/src/main/java/dev/apexnative/navigation/options/UserChoices.kt +159 -0
- package/android/src/main/java/dev/apexnative/navigation/react/CommandAnswer.kt +29 -36
- package/android/src/main/java/dev/apexnative/navigation/react/CommandContract.kt +59 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ContentHeights.kt +95 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ContentMounts.kt +66 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ErrorTexts.kt +75 -60
- package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +35 -23
- package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +12 -7
- package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +42 -4
- package/android/src/main/java/dev/apexnative/navigation/react/PendingCalls.kt +48 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +54 -20
- package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +7 -6
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenEnvironment.kt +177 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +19 -50
- package/android/src/main/java/dev/apexnative/navigation/react/ScrollEvents.kt +49 -128
- package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +50 -81
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventContract.kt +226 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +135 -94
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationState.kt +154 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/ScreenAppearance.kt +0 -6
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +12 -10
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +10 -7
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +39 -19
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +16 -4
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotViews.kt +40 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageKey.kt +66 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageLoader.kt +7 -89
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageRequests.kt +76 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/MaterialTheme.kt +5 -6
- package/android/src/main/java/dev/apexnative/navigation/utils/OptionImages.kt +262 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/SystemAnimations.kt +36 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/UiUtils.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +3 -1
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewExtensions.kt +0 -13
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +10 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/SecondaryScreenPresenter.kt +13 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/AppliedTabCalls.kt +49 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +5 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +108 -34
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +25 -24
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +22 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +0 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +28 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +12 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +27 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +103 -56
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +29 -11
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +2 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +22 -24
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +109 -21
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +21 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +476 -73
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +57 -25
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetBack.kt +42 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetStops.kt +83 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackCheck.kt +50 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +49 -14
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +71 -12
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +37 -11
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +10 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +11 -4
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +42 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +19 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +16 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +43 -4
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +23 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +77 -17
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/BackPreview.kt +315 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +30 -20
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +216 -18
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +26 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +149 -41
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +26 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +115 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabMotion.kt +142 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +222 -48
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +3 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +30 -34
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +5 -51
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarRowTransition.kt +3 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +11 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +13 -56
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +219 -54
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +9 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +6 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +75 -21
- package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationLayer.kt +73 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +29 -11
- package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +14 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +9 -7
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +61 -2
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +0 -5
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +72 -10
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStep.kt +31 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +143 -135
- package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +13 -5
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +37 -112
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +9 -6
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionViews.kt +100 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +112 -4
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +346 -36
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMorph.kt +199 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +56 -41
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextMorph.kt +176 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewMorph.kt +108 -0
- package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +12 -3
- package/android/src/main/java/dev/apexnative/navigation/views/stack/ScreenEdge.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +140 -1
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +14 -10
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCopy.kt +85 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +13 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +5 -17
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +73 -34
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonView.kt +113 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarMenu.kt +219 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +125 -178
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +34 -64
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonRow.kt +216 -0
- package/android/src/main/jni/ANNContentHeights.cpp +82 -0
- package/android/src/main/res/drawable/apex_navigation_ic_arrow_right.xml +14 -0
- package/android/src/main/res/layout/apex_navigation_menu_header.xml +19 -0
- package/android/src/main/res/layout/apex_navigation_menu_item.xml +68 -0
- package/android/src/main/res/values/styles.xml +1 -1
- package/android/src/main/res/values-night/styles.xml +1 -1
- package/cli/app.js +1 -1
- package/cli/doctor/checks/app.js +77 -14
- package/cli/doctor/checks/splash.js +4 -22
- package/cli/migrate/native.js +18 -0
- package/cli/project.js +10 -2
- package/cli/setup/index.js +18 -0
- package/cli/setup/source.js +2 -1
- package/cli/setup/steps/appDelegate.js +66 -11
- package/cli/setup/steps/mainApplication.js +134 -19
- package/cli/setup/steps/metro.js +46 -0
- package/cli/setup/steps/sceneDelegate.js +108 -0
- package/cli/splash/index.js +3 -1
- package/docs-md/architecture/native-screens.md +4 -0
- package/docs-md/architecture/theme-and-context.md +131 -12
- package/docs-md/architecture/transitions.md +58 -12
- package/docs-md/containers/modals.md +8 -4
- package/docs-md/containers/overlays.md +3 -1
- package/docs-md/containers/side-menu.md +19 -2
- package/docs-md/containers/tabs.md +5 -1
- package/docs-md/flows/bottom-sheets.md +4 -2
- package/docs-md/flows/forms-in-a-modal.md +1 -1
- package/docs-md/fundamentals/screens-and-props.md +9 -1
- package/docs-md/fundamentals/starting-the-app.md +1 -1
- package/docs-md/guides/cli.md +4 -3
- package/docs-md/guides/deep-links.md +15 -33
- package/docs-md/help/glossary.md +4 -4
- package/docs-md/help/troubleshooting.md +44 -6
- package/docs-md/index.json +57 -1
- package/docs-md/migration/from-expo-router.md +1 -1
- package/docs-md/migration/from-react-native-navigation.md +9 -3
- package/docs-md/migration/from-react-navigation.md +2 -2
- package/docs-md/screen-ui/back-and-gestures.md +46 -2
- package/docs-md/screen-ui/bar-buttons.md +5 -5
- package/docs-md/screen-ui/search.md +1 -1
- package/docs-md/screen-ui/system-ui.md +17 -12
- package/docs-md/screen-ui/toolbar-and-fab.md +4 -2
- package/docs-md/screen-ui/top-bar.md +8 -4
- package/docs-md/start/installation.md +21 -3
- package/ios/Animations/ANNFrameDriver.h +55 -15
- package/ios/Animations/ANNFrameDriver.mm +216 -60
- package/ios/Animations/ANNTransitionAnimator.h +26 -5
- package/ios/Animations/ANNTransitionAnimator.mm +61 -13
- package/ios/Animations/ANNTransitionPlan.h +2 -2
- package/ios/Animations/ANNTransitionPlan.mm +10 -0
- package/ios/Animations/ANNTransitionWait.mm +6 -7
- package/ios/Animations/Elements/ANNElementFinder.h +57 -0
- package/ios/Animations/Elements/ANNElementFinder.mm +174 -2
- package/ios/Animations/Elements/ANNElementTransition.h +10 -8
- package/ios/Animations/Elements/ANNElementTransition.mm +19 -21
- package/ios/Animations/Elements/ANNSharedElementFlight.h +16 -11
- package/ios/Animations/Elements/ANNSharedElementFlight.mm +308 -69
- package/ios/Animations/Interpolators/ANNInterpolate.h +2 -30
- package/ios/Animations/Interpolators/ANNTransformParts.h +48 -0
- package/ios/Animations/Interpolators/ANNTransformParts.mm +507 -0
- package/ios/Animations/Interpolators/ANNViewTracks.h +9 -6
- package/ios/Animations/Interpolators/ANNViewTracks.mm +100 -30
- package/ios/CLAUDE.md +60 -24
- package/ios/CORE.md +44 -34
- package/ios/Contract/ANNCommandAnswer.h +13 -5
- package/ios/Contract/ANNCommandAnswer.mm +40 -32
- package/ios/Contract/ANNCommandContract.h +15 -0
- package/ios/Contract/ANNCommandContract.mm +78 -0
- package/ios/Contract/ANNCommandRunner.h +10 -9
- package/ios/Contract/ANNCommandRunner.mm +22 -28
- package/ios/Contract/ANNErrorTexts.h +6 -2
- package/ios/Contract/ANNErrorTexts.mm +18 -10
- package/ios/Contract/ANNLayoutNode.h +3 -3
- package/ios/Contract/ANNLayoutReader.h +3 -3
- package/ios/Core/ANNAppDelegate.mm +0 -2
- package/ios/Core/ANNAppearanceDispatcher.h +5 -4
- package/ios/Core/ANNAppearanceDispatcher.mm +12 -1
- package/ios/Core/ANNDeepLinkQueue.h +22 -2
- package/ios/Core/ANNDeepLinkQueue.mm +121 -14
- package/ios/Core/ANNErrorHandler.h +9 -4
- package/ios/Core/ANNErrorHandler.mm +20 -2
- package/ios/Core/ANNEventContract.h +246 -0
- package/ios/Core/ANNEventContract.mm +225 -0
- package/ios/Core/ANNEventEmitter.h +6 -2
- package/ios/Core/ANNEventEmitter.mm +117 -80
- package/ios/Core/ANNHinge.h +6 -0
- package/ios/Core/ANNHinge.mm +15 -4
- package/ios/Core/ANNJavaScriptCalls.h +33 -0
- package/ios/Core/ANNJavaScriptCalls.mm +52 -0
- package/ios/Core/ANNLayoutProtocol.h +5 -5
- package/ios/Core/ANNNavigationState.h +7 -5
- package/ios/Core/ANNNavigationState.mm +8 -7
- package/ios/Core/ANNNodeHelper.h +32 -12
- package/ios/Core/ANNNodeHelper.mm +100 -3
- package/ios/Core/ANNParking.h +5 -4
- package/ios/Core/ANNReloadCoordinator.mm +5 -12
- package/ios/Core/ANNRenderWait.h +20 -6
- package/ios/Core/ANNRenderWait.mm +143 -56
- package/ios/Core/ANNSceneDelegate.mm +25 -15
- package/ios/Core/ANNSystemUI.h +3 -2
- package/ios/Core/ANNSystemUI.mm +7 -0
- package/ios/Core/ANNUtils.h +7 -0
- package/ios/Core/ANNUtils.mm +10 -0
- package/ios/Core/ApexNavigation+Internal.h +1 -1
- package/ios/Core/ApexNavigation.mm +7 -6
- package/ios/Core/UIViewController+LayoutProtocol.h +9 -2
- package/ios/Core/UIViewController+LayoutProtocol.mm +8 -0
- package/ios/Layouts/Arrangement/ANNArrangementState.h +2 -17
- package/ios/Layouts/Arrangement/ANNArrangementState.mm +0 -38
- package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +10 -8
- package/ios/Layouts/Modal/ANNModalCoordinator.h +1 -1
- package/ios/Layouts/Modal/ANNModalCoordinator.mm +57 -16
- package/ios/Layouts/Modal/ANNModalPresentation.h +8 -5
- package/ios/Layouts/Modal/ANNModalPresentation.mm +12 -12
- package/ios/Layouts/Modal/ANNSheetPresenter.mm +83 -1
- package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +2 -8
- package/ios/Layouts/Root/ANNRootCoordinator.mm +58 -19
- package/ios/Layouts/Root/ANNSplashViewController.h +5 -3
- package/ios/Layouts/Root/ANNSplashViewController.mm +147 -0
- package/ios/Layouts/Screen/ANNComponentPresenter.h +11 -3
- package/ios/Layouts/Screen/ANNComponentPresenter.mm +34 -6
- package/ios/Layouts/Screen/ANNComponentViewController.h +15 -13
- package/ios/Layouts/Screen/ANNComponentViewController.mm +130 -75
- package/ios/Layouts/Screen/ANNNativeScreenContext.mm +7 -5
- package/ios/Layouts/Screen/ANNPreviewInteraction.h +7 -4
- package/ios/Layouts/Screen/ANNPreviewInteraction.mm +72 -10
- package/ios/Layouts/Screen/ANNScreenEnvironment.h +63 -0
- package/ios/Layouts/Screen/ANNScreenEnvironment.mm +181 -0
- package/ios/Layouts/Screen/ANNScreenPlace.h +53 -0
- package/ios/Layouts/Screen/ANNScreenPlace.mm +205 -0
- package/ios/Layouts/Screen/ANNScreenRegions.h +3 -18
- package/ios/Layouts/Screen/ANNScreenRegions.mm +9 -44
- package/ios/Layouts/Screen/ANNScreenSafeArea.h +4 -9
- package/ios/Layouts/Screen/ANNScreenSafeArea.mm +14 -16
- package/ios/Layouts/Screen/ANNScreenSettling.h +32 -0
- package/ios/Layouts/Screen/ANNScreenSettling.mm +137 -0
- package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +8 -0
- package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +83 -14
- package/ios/Layouts/SplitView/ANNSplitViewCommands.h +3 -2
- package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +105 -39
- package/ios/Layouts/SplitView/ANNSplitViewController.mm +7 -8
- package/ios/Layouts/Stack/ANNPreviewPush.h +7 -6
- package/ios/Layouts/Stack/ANNPreviewPush.mm +142 -27
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +11 -2
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +14 -7
- package/ios/Layouts/Stack/ANNStackCommands.mm +1 -0
- package/ios/Layouts/Stack/ANNStackController.h +8 -0
- package/ios/Layouts/Stack/ANNStackController.mm +184 -16
- package/ios/Layouts/Stack/ANNStackQueue.h +5 -2
- package/ios/Layouts/Stack/ANNStackQueue.mm +56 -43
- package/ios/Layouts/Stack/ANNSwipePopInteraction.h +26 -0
- package/ios/Layouts/Stack/ANNSwipePopInteraction.mm +185 -0
- package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +28 -4
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +4 -2
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +2 -3
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +4 -0
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +11 -0
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.h +12 -1
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +23 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.h +3 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.mm +237 -57
- package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +8 -3
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +6 -2
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +232 -43
- package/ios/Layouts/Tabs/ANNTabsDesign.h +6 -5
- package/ios/Layouts/Tabs/ANNTabsDesign.mm +9 -1
- package/ios/Layouts/Tabs/UITabBar+utils.h +5 -5
- package/ios/Layouts/Tabs/UITabBar+utils.mm +32 -13
- package/ios/Options/ANNAnimationOptions.h +2 -1
- package/ios/Options/ANNAnimationOptions.mm +1 -1
- package/ios/Options/ANNBottomTabsOptions.h +2 -0
- package/ios/Options/ANNBottomTabsOptions.mm +1 -0
- package/ios/Options/ANNOptions.h +25 -0
- package/ios/Options/ANNOptions.mm +157 -1
- package/ios/Options/ANNOptionsCache.h +7 -6
- package/ios/Options/ANNOptionsReader.mm +108 -0
- package/ios/Options/ANNSearchBarOptions.h +4 -3
- package/ios/Options/ANNSheetOptions.h +4 -1
- package/ios/Options/ANNSideMenuOptions.h +2 -0
- package/ios/Options/ANNSideMenuOptions.mm +2 -0
- package/ios/Options/ANNStackPopAnimationOptions.h +13 -0
- package/ios/Options/ANNStackPopAnimationOptions.mm +11 -0
- package/ios/Options/ANNUserChoice.h +57 -0
- package/ios/Options/ANNUserChoice.mm +44 -0
- package/ios/Options/Params/ANNImageSource.h +61 -0
- package/ios/Options/Params/ANNImageSource.mm +101 -0
- package/ios/Options/Params/ANNOptionImages.h +37 -0
- package/ios/Options/Params/ANNOptionImages.mm +284 -0
- package/ios/Options/Params/ANNParam.h +15 -0
- package/ios/Options/Params/ANNParam.mm +61 -0
- package/ios/Options/Params/Color.h +3 -0
- package/ios/Options/Params/Color.mm +21 -0
- package/ios/Options/Params/ColorParser.h +4 -3
- package/ios/Options/Params/ColorParser.mm +22 -4
- package/ios/Options/Params/Image.h +15 -2
- package/ios/Options/Params/Image.mm +35 -2
- package/ios/Options/Params/ImageParser.h +5 -5
- package/ios/Options/Params/ImageParser.mm +28 -46
- package/ios/Public/ApexNavigation/ANNSceneDelegate.h +3 -0
- package/ios/Public/ApexNavigation/ApexNavigation.h +1 -1
- package/ios/RECIPES.md +13 -6
- package/ios/React/ANNReactView.mm +6 -25
- package/ios/React/ANNSafeAreaViewComponentView.mm +28 -17
- package/ios/React/ANNSurfaceHostingView.h +14 -0
- package/ios/React/ANNSurfaceHostingView.mm +144 -1
- package/ios/React/Slots/ANNSlotComponentView.mm +24 -17
- package/ios/React/Slots/ANNSlotContainers.h +14 -6
- package/ios/React/Slots/ANNSlotContainers.mm +75 -2
- package/ios/React/Slots/ANNSlotHost.mm +1 -3
- package/ios/React/Slots/ANNSlotScreenView.mm +8 -2
- package/ios/TopBar/ANNBackButtonPresenter.mm +6 -5
- package/ios/TopBar/ANNBarAppearance.h +2 -1
- package/ios/TopBar/ANNBarAppearance.mm +111 -30
- package/ios/TopBar/ANNBarBackgroundComponent.mm +16 -0
- package/ios/TopBar/ANNBarButtonComponentView.h +4 -4
- package/ios/TopBar/ANNBarButtonComponentView.mm +1 -1
- package/ios/TopBar/ANNBarButtons.h +14 -8
- package/ios/TopBar/ANNBarButtons.mm +397 -80
- package/ios/TopBar/ANNIconButtonImage.h +1 -0
- package/ios/TopBar/ANNIconButtonImage.mm +34 -1
- package/ios/TopBar/ANNLargeTitlePresenter.h +13 -0
- package/ios/TopBar/ANNLargeTitlePresenter.mm +50 -7
- package/ios/TopBar/ANNMainList.h +3 -0
- package/ios/TopBar/ANNMainList.mm +4 -0
- package/ios/TopBar/ANNScrollEdgeEffects.h +22 -6
- package/ios/TopBar/ANNScrollEdgeEffects.mm +123 -16
- package/ios/TopBar/ANNSearchPresenter.mm +172 -21
- package/ios/TopBar/ANNSearchResultsViewController.mm +29 -6
- package/ios/TopBar/ANNTopBarPresenter.h +8 -2
- package/ios/TopBar/ANNTopBarPresenter.mm +155 -33
- package/ios/TurboModules/ANNTurboEventEmitter.mm +4 -35
- package/ios/TurboModules/ANNTurboModule.mm +104 -33
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.cpp +20 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +5 -14
- package/lib/module/ARCHITECTURE.md +40 -27
- package/lib/module/adapters/NativeANNTurboModule.js.map +1 -1
- package/lib/module/api/app/AppRegistry.js +14 -2
- package/lib/module/api/app/AppRegistry.js.map +1 -1
- package/lib/module/api/app/createNavigation.js +190 -66
- package/lib/module/api/app/createNavigation.js.map +1 -1
- package/lib/module/api/commands/commands.js +54 -6
- package/lib/module/api/commands/commands.js.map +1 -1
- package/lib/module/api/events/navigationEvents.js +6 -2
- package/lib/module/api/events/navigationEvents.js.map +1 -1
- package/lib/module/api/hooks/useNavigation.js +8 -3
- package/lib/module/api/hooks/useNavigation.js.map +1 -1
- package/lib/module/api/hooks/useSafeAreaInsets.js +4 -3
- package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -1
- package/lib/module/api/linking/dispatchedLinks.js +23 -0
- package/lib/module/api/linking/dispatchedLinks.js.map +1 -0
- package/lib/module/api/linking/linking.js +11 -0
- package/lib/module/api/linking/linking.js.map +1 -1
- package/lib/module/api/navigation.js.map +1 -1
- package/lib/module/api/options/OptionsChain.js +2 -2
- package/lib/module/api/screens/defineScreen.js +45 -3
- package/lib/module/api/screens/defineScreen.js.map +1 -1
- package/lib/module/api/screens/nativeScreens.js +31 -6
- package/lib/module/api/screens/nativeScreens.js.map +1 -1
- package/lib/module/api/screens/registerScreens.js +193 -35
- package/lib/module/api/screens/registerScreens.js.map +1 -1
- package/lib/module/api/theme/theme.js +5 -0
- package/lib/module/api/theme/theme.js.map +1 -1
- package/lib/module/engine/commands.js +51 -9
- package/lib/module/engine/commands.js.map +1 -1
- package/lib/module/engine/layout.js +20 -11
- package/lib/module/engine/layout.js.map +1 -1
- package/lib/module/engine/nativeScreens.js +9 -0
- package/lib/module/engine/nativeScreens.js.map +1 -1
- package/lib/module/engine/options.js +49 -15
- package/lib/module/engine/options.js.map +1 -1
- package/lib/module/engine/optionsChange.js +102 -0
- package/lib/module/engine/optionsChange.js.map +1 -0
- package/lib/module/engine/places.js +52 -7
- package/lib/module/engine/places.js.map +1 -1
- package/lib/module/engine/props.js +30 -1
- package/lib/module/engine/props.js.map +1 -1
- package/lib/module/engine/refresh.js +85 -0
- package/lib/module/engine/refresh.js.map +1 -0
- package/lib/module/engine/rememberedOptions.js +61 -1
- package/lib/module/engine/rememberedOptions.js.map +1 -1
- package/lib/module/engine/screens.js +77 -16
- package/lib/module/engine/screens.js.map +1 -1
- package/lib/module/interfaces/contract/commands.json +101 -0
- package/lib/module/interfaces/contract/errors.json +275 -0
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts +12 -2
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -1
- package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -1
- package/lib/typescript/api/app/createNavigation.d.ts +8 -3
- package/lib/typescript/api/app/createNavigation.d.ts.map +1 -1
- package/lib/typescript/api/commands/commands.d.ts.map +1 -1
- package/lib/typescript/api/commands/presentation.d.ts +4 -3
- package/lib/typescript/api/commands/presentation.d.ts.map +1 -1
- package/lib/typescript/api/events/navigationEvents.d.ts +3 -3
- package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -1
- package/lib/typescript/api/hooks/useNavigation.d.ts +1 -1
- package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -1
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts +4 -3
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -1
- package/lib/typescript/api/index.d.ts +1 -1
- package/lib/typescript/api/index.d.ts.map +1 -1
- package/lib/typescript/api/linking/dispatchedLinks.d.ts +7 -0
- package/lib/typescript/api/linking/dispatchedLinks.d.ts.map +1 -0
- package/lib/typescript/api/linking/linking.d.ts +8 -0
- package/lib/typescript/api/linking/linking.d.ts.map +1 -1
- package/lib/typescript/api/navigation.d.ts +4 -1
- package/lib/typescript/api/navigation.d.ts.map +1 -1
- package/lib/typescript/api/options/OptionsChain.d.ts +2 -2
- package/lib/typescript/api/screens/defineScreen.d.ts +23 -4
- package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -1
- package/lib/typescript/api/screens/nativeScreens.d.ts +8 -1
- package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -1
- package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -1
- package/lib/typescript/api/theme/theme.d.ts +2 -0
- package/lib/typescript/api/theme/theme.d.ts.map +1 -1
- package/lib/typescript/engine/commands.d.ts +5 -0
- package/lib/typescript/engine/commands.d.ts.map +1 -1
- package/lib/typescript/engine/layout.d.ts.map +1 -1
- package/lib/typescript/engine/nativeScreens.d.ts +5 -0
- package/lib/typescript/engine/nativeScreens.d.ts.map +1 -1
- package/lib/typescript/engine/options.d.ts +5 -2
- package/lib/typescript/engine/options.d.ts.map +1 -1
- package/lib/typescript/engine/optionsChange.d.ts +28 -0
- package/lib/typescript/engine/optionsChange.d.ts.map +1 -0
- package/lib/typescript/engine/places.d.ts +7 -2
- package/lib/typescript/engine/places.d.ts.map +1 -1
- package/lib/typescript/engine/props.d.ts +8 -1
- package/lib/typescript/engine/props.d.ts.map +1 -1
- package/lib/typescript/engine/refresh.d.ts +35 -0
- package/lib/typescript/engine/refresh.d.ts.map +1 -0
- package/lib/typescript/engine/rememberedOptions.d.ts +13 -0
- package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -1
- package/lib/typescript/engine/screens.d.ts +27 -6
- package/lib/typescript/engine/screens.d.ts.map +1 -1
- package/lib/typescript/interfaces/ComponentEvents.d.ts +4 -4
- package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -1
- package/lib/typescript/interfaces/Events.d.ts +28 -10
- package/lib/typescript/interfaces/Events.d.ts.map +1 -1
- package/lib/typescript/interfaces/Options.d.ts +1 -1
- package/lib/typescript/interfaces/Options.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/animations.d.ts +80 -22
- package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/bottomTabs.d.ts +21 -7
- package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/buttons.d.ts +23 -15
- package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/modals.d.ts +34 -26
- package/lib/typescript/interfaces/options/modals.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/sideMenu.d.ts +23 -6
- package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/stack.d.ts +17 -3
- package/lib/typescript/interfaces/options/stack.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/system.d.ts +18 -11
- package/lib/typescript/interfaces/options/system.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/toolbar.d.ts +2 -2
- package/lib/typescript/interfaces/options/topBar.d.ts +68 -38
- package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -1
- package/metro/acceptPlugin.js +57 -0
- package/metro/babelTransformer.js +45 -0
- package/metro/index.js +36 -0
- package/package.json +3 -1
- package/src/ARCHITECTURE.md +40 -27
- package/src/adapters/NativeANNTurboModule.ts +12 -2
- package/src/api/app/AppRegistry.ts +16 -2
- package/src/api/app/createNavigation.ts +203 -69
- package/src/api/commands/commands.ts +48 -7
- package/src/api/commands/presentation.ts +4 -3
- package/src/api/events/navigationEvents.ts +10 -4
- package/src/api/hooks/useNavigation.ts +9 -4
- package/src/api/hooks/useSafeAreaInsets.ts +4 -3
- package/src/api/index.ts +1 -0
- package/src/api/linking/dispatchedLinks.ts +18 -0
- package/src/api/linking/linking.ts +22 -1
- package/src/api/navigation.ts +4 -1
- package/src/api/options/OptionsChain.ts +2 -2
- package/src/api/screens/defineScreen.ts +49 -5
- package/src/api/screens/nativeScreens.ts +40 -4
- package/src/api/screens/registerScreens.tsx +185 -42
- package/src/api/theme/theme.ts +5 -0
- package/src/engine/commands.ts +70 -13
- package/src/engine/layout.ts +27 -11
- package/src/engine/nativeScreens.ts +10 -1
- package/src/engine/options.ts +45 -19
- package/src/engine/optionsChange.ts +107 -0
- package/src/engine/places.ts +65 -7
- package/src/engine/props.ts +30 -1
- package/src/engine/refresh.ts +97 -0
- package/src/engine/rememberedOptions.ts +74 -1
- package/src/engine/screens.tsx +76 -21
- package/src/interfaces/ComponentEvents.ts +4 -4
- package/src/interfaces/Events.ts +29 -10
- package/src/interfaces/Options.ts +1 -0
- package/src/interfaces/contract/commands.json +101 -0
- package/src/interfaces/contract/errors.json +275 -0
- package/src/interfaces/options/animations.ts +81 -22
- package/src/interfaces/options/bottomTabs.ts +21 -7
- package/src/interfaces/options/buttons.ts +23 -15
- package/src/interfaces/options/modals.ts +34 -26
- package/src/interfaces/options/sideMenu.ts +24 -6
- package/src/interfaces/options/stack.ts +17 -3
- package/src/interfaces/options/system.ts +18 -11
- package/src/interfaces/options/toolbar.ts +2 -2
- package/src/interfaces/options/topBar.ts +68 -38
- package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +0 -41
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +0 -69
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +0 -62
- package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +0 -62
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +0 -223
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +0 -31
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +0 -138
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +0 -88
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +0 -33
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +0 -66
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +0 -179
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +0 -139
- package/ios/Layouts/Screen/ANNScreenInsets.h +0 -30
- package/ios/Layouts/Screen/ANNScreenInsets.mm +0 -68
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +0 -27
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +0 -55
package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
package dev.apexnative.navigation.views.stack.topbar.titlebar
|
|
2
2
|
|
|
3
|
-
import android.annotation.SuppressLint
|
|
4
3
|
import android.content.Context
|
|
5
4
|
import android.graphics.Color
|
|
6
5
|
import android.graphics.drawable.Drawable
|
|
7
6
|
import android.text.SpannableString
|
|
8
7
|
import android.text.Spanned
|
|
9
8
|
import android.text.style.ForegroundColorSpan
|
|
10
|
-
import android.view.Menu
|
|
11
|
-
import android.view.MenuItem
|
|
12
|
-
import androidx.appcompat.view.menu.MenuBuilder
|
|
13
9
|
import com.google.android.material.color.MaterialColors
|
|
14
10
|
import dev.apexnative.navigation.options.ButtonMenuOptions
|
|
15
11
|
import dev.apexnative.navigation.utils.MaterialTheme
|
|
@@ -17,78 +13,52 @@ import androidx.appcompat.R as AppCompatR
|
|
|
17
13
|
import com.google.android.material.R as MaterialR
|
|
18
14
|
|
|
19
15
|
/**
|
|
20
|
-
*
|
|
21
|
-
* the destructive ones red, the checked ones with a
|
|
22
|
-
*
|
|
16
|
+
* Turns the items of a bar menu (the overflow menu, the menu of a button) into the entries of a [BarMenu]: their
|
|
17
|
+
* titles and icons, the destructive ones red, the checked ones with a check mark, the items of a `singleSelection` menu
|
|
18
|
+
* with radio buttons. Icons take `textColor` (`topBar.menuTextColor`), else the theme's on-surface-variant color. A
|
|
19
|
+
* pick of an item calls `onPick` with its id; the caller writes a `singleSelection` choice into the screen's options.
|
|
23
20
|
*/
|
|
24
|
-
object ButtonMenus {
|
|
25
|
-
fun
|
|
21
|
+
internal object ButtonMenus {
|
|
22
|
+
fun entries(
|
|
26
23
|
context: Context,
|
|
27
|
-
menu: Menu,
|
|
28
|
-
group: Int,
|
|
29
|
-
firstOrder: Int,
|
|
30
24
|
options: ButtonMenuOptions,
|
|
31
|
-
|
|
25
|
+
textColor: Int?,
|
|
32
26
|
loadIcon: (String) -> Drawable?,
|
|
33
27
|
onPick: (String) -> Unit,
|
|
34
|
-
)
|
|
35
|
-
addElements(context, menu, group, firstOrder, options.items, options.singleSelection, showAsAction, loadIcon, onPick)
|
|
36
|
-
}
|
|
28
|
+
): List<BarMenu.Entry> = entriesOf(context, options.items, options.singleSelection, textColor, loadIcon, onPick)
|
|
37
29
|
|
|
38
|
-
private fun
|
|
30
|
+
private fun entriesOf(
|
|
39
31
|
context: Context,
|
|
40
|
-
menu: Menu,
|
|
41
|
-
group: Int,
|
|
42
|
-
firstOrder: Int,
|
|
43
32
|
elements: List<ButtonMenuOptions.Element>,
|
|
44
33
|
singleSelection: Boolean,
|
|
45
|
-
|
|
34
|
+
textColor: Int?,
|
|
46
35
|
loadIcon: (String) -> Drawable?,
|
|
47
36
|
onPick: (String) -> Unit,
|
|
48
|
-
) {
|
|
49
|
-
val
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (showAsAction != null) item.setShowAsAction(showAsAction)
|
|
73
|
-
}
|
|
74
|
-
if (singleSelection) {
|
|
75
|
-
menu.setGroupCheckable(group, true, true)
|
|
76
|
-
// The group made the submenus checkable too: they open, and have no checkmark.
|
|
77
|
-
submenus.forEach { it.isCheckable = false }
|
|
37
|
+
): List<BarMenu.Entry> = elements.map { element ->
|
|
38
|
+
val destructive = element is ButtonMenuOptions.Item && element.destructive
|
|
39
|
+
val tint = if (destructive) errorColor(context) else textColor ?: iconColor(context)
|
|
40
|
+
val icon = element.icon?.let(loadIcon)?.mutate()?.also { it.setTint(tint) }
|
|
41
|
+
when (element) {
|
|
42
|
+
is ButtonMenuOptions.Submenu -> BarMenu.Entry(
|
|
43
|
+
element.title,
|
|
44
|
+
icon,
|
|
45
|
+
submenu = entriesOf(context, element.items, element.singleSelection, textColor, loadIcon, onPick),
|
|
46
|
+
testId = element.testID,
|
|
47
|
+
)
|
|
48
|
+
is ButtonMenuOptions.Item -> BarMenu.Entry(
|
|
49
|
+
title(context, element),
|
|
50
|
+
icon,
|
|
51
|
+
enabled = !element.disabled,
|
|
52
|
+
check = when {
|
|
53
|
+
singleSelection -> BarMenu.Check.Radio
|
|
54
|
+
element.checked -> BarMenu.Check.Box
|
|
55
|
+
else -> BarMenu.Check.None
|
|
56
|
+
},
|
|
57
|
+
checked = element.checked,
|
|
58
|
+
testId = element.testID,
|
|
59
|
+
onPick = { onPick(element.id) },
|
|
60
|
+
)
|
|
78
61
|
}
|
|
79
|
-
if (elements.any { it.icon != null }) showIcons(menu)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/** Some item of the menu, or of a submenu, has an icon. */
|
|
83
|
-
fun hasIcons(options: ButtonMenuOptions): Boolean = hasIcons(options.items)
|
|
84
|
-
|
|
85
|
-
private fun hasIcons(elements: List<ButtonMenuOptions.Element>): Boolean =
|
|
86
|
-
elements.any { it.icon != null || (it is ButtonMenuOptions.Submenu && hasIcons(it.items)) }
|
|
87
|
-
|
|
88
|
-
// Material's menus have their icons at the start of the items; the toolbar's menus leave them out by default.
|
|
89
|
-
@SuppressLint("RestrictedApi")
|
|
90
|
-
private fun showIcons(menu: Menu) {
|
|
91
|
-
(menu as? MenuBuilder)?.setOptionalIconsVisible(true)
|
|
92
62
|
}
|
|
93
63
|
|
|
94
64
|
private fun title(context: Context, item: ButtonMenuOptions.Item): CharSequence {
|
package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonRow.kt
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
package dev.apexnative.navigation.views.stack.topbar.titlebar
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint
|
|
4
|
+
import android.content.Context
|
|
5
|
+
import android.content.res.ColorStateList
|
|
6
|
+
import android.graphics.drawable.Drawable
|
|
7
|
+
import android.view.MotionEvent
|
|
8
|
+
import android.view.View
|
|
9
|
+
import android.view.ViewGroup
|
|
10
|
+
import androidx.appcompat.R as AppCompatR
|
|
11
|
+
import androidx.appcompat.widget.AppCompatImageButton
|
|
12
|
+
import androidx.appcompat.widget.AppCompatImageView
|
|
13
|
+
import androidx.appcompat.widget.TooltipCompat
|
|
14
|
+
import androidx.core.graphics.drawable.DrawableCompat
|
|
15
|
+
import androidx.core.widget.ImageViewCompat
|
|
16
|
+
import com.google.android.material.R as MaterialR
|
|
17
|
+
import com.google.android.material.theme.overlay.MaterialThemeOverlay
|
|
18
|
+
import dev.apexnative.navigation.utils.MaterialTheme
|
|
19
|
+
import dev.apexnative.navigation.utils.UiUtils
|
|
20
|
+
import kotlin.math.max
|
|
21
|
+
import kotlin.math.min
|
|
22
|
+
import kotlin.math.roundToInt
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The buttons of one side of the bar's row, from the start of the line: the back button ([navigationIcon]), the
|
|
26
|
+
* buttons ([setButtons]), what the core always puts after them ([setTrailing]: the search's magnifier) and "⋮"
|
|
27
|
+
* ([overflowButton]). They stand in the middle of the row, at most 56 dp high, as a Material 3 toolbar stands its
|
|
28
|
+
* buttons, with the toolbar's theme (its ripples); right to left the line mirrors. Main thread only.
|
|
29
|
+
*/
|
|
30
|
+
@SuppressLint("ViewConstructor")
|
|
31
|
+
class ButtonRow(context: Context) : ViewGroup(themed(context)) {
|
|
32
|
+
private val maxButtonHeight = UiUtils.dpToPx(this.context, MAX_BUTTON_HEIGHT_DP).roundToInt()
|
|
33
|
+
private var navigation: AppCompatImageButton? = null
|
|
34
|
+
private var buttons: List<View> = emptyList()
|
|
35
|
+
private var trailing: View? = null
|
|
36
|
+
private var overflow: OverflowButton? = null
|
|
37
|
+
private var overflowColor: Int? = null
|
|
38
|
+
|
|
39
|
+
/** The back button's icon; none hides the button. */
|
|
40
|
+
var navigationIcon: Drawable?
|
|
41
|
+
get() = navigation?.takeIf { it.visibility == VISIBLE }?.drawable
|
|
42
|
+
set(value) {
|
|
43
|
+
if (value == null) {
|
|
44
|
+
navigation?.let {
|
|
45
|
+
it.setImageDrawable(null)
|
|
46
|
+
it.visibility = GONE
|
|
47
|
+
}
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
val button = navigation ?: AppCompatImageButton(context, null, AppCompatR.attr.toolbarNavigationButtonStyle)
|
|
51
|
+
.also {
|
|
52
|
+
navigation = it
|
|
53
|
+
arrange()
|
|
54
|
+
}
|
|
55
|
+
button.setImageDrawable(value)
|
|
56
|
+
button.visibility = VISIBLE
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** The back button's label: its accessibility label and tooltip. */
|
|
60
|
+
var navigationContentDescription: CharSequence?
|
|
61
|
+
get() = navigation?.contentDescription
|
|
62
|
+
set(value) {
|
|
63
|
+
val button = navigation ?: return
|
|
64
|
+
button.contentDescription = value
|
|
65
|
+
TooltipCompat.setTooltipText(button, value)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** The back button's view while it shows; none. */
|
|
69
|
+
val navigationButton: View?
|
|
70
|
+
get() = navigation?.takeIf { it.visibility == VISIBLE }
|
|
71
|
+
|
|
72
|
+
private var navigationListener: OnClickListener? = null
|
|
73
|
+
|
|
74
|
+
/** What a press of the back button does. */
|
|
75
|
+
fun setNavigationOnClickListener(listener: OnClickListener?) {
|
|
76
|
+
navigationListener = listener
|
|
77
|
+
navigation?.setOnClickListener(listener)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** The buttons, in the line's order from its start. A view in another parent moves here. */
|
|
81
|
+
fun setButtons(views: List<View>) {
|
|
82
|
+
buttons = views
|
|
83
|
+
arrange()
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** What stands after the buttons, before "⋮"; none. */
|
|
87
|
+
fun setTrailing(view: View?) {
|
|
88
|
+
if (trailing === view) return
|
|
89
|
+
trailing = view
|
|
90
|
+
arrange()
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** What stands after the buttons now. */
|
|
94
|
+
val trailingView: View?
|
|
95
|
+
get() = trailing
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* "⋮", made the first time it is asked for and shown with [setOverflowShown]: the theme's
|
|
99
|
+
* `actionOverflowButtonStyle`, labelled "More options" in the user's language.
|
|
100
|
+
*/
|
|
101
|
+
val overflowButton: View
|
|
102
|
+
get() = overflow ?: OverflowButton(context).also {
|
|
103
|
+
it.visibility = GONE
|
|
104
|
+
overflowColor?.let { color -> ImageViewCompat.setImageTintList(it, ColorStateList.valueOf(color)) }
|
|
105
|
+
overflow = it
|
|
106
|
+
arrange()
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** "⋮" shows at the end of the line, or not. */
|
|
110
|
+
fun setOverflowShown(shown: Boolean) {
|
|
111
|
+
if (!shown && overflow == null) return
|
|
112
|
+
overflowButton.visibility = if (shown) VISIBLE else GONE
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** The color of "⋮", now or once it is made. */
|
|
116
|
+
fun setOverflowColor(color: Int) {
|
|
117
|
+
overflowColor = color
|
|
118
|
+
overflow?.let { ImageViewCompat.setImageTintList(it, ColorStateList.valueOf(color)) }
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// The children in the line's order, so accessibility reads them in it too; a view that stays where it is isn't
|
|
122
|
+
// moved, which would detach it.
|
|
123
|
+
private fun arrange() {
|
|
124
|
+
val wanted = listOfNotNull(navigation) + buttons + listOfNotNull(trailing, overflow)
|
|
125
|
+
for (index in childCount - 1 downTo 0) {
|
|
126
|
+
if (getChildAt(index) !in wanted) removeViewAt(index)
|
|
127
|
+
}
|
|
128
|
+
wanted.forEachIndexed { index, view ->
|
|
129
|
+
if (index < childCount && getChildAt(index) === view) return@forEachIndexed
|
|
130
|
+
(view.parent as? ViewGroup)?.removeView(view)
|
|
131
|
+
addView(view, index, LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT))
|
|
132
|
+
}
|
|
133
|
+
navigation?.setOnClickListener(navigationListener)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// As a toolbar, the row takes the touches around its buttons: they don't reach a screen under the bar.
|
|
137
|
+
@SuppressLint("ClickableViewAccessibility")
|
|
138
|
+
override fun onTouchEvent(event: MotionEvent?): Boolean = true
|
|
139
|
+
|
|
140
|
+
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
|
141
|
+
val height = MeasureSpec.getSize(heightMeasureSpec)
|
|
142
|
+
val widthMode = MeasureSpec.getMode(widthMeasureSpec)
|
|
143
|
+
val widthSize = MeasureSpec.getSize(widthMeasureSpec)
|
|
144
|
+
val buttonHeight = min(height, maxButtonHeight)
|
|
145
|
+
var used = 0
|
|
146
|
+
for (index in 0 until childCount) {
|
|
147
|
+
val child = getChildAt(index)
|
|
148
|
+
if (child.visibility == GONE) continue
|
|
149
|
+
val widthSpec = if (widthMode == MeasureSpec.UNSPECIFIED) {
|
|
150
|
+
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
|
|
151
|
+
} else {
|
|
152
|
+
MeasureSpec.makeMeasureSpec(max(widthSize - used, 0), MeasureSpec.AT_MOST)
|
|
153
|
+
}
|
|
154
|
+
// The back button takes the whole height a toolbar gives its buttons; the others as much as they need.
|
|
155
|
+
val heightMode = if (child === navigation) MeasureSpec.EXACTLY else MeasureSpec.AT_MOST
|
|
156
|
+
child.measure(widthSpec, MeasureSpec.makeMeasureSpec(buttonHeight, heightMode))
|
|
157
|
+
used += child.measuredWidth
|
|
158
|
+
}
|
|
159
|
+
setMeasuredDimension(resolveSize(used, widthMeasureSpec), height)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
|
|
163
|
+
val width = r - l
|
|
164
|
+
val height = b - t
|
|
165
|
+
val rtl = layoutDirection == LAYOUT_DIRECTION_RTL
|
|
166
|
+
var start = 0
|
|
167
|
+
for (index in 0 until childCount) {
|
|
168
|
+
val child = getChildAt(index)
|
|
169
|
+
if (child.visibility == GONE) continue
|
|
170
|
+
val w = child.measuredWidth
|
|
171
|
+
val x = if (rtl) width - start - w else start
|
|
172
|
+
val top = (height - child.measuredHeight) / 2
|
|
173
|
+
child.layout(x, top, x + w, top + child.measuredHeight)
|
|
174
|
+
start += w
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// "⋮" as a toolbar draws it: its ripple a square around the icon, its label as its tooltip.
|
|
179
|
+
@SuppressLint("ViewConstructor")
|
|
180
|
+
private class OverflowButton(context: Context) :
|
|
181
|
+
AppCompatImageView(context, null, AppCompatR.attr.actionOverflowButtonStyle) {
|
|
182
|
+
init {
|
|
183
|
+
isClickable = true
|
|
184
|
+
isFocusable = true
|
|
185
|
+
TooltipCompat.setTooltipText(this, contentDescription)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
|
|
189
|
+
super.onSizeChanged(w, h, oldw, oldh)
|
|
190
|
+
val background = background ?: return
|
|
191
|
+
if (drawable == null) return
|
|
192
|
+
val half = max(w, h) / 2
|
|
193
|
+
val centerX = (w + paddingLeft - paddingRight) / 2
|
|
194
|
+
val centerY = (h + paddingTop - paddingBottom) / 2
|
|
195
|
+
DrawableCompat.setHotspotBounds(background, centerX - half, centerY - half, centerX + half, centerY + half)
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private companion object {
|
|
200
|
+
// A toolbar's `maxButtonHeight`.
|
|
201
|
+
const val MAX_BUTTON_HEIGHT_DP = 56f
|
|
202
|
+
|
|
203
|
+
// The theme a Material 3 toolbar gives its buttons (`toolbarStyle`'s overlay: its ripples), kept in the
|
|
204
|
+
// current light or dark mode.
|
|
205
|
+
fun themed(context: Context): Context {
|
|
206
|
+
val wrapped = MaterialThemeOverlay.wrap(
|
|
207
|
+
context,
|
|
208
|
+
null,
|
|
209
|
+
AppCompatR.attr.toolbarStyle,
|
|
210
|
+
MaterialR.style.Widget_Material3_Toolbar,
|
|
211
|
+
)
|
|
212
|
+
if (wrapped !== context) MaterialTheme.followOverlay(wrapped)
|
|
213
|
+
return wrapped
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// The height of React content laid out at a width without a height limit, for the Kotlin side
|
|
2
|
+
// (`dev.apexnative.navigation.react.ContentHeights`): a sheet with the 'content' detent. Fabric lays out a copy of the
|
|
3
|
+
// tree for it, so the shown layout stays as it is: a React root's surface here, a slot's content in the slot's own
|
|
4
|
+
// layout (`ANNSlotShadowNode`), which keeps the height in `ANNSlotContentHeights`.
|
|
5
|
+
|
|
6
|
+
#include <fbjni/fbjni.h>
|
|
7
|
+
#include <jni.h>
|
|
8
|
+
#include <react/fabric/SurfaceHandlerBinding.h>
|
|
9
|
+
#include <react/renderer/components/ApexNavigationSpec/ANNSlotState.h>
|
|
10
|
+
#include <react/renderer/core/LayoutConstraints.h>
|
|
11
|
+
#include <react/renderer/core/LayoutContext.h>
|
|
12
|
+
|
|
13
|
+
#include <limits>
|
|
14
|
+
|
|
15
|
+
using namespace facebook;
|
|
16
|
+
|
|
17
|
+
namespace {
|
|
18
|
+
|
|
19
|
+
std::string slotIdOf(jstring slotId) {
|
|
20
|
+
return slotId ? jni::wrap_alias(slotId)->toStdString() : std::string{};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// A React root's surface: React Native keeps the getter of its surface handler unmangled for the native side.
|
|
24
|
+
struct JReactSurfaceImpl : jni::JavaClass<JReactSurfaceImpl> {
|
|
25
|
+
static constexpr auto kJavaDescriptor = "Lcom/facebook/react/runtime/ReactSurfaceImpl;";
|
|
26
|
+
|
|
27
|
+
const react::SurfaceHandler &surfaceHandler() const {
|
|
28
|
+
static const auto method =
|
|
29
|
+
javaClassStatic()->getMethod<react::SurfaceHandlerBinding::javaobject()>("getSurfaceHandler");
|
|
30
|
+
return method(self())->cthis()->getSurfaceHandler();
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
} // namespace
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The height of the surface's content at [width] points without a height limit, in points: `SurfaceHandler::measure`,
|
|
38
|
+
* as iOS's surface measures for `sizeThatFits`. 0 for a surface that doesn't run; -1 on a failure.
|
|
39
|
+
*/
|
|
40
|
+
extern "C" JNIEXPORT jfloat JNICALL Java_dev_apexnative_navigation_react_ContentHeights_nativeSurfaceHeight(
|
|
41
|
+
JNIEnv * /*env*/, jclass /*type*/, jobject surface, jfloat width, jfloat pointScale, jfloat fontScale, jboolean rtl,
|
|
42
|
+
jboolean swapLeftAndRight) {
|
|
43
|
+
try {
|
|
44
|
+
auto ref = jni::wrap_alias(static_cast<JReactSurfaceImpl::javaobject>(surface));
|
|
45
|
+
react::LayoutConstraints constraints{};
|
|
46
|
+
constraints.minimumSize = react::Size{.width = width, .height = 0};
|
|
47
|
+
constraints.maximumSize = react::Size{.width = width, .height = std::numeric_limits<react::Float>::infinity()};
|
|
48
|
+
constraints.layoutDirection = rtl ? react::LayoutDirection::RightToLeft : react::LayoutDirection::LeftToRight;
|
|
49
|
+
react::LayoutContext context{};
|
|
50
|
+
context.pointScaleFactor = pointScale;
|
|
51
|
+
context.fontSizeMultiplier = fontScale;
|
|
52
|
+
context.swapLeftAndRightInRTL = swapLeftAndRight;
|
|
53
|
+
return ref->surfaceHandler().measure(constraints, context).height;
|
|
54
|
+
} catch (...) {
|
|
55
|
+
jni::translatePendingCppExceptionToJavaException();
|
|
56
|
+
return -1;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** The slot's content is measured from its next layout on (`ANNSlotContentHeights::request`). */
|
|
61
|
+
extern "C" JNIEXPORT void JNICALL Java_dev_apexnative_navigation_react_ContentHeights_nativeRequestSlot(
|
|
62
|
+
JNIEnv * /*env*/, jclass /*type*/, jstring slotId) {
|
|
63
|
+
react::ANNSlotContentHeights::request(slotIdOf(slotId));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Whether the slot's content is measured. */
|
|
67
|
+
extern "C" JNIEXPORT jboolean JNICALL Java_dev_apexnative_navigation_react_ContentHeights_nativeIsSlotRequested(
|
|
68
|
+
JNIEnv * /*env*/, jclass /*type*/, jstring slotId) {
|
|
69
|
+
return react::ANNSlotContentHeights::isRequested(slotIdOf(slotId));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** The height of the slot's content at its last layout, in points; negative before it. */
|
|
73
|
+
extern "C" JNIEXPORT jfloat JNICALL Java_dev_apexnative_navigation_react_ContentHeights_nativeSlotHeight(
|
|
74
|
+
JNIEnv * /*env*/, jclass /*type*/, jstring slotId) {
|
|
75
|
+
return react::ANNSlotContentHeights::height(slotIdOf(slotId));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** The slot's screen went: nothing more is measured for it. */
|
|
79
|
+
extern "C" JNIEXPORT void JNICALL Java_dev_apexnative_navigation_react_ContentHeights_nativeForgetSlot(
|
|
80
|
+
JNIEnv * /*env*/, jclass /*type*/, jstring slotId) {
|
|
81
|
+
react::ANNSlotContentHeights::forget(slotIdOf(slotId));
|
|
82
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<!-- Material Icons "arrow_right" (Apache 2.0, android/MATERIAL_SYMBOLS_LICENSE.txt): the arrow of a submenu item in a
|
|
3
|
+
top bar menu, mirrored right to left. -->
|
|
4
|
+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
5
|
+
android:width="24dp"
|
|
6
|
+
android:height="24dp"
|
|
7
|
+
android:autoMirrored="true"
|
|
8
|
+
android:tint="?attr/colorControlNormal"
|
|
9
|
+
android:viewportWidth="24"
|
|
10
|
+
android:viewportHeight="24">
|
|
11
|
+
<path
|
|
12
|
+
android:fillColor="@android:color/white"
|
|
13
|
+
android:pathData="M10,17l5,-5 -5,-5v10z" />
|
|
14
|
+
</vector>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<!-- The title over the items of a submenu of a top bar menu (BarMenu), as AppCompat shows a submenu's title. -->
|
|
3
|
+
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
4
|
+
android:layout_width="match_parent"
|
|
5
|
+
android:layout_height="?attr/listPreferredItemHeightSmall"
|
|
6
|
+
android:minWidth="196dp"
|
|
7
|
+
android:paddingStart="16dp"
|
|
8
|
+
android:paddingEnd="16dp">
|
|
9
|
+
|
|
10
|
+
<TextView
|
|
11
|
+
android:id="@+id/apex_navigation_menu_title"
|
|
12
|
+
android:layout_width="match_parent"
|
|
13
|
+
android:layout_height="wrap_content"
|
|
14
|
+
android:layout_gravity="center_vertical"
|
|
15
|
+
android:ellipsize="end"
|
|
16
|
+
android:singleLine="true"
|
|
17
|
+
android:textAlignment="viewStart"
|
|
18
|
+
android:textAppearance="?attr/textAppearancePopupMenuHeader" />
|
|
19
|
+
</FrameLayout>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
An item of a menu of the top bar (BarMenu), as AppCompat lays out a popup menu's item: the icon, the title, the
|
|
4
|
+
submenu's arrow, the check mark of a checkable item. The inflater of the activity turns the check box and the radio
|
|
5
|
+
button into Material ones, as it does for AppCompat's menus.
|
|
6
|
+
-->
|
|
7
|
+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
8
|
+
android:layout_width="match_parent"
|
|
9
|
+
android:layout_height="?attr/listPreferredItemHeightSmall"
|
|
10
|
+
android:gravity="center_vertical"
|
|
11
|
+
android:minWidth="196dp"
|
|
12
|
+
android:orientation="horizontal"
|
|
13
|
+
android:paddingEnd="16dp">
|
|
14
|
+
|
|
15
|
+
<ImageView
|
|
16
|
+
android:id="@+id/apex_navigation_menu_icon"
|
|
17
|
+
android:layout_width="wrap_content"
|
|
18
|
+
android:layout_height="wrap_content"
|
|
19
|
+
android:layout_marginStart="8dp"
|
|
20
|
+
android:layout_marginTop="8dp"
|
|
21
|
+
android:layout_marginEnd="-8dp"
|
|
22
|
+
android:layout_marginBottom="8dp"
|
|
23
|
+
android:duplicateParentState="true"
|
|
24
|
+
android:importantForAccessibility="no"
|
|
25
|
+
android:scaleType="centerInside"
|
|
26
|
+
android:visibility="gone" />
|
|
27
|
+
|
|
28
|
+
<TextView
|
|
29
|
+
android:id="@+id/apex_navigation_menu_title"
|
|
30
|
+
android:layout_width="0dp"
|
|
31
|
+
android:layout_height="wrap_content"
|
|
32
|
+
android:layout_marginStart="16dp"
|
|
33
|
+
android:layout_weight="1"
|
|
34
|
+
android:duplicateParentState="true"
|
|
35
|
+
android:ellipsize="end"
|
|
36
|
+
android:singleLine="true"
|
|
37
|
+
android:textAlignment="viewStart"
|
|
38
|
+
android:textAppearance="?attr/textAppearanceLargePopupMenu" />
|
|
39
|
+
|
|
40
|
+
<ImageView
|
|
41
|
+
android:id="@+id/apex_navigation_menu_arrow"
|
|
42
|
+
android:layout_width="wrap_content"
|
|
43
|
+
android:layout_height="wrap_content"
|
|
44
|
+
android:layout_marginStart="8dp"
|
|
45
|
+
android:duplicateParentState="true"
|
|
46
|
+
android:importantForAccessibility="no"
|
|
47
|
+
android:scaleType="center"
|
|
48
|
+
android:src="@drawable/apex_navigation_ic_arrow_right"
|
|
49
|
+
android:visibility="gone" />
|
|
50
|
+
|
|
51
|
+
<CheckBox
|
|
52
|
+
android:id="@+id/apex_navigation_menu_check"
|
|
53
|
+
android:layout_width="wrap_content"
|
|
54
|
+
android:layout_height="wrap_content"
|
|
55
|
+
android:clickable="false"
|
|
56
|
+
android:duplicateParentState="true"
|
|
57
|
+
android:focusable="false"
|
|
58
|
+
android:visibility="gone" />
|
|
59
|
+
|
|
60
|
+
<RadioButton
|
|
61
|
+
android:id="@+id/apex_navigation_menu_radio"
|
|
62
|
+
android:layout_width="wrap_content"
|
|
63
|
+
android:layout_height="wrap_content"
|
|
64
|
+
android:clickable="false"
|
|
65
|
+
android:duplicateParentState="true"
|
|
66
|
+
android:focusable="false"
|
|
67
|
+
android:visibility="gone" />
|
|
68
|
+
</LinearLayout>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<style name="ThemeOverlay.ApexNavigation.TopBar" parent="ThemeOverlay.Material3.Toolbar.Surface" />
|
|
9
9
|
|
|
10
10
|
<!--
|
|
11
|
-
The popup theme of the bar's
|
|
11
|
+
The popup theme of the bar's "⋮" menu, when the app's Material 3 theme is fixed to light or to
|
|
12
12
|
dark and doesn't follow the device's mode: a day/night overlay that gives the menu Material 3's colors of the
|
|
13
13
|
current mode where the app's theme shows the other one, and leaves the app's colors in the mode it shows
|
|
14
14
|
(values-night has the dark side). An app theme that follows the mode needs none: the menu takes the bar's theme.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="utf-8"?>
|
|
2
2
|
<resources>
|
|
3
|
-
<!-- The popup themes of the bar's
|
|
3
|
+
<!-- The popup themes of the bar's "⋮" in dark mode: see values/styles.xml. -->
|
|
4
4
|
<style name="ThemeOverlay.ApexNavigation.TopBar.PopupOverLight" parent="ThemeOverlay.Material3.Dark" />
|
|
5
5
|
<style name="ThemeOverlay.ApexNavigation.TopBar.PopupOverDark" parent="" />
|
|
6
6
|
</resources>
|
package/cli/app.js
CHANGED
|
@@ -9,7 +9,7 @@ const { exec } = require('./exec');
|
|
|
9
9
|
const MINIMUM = [0, 85];
|
|
10
10
|
|
|
11
11
|
/** The newest React Native the navigation was checked with: `init` makes apps of its newest patch. */
|
|
12
|
-
const TESTED = [0,
|
|
12
|
+
const TESTED = [0, 88];
|
|
13
13
|
|
|
14
14
|
/** The name the navigation is installed under. */
|
|
15
15
|
const PACKAGE = '@apexnative/navigation';
|