@apexnative/navigation 1.0.0-alpha.1 → 1.0.0-alpha.11

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.
Files changed (581) hide show
  1. package/ApexNavigation.podspec +2 -1
  2. package/CHANGELOG.md +132 -0
  3. package/README.md +147 -51
  4. package/android/CLAUDE.md +78 -25
  5. package/android/CORE.md +49 -25
  6. package/android/RECIPES.md +13 -6
  7. package/android/consumer-rules.pro +6 -0
  8. package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +85 -10
  9. package/android/src/main/java/dev/apexnative/navigation/NavigationApplication.kt +34 -13
  10. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutChecks.kt +5 -1
  11. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutNode.kt +6 -2
  12. package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenContext.kt +2 -2
  13. package/android/src/main/java/dev/apexnative/navigation/options/AnimationsOptions.kt +2 -2
  14. package/android/src/main/java/dev/apexnative/navigation/options/BottomTabOptions.kt +1 -1
  15. package/android/src/main/java/dev/apexnative/navigation/options/BottomTabsOptions.kt +13 -8
  16. package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +2 -2
  17. package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +3 -3
  18. package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +9 -1
  19. package/android/src/main/java/dev/apexnative/navigation/options/LargeTitleOptions.kt +1 -1
  20. package/android/src/main/java/dev/apexnative/navigation/options/LayoutAnimation.kt +1 -1
  21. package/android/src/main/java/dev/apexnative/navigation/options/OptionKey.kt +18 -0
  22. package/android/src/main/java/dev/apexnative/navigation/options/OptionPaths.kt +91 -0
  23. package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +8 -4
  24. package/android/src/main/java/dev/apexnative/navigation/options/SheetOptions.kt +7 -4
  25. package/android/src/main/java/dev/apexnative/navigation/options/SideMenuOptions.kt +6 -1
  26. package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +40 -2
  27. package/android/src/main/java/dev/apexnative/navigation/options/StatusBarOptions.kt +7 -3
  28. package/android/src/main/java/dev/apexnative/navigation/options/TitleOptions.kt +2 -2
  29. package/android/src/main/java/dev/apexnative/navigation/options/TopBarAppearanceOptions.kt +1 -1
  30. package/android/src/main/java/dev/apexnative/navigation/options/TopBarOptions.kt +16 -7
  31. package/android/src/main/java/dev/apexnative/navigation/options/UserChoices.kt +159 -0
  32. package/android/src/main/java/dev/apexnative/navigation/react/CommandAnswer.kt +29 -36
  33. package/android/src/main/java/dev/apexnative/navigation/react/CommandContract.kt +59 -0
  34. package/android/src/main/java/dev/apexnative/navigation/react/ContentHeights.kt +95 -0
  35. package/android/src/main/java/dev/apexnative/navigation/react/ContentMounts.kt +66 -0
  36. package/android/src/main/java/dev/apexnative/navigation/react/ErrorTexts.kt +75 -60
  37. package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +35 -23
  38. package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +12 -7
  39. package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +42 -4
  40. package/android/src/main/java/dev/apexnative/navigation/react/PendingCalls.kt +48 -0
  41. package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +54 -20
  42. package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +7 -6
  43. package/android/src/main/java/dev/apexnative/navigation/react/ScreenEnvironment.kt +177 -0
  44. package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +19 -50
  45. package/android/src/main/java/dev/apexnative/navigation/react/ScrollEvents.kt +49 -128
  46. package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +50 -81
  47. package/android/src/main/java/dev/apexnative/navigation/react/events/EventContract.kt +226 -0
  48. package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +135 -94
  49. package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationState.kt +154 -0
  50. package/android/src/main/java/dev/apexnative/navigation/react/events/ScreenAppearance.kt +0 -6
  51. package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +12 -10
  52. package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +10 -7
  53. package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +39 -19
  54. package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +16 -4
  55. package/android/src/main/java/dev/apexnative/navigation/slots/SlotViews.kt +40 -0
  56. package/android/src/main/java/dev/apexnative/navigation/utils/ImageKey.kt +66 -0
  57. package/android/src/main/java/dev/apexnative/navigation/utils/ImageLoader.kt +7 -89
  58. package/android/src/main/java/dev/apexnative/navigation/utils/ImageRequests.kt +76 -0
  59. package/android/src/main/java/dev/apexnative/navigation/utils/MaterialTheme.kt +5 -6
  60. package/android/src/main/java/dev/apexnative/navigation/utils/OptionImages.kt +262 -0
  61. package/android/src/main/java/dev/apexnative/navigation/utils/SystemAnimations.kt +36 -0
  62. package/android/src/main/java/dev/apexnative/navigation/utils/UiUtils.kt +3 -3
  63. package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +3 -1
  64. package/android/src/main/java/dev/apexnative/navigation/utils/ViewExtensions.kt +0 -13
  65. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +10 -7
  66. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementDefinition.kt +9 -3
  67. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementPlanner.kt +20 -15
  68. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/SecondaryScreenPresenter.kt +13 -5
  69. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/AppliedTabCalls.kt +49 -0
  70. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +5 -3
  71. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +108 -34
  72. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +25 -24
  73. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +22 -0
  74. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +3 -3
  75. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +0 -5
  76. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +28 -7
  77. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +12 -9
  78. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +2 -2
  79. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +27 -7
  80. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +1 -1
  81. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +103 -56
  82. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +29 -11
  83. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +2 -6
  84. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +22 -24
  85. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +109 -21
  86. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +21 -6
  87. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +476 -73
  88. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +57 -25
  89. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetBack.kt +42 -0
  90. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetStops.kt +83 -0
  91. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackCheck.kt +50 -0
  92. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +49 -14
  93. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +71 -12
  94. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +37 -11
  95. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +10 -8
  96. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +11 -4
  97. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +3 -3
  98. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +6 -6
  99. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +42 -9
  100. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +19 -8
  101. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +16 -7
  102. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +43 -4
  103. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +23 -0
  104. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +77 -17
  105. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/BackPreview.kt +315 -0
  106. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +3 -3
  107. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +30 -20
  108. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +216 -18
  109. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +26 -1
  110. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +149 -41
  111. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +26 -8
  112. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +115 -6
  113. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabMotion.kt +142 -0
  114. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +222 -48
  115. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +3 -5
  116. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +30 -34
  117. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +5 -51
  118. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarRowTransition.kt +3 -2
  119. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +11 -5
  120. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +13 -56
  121. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +219 -54
  122. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +9 -2
  123. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +6 -9
  124. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +75 -21
  125. package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationLayer.kt +73 -0
  126. package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +29 -11
  127. package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +14 -0
  128. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +9 -7
  129. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +61 -2
  130. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +0 -5
  131. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +72 -10
  132. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStep.kt +31 -0
  133. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +143 -135
  134. package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +13 -5
  135. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +37 -112
  136. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +9 -6
  137. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionViews.kt +100 -0
  138. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +112 -4
  139. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +346 -36
  140. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMorph.kt +199 -0
  141. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +56 -41
  142. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextMorph.kt +176 -0
  143. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewMorph.kt +108 -0
  144. package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +12 -3
  145. package/android/src/main/java/dev/apexnative/navigation/views/stack/ScreenEdge.kt +45 -0
  146. package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +140 -1
  147. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +14 -10
  148. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCopy.kt +85 -0
  149. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +13 -0
  150. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +5 -17
  151. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +73 -34
  152. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +6 -6
  153. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonView.kt +113 -0
  154. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarMenu.kt +219 -0
  155. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +125 -178
  156. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +34 -64
  157. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonRow.kt +216 -0
  158. package/android/src/main/jni/ANNContentHeights.cpp +82 -0
  159. package/android/src/main/res/drawable/apex_navigation_ic_arrow_right.xml +14 -0
  160. package/android/src/main/res/layout/apex_navigation_menu_header.xml +19 -0
  161. package/android/src/main/res/layout/apex_navigation_menu_item.xml +68 -0
  162. package/android/src/main/res/values/styles.xml +1 -1
  163. package/android/src/main/res/values-night/styles.xml +1 -1
  164. package/cli/app.js +1 -1
  165. package/cli/doctor/checks/app.js +77 -14
  166. package/cli/doctor/checks/splash.js +4 -22
  167. package/cli/migrate/native.js +18 -0
  168. package/cli/project.js +10 -2
  169. package/cli/setup/index.js +18 -0
  170. package/cli/setup/source.js +2 -1
  171. package/cli/setup/steps/appDelegate.js +66 -11
  172. package/cli/setup/steps/mainApplication.js +134 -19
  173. package/cli/setup/steps/metro.js +46 -0
  174. package/cli/setup/steps/sceneDelegate.js +108 -0
  175. package/cli/splash/index.js +3 -1
  176. package/docs-md/architecture/native-screens.md +4 -0
  177. package/docs-md/architecture/theme-and-context.md +131 -12
  178. package/docs-md/architecture/transitions.md +58 -12
  179. package/docs-md/containers/arrangement.md +17 -1
  180. package/docs-md/containers/modals.md +8 -4
  181. package/docs-md/containers/overlays.md +3 -1
  182. package/docs-md/containers/side-menu.md +19 -2
  183. package/docs-md/containers/tabs.md +5 -1
  184. package/docs-md/flows/bottom-sheets.md +4 -2
  185. package/docs-md/flows/forms-in-a-modal.md +1 -1
  186. package/docs-md/fundamentals/screens-and-props.md +9 -1
  187. package/docs-md/fundamentals/starting-the-app.md +1 -1
  188. package/docs-md/guides/cli.md +4 -3
  189. package/docs-md/guides/deep-links.md +15 -33
  190. package/docs-md/help/glossary.md +4 -4
  191. package/docs-md/help/troubleshooting.md +44 -6
  192. package/docs-md/index.json +61 -1
  193. package/docs-md/migration/from-expo-router.md +1 -1
  194. package/docs-md/migration/from-react-native-navigation.md +9 -3
  195. package/docs-md/migration/from-react-navigation.md +2 -2
  196. package/docs-md/screen-ui/back-and-gestures.md +46 -2
  197. package/docs-md/screen-ui/bar-buttons.md +5 -5
  198. package/docs-md/screen-ui/search.md +1 -1
  199. package/docs-md/screen-ui/system-ui.md +17 -12
  200. package/docs-md/screen-ui/toolbar-and-fab.md +4 -2
  201. package/docs-md/screen-ui/top-bar.md +8 -4
  202. package/docs-md/start/installation.md +21 -3
  203. package/ios/Animations/ANNFrameDriver.h +55 -15
  204. package/ios/Animations/ANNFrameDriver.mm +216 -60
  205. package/ios/Animations/ANNTransitionAnimator.h +26 -5
  206. package/ios/Animations/ANNTransitionAnimator.mm +61 -13
  207. package/ios/Animations/ANNTransitionPlan.h +2 -2
  208. package/ios/Animations/ANNTransitionPlan.mm +10 -0
  209. package/ios/Animations/ANNTransitionWait.mm +6 -7
  210. package/ios/Animations/Elements/ANNElementFinder.h +57 -0
  211. package/ios/Animations/Elements/ANNElementFinder.mm +174 -2
  212. package/ios/Animations/Elements/ANNElementTransition.h +10 -8
  213. package/ios/Animations/Elements/ANNElementTransition.mm +19 -21
  214. package/ios/Animations/Elements/ANNSharedElementFlight.h +16 -11
  215. package/ios/Animations/Elements/ANNSharedElementFlight.mm +308 -69
  216. package/ios/Animations/Interpolators/ANNInterpolate.h +2 -30
  217. package/ios/Animations/Interpolators/ANNTransformParts.h +48 -0
  218. package/ios/Animations/Interpolators/ANNTransformParts.mm +507 -0
  219. package/ios/Animations/Interpolators/ANNViewTracks.h +9 -6
  220. package/ios/Animations/Interpolators/ANNViewTracks.mm +100 -30
  221. package/ios/CLAUDE.md +60 -24
  222. package/ios/CORE.md +44 -34
  223. package/ios/Contract/ANNCommandAnswer.h +13 -5
  224. package/ios/Contract/ANNCommandAnswer.mm +40 -32
  225. package/ios/Contract/ANNCommandContract.h +15 -0
  226. package/ios/Contract/ANNCommandContract.mm +78 -0
  227. package/ios/Contract/ANNCommandRunner.h +10 -9
  228. package/ios/Contract/ANNCommandRunner.mm +22 -28
  229. package/ios/Contract/ANNErrorTexts.h +6 -2
  230. package/ios/Contract/ANNErrorTexts.mm +18 -10
  231. package/ios/Contract/ANNLayoutNode.h +3 -3
  232. package/ios/Contract/ANNLayoutReader.h +3 -3
  233. package/ios/Core/ANNAppDelegate.mm +0 -2
  234. package/ios/Core/ANNAppearanceDispatcher.h +5 -4
  235. package/ios/Core/ANNAppearanceDispatcher.mm +12 -1
  236. package/ios/Core/ANNDeepLinkQueue.h +22 -2
  237. package/ios/Core/ANNDeepLinkQueue.mm +121 -14
  238. package/ios/Core/ANNErrorHandler.h +9 -4
  239. package/ios/Core/ANNErrorHandler.mm +20 -2
  240. package/ios/Core/ANNEventContract.h +246 -0
  241. package/ios/Core/ANNEventContract.mm +225 -0
  242. package/ios/Core/ANNEventEmitter.h +6 -2
  243. package/ios/Core/ANNEventEmitter.mm +117 -80
  244. package/ios/Core/ANNHinge.h +6 -0
  245. package/ios/Core/ANNHinge.mm +15 -4
  246. package/ios/Core/ANNJavaScriptCalls.h +33 -0
  247. package/ios/Core/ANNJavaScriptCalls.mm +52 -0
  248. package/ios/Core/ANNLayoutProtocol.h +5 -5
  249. package/ios/Core/ANNNavigationState.h +7 -5
  250. package/ios/Core/ANNNavigationState.mm +8 -7
  251. package/ios/Core/ANNNodeHelper.h +32 -12
  252. package/ios/Core/ANNNodeHelper.mm +100 -3
  253. package/ios/Core/ANNParking.h +5 -4
  254. package/ios/Core/ANNReloadCoordinator.mm +5 -12
  255. package/ios/Core/ANNRenderWait.h +20 -6
  256. package/ios/Core/ANNRenderWait.mm +143 -56
  257. package/ios/Core/ANNSceneDelegate.mm +25 -15
  258. package/ios/Core/ANNSystemUI.h +3 -2
  259. package/ios/Core/ANNSystemUI.mm +7 -0
  260. package/ios/Core/ANNUtils.h +7 -0
  261. package/ios/Core/ANNUtils.mm +10 -0
  262. package/ios/Core/ApexNavigation+Internal.h +1 -1
  263. package/ios/Core/ApexNavigation.mm +7 -6
  264. package/ios/Core/UIViewController+LayoutProtocol.h +9 -2
  265. package/ios/Core/UIViewController+LayoutProtocol.mm +8 -0
  266. package/ios/Layouts/Arrangement/ANNArrangementState.h +2 -17
  267. package/ios/Layouts/Arrangement/ANNArrangementState.mm +0 -38
  268. package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +195 -21
  269. package/ios/Layouts/Modal/ANNModalCoordinator.h +1 -1
  270. package/ios/Layouts/Modal/ANNModalCoordinator.mm +57 -16
  271. package/ios/Layouts/Modal/ANNModalPresentation.h +8 -5
  272. package/ios/Layouts/Modal/ANNModalPresentation.mm +12 -12
  273. package/ios/Layouts/Modal/ANNSheetPresenter.mm +83 -1
  274. package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +2 -8
  275. package/ios/Layouts/Root/ANNRootCoordinator.mm +58 -19
  276. package/ios/Layouts/Root/ANNSplashViewController.h +5 -3
  277. package/ios/Layouts/Root/ANNSplashViewController.mm +147 -0
  278. package/ios/Layouts/Screen/ANNComponentPresenter.h +11 -3
  279. package/ios/Layouts/Screen/ANNComponentPresenter.mm +34 -6
  280. package/ios/Layouts/Screen/ANNComponentViewController.h +15 -13
  281. package/ios/Layouts/Screen/ANNComponentViewController.mm +130 -75
  282. package/ios/Layouts/Screen/ANNNativeScreenContext.mm +7 -5
  283. package/ios/Layouts/Screen/ANNPreviewInteraction.h +7 -4
  284. package/ios/Layouts/Screen/ANNPreviewInteraction.mm +72 -10
  285. package/ios/Layouts/Screen/ANNScreenEnvironment.h +63 -0
  286. package/ios/Layouts/Screen/ANNScreenEnvironment.mm +181 -0
  287. package/ios/Layouts/Screen/ANNScreenPlace.h +53 -0
  288. package/ios/Layouts/Screen/ANNScreenPlace.mm +205 -0
  289. package/ios/Layouts/Screen/ANNScreenRegions.h +3 -18
  290. package/ios/Layouts/Screen/ANNScreenRegions.mm +9 -44
  291. package/ios/Layouts/Screen/ANNScreenSafeArea.h +4 -9
  292. package/ios/Layouts/Screen/ANNScreenSafeArea.mm +14 -16
  293. package/ios/Layouts/Screen/ANNScreenSettling.h +34 -0
  294. package/ios/Layouts/Screen/ANNScreenSettling.mm +171 -0
  295. package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +8 -0
  296. package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +83 -14
  297. package/ios/Layouts/SplitView/ANNSplitViewCommands.h +3 -2
  298. package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +105 -39
  299. package/ios/Layouts/SplitView/ANNSplitViewController.mm +7 -8
  300. package/ios/Layouts/Stack/ANNPreviewPush.h +7 -6
  301. package/ios/Layouts/Stack/ANNPreviewPush.mm +142 -27
  302. package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +11 -2
  303. package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +14 -7
  304. package/ios/Layouts/Stack/ANNStackCommands.mm +1 -0
  305. package/ios/Layouts/Stack/ANNStackController.h +8 -0
  306. package/ios/Layouts/Stack/ANNStackController.mm +184 -16
  307. package/ios/Layouts/Stack/ANNStackQueue.h +5 -2
  308. package/ios/Layouts/Stack/ANNStackQueue.mm +56 -43
  309. package/ios/Layouts/Stack/ANNSwipePopInteraction.h +26 -0
  310. package/ios/Layouts/Stack/ANNSwipePopInteraction.mm +185 -0
  311. package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +28 -4
  312. package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +4 -2
  313. package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +2 -3
  314. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +4 -0
  315. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +11 -0
  316. package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.h +12 -1
  317. package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +23 -0
  318. package/ios/Layouts/Tabs/ANNBottomTabsController.h +3 -0
  319. package/ios/Layouts/Tabs/ANNBottomTabsController.mm +237 -57
  320. package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +8 -3
  321. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +6 -2
  322. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +232 -43
  323. package/ios/Layouts/Tabs/ANNTabsDesign.h +6 -5
  324. package/ios/Layouts/Tabs/ANNTabsDesign.mm +9 -1
  325. package/ios/Layouts/Tabs/UITabBar+utils.h +5 -5
  326. package/ios/Layouts/Tabs/UITabBar+utils.mm +32 -13
  327. package/ios/Options/ANNAnimationOptions.h +2 -1
  328. package/ios/Options/ANNAnimationOptions.mm +1 -1
  329. package/ios/Options/ANNBottomTabsOptions.h +2 -0
  330. package/ios/Options/ANNBottomTabsOptions.mm +1 -0
  331. package/ios/Options/ANNOptions.h +25 -0
  332. package/ios/Options/ANNOptions.mm +157 -1
  333. package/ios/Options/ANNOptionsCache.h +7 -6
  334. package/ios/Options/ANNOptionsReader.mm +108 -0
  335. package/ios/Options/ANNSearchBarOptions.h +4 -3
  336. package/ios/Options/ANNSheetOptions.h +4 -1
  337. package/ios/Options/ANNSideMenuOptions.h +2 -0
  338. package/ios/Options/ANNSideMenuOptions.mm +2 -0
  339. package/ios/Options/ANNStackPopAnimationOptions.h +13 -0
  340. package/ios/Options/ANNStackPopAnimationOptions.mm +11 -0
  341. package/ios/Options/ANNUserChoice.h +57 -0
  342. package/ios/Options/ANNUserChoice.mm +44 -0
  343. package/ios/Options/Params/ANNImageSource.h +61 -0
  344. package/ios/Options/Params/ANNImageSource.mm +101 -0
  345. package/ios/Options/Params/ANNOptionImages.h +37 -0
  346. package/ios/Options/Params/ANNOptionImages.mm +284 -0
  347. package/ios/Options/Params/ANNParam.h +15 -0
  348. package/ios/Options/Params/ANNParam.mm +61 -0
  349. package/ios/Options/Params/Color.h +3 -0
  350. package/ios/Options/Params/Color.mm +21 -0
  351. package/ios/Options/Params/ColorParser.h +4 -3
  352. package/ios/Options/Params/ColorParser.mm +22 -4
  353. package/ios/Options/Params/Image.h +15 -2
  354. package/ios/Options/Params/Image.mm +35 -2
  355. package/ios/Options/Params/ImageParser.h +5 -5
  356. package/ios/Options/Params/ImageParser.mm +28 -46
  357. package/ios/Public/ApexNavigation/ANNSceneDelegate.h +3 -0
  358. package/ios/Public/ApexNavigation/ApexNavigation.h +1 -1
  359. package/ios/RECIPES.md +13 -6
  360. package/ios/React/ANNReactView.mm +6 -25
  361. package/ios/React/ANNSafeAreaViewComponentView.mm +28 -17
  362. package/ios/React/ANNSurfaceHostingView.h +14 -0
  363. package/ios/React/ANNSurfaceHostingView.mm +144 -1
  364. package/ios/React/Slots/ANNSlotComponentView.mm +24 -17
  365. package/ios/React/Slots/ANNSlotContainers.h +14 -6
  366. package/ios/React/Slots/ANNSlotContainers.mm +75 -2
  367. package/ios/React/Slots/ANNSlotHost.mm +1 -3
  368. package/ios/React/Slots/ANNSlotScreenView.mm +8 -2
  369. package/ios/TopBar/ANNBackButtonPresenter.mm +6 -5
  370. package/ios/TopBar/ANNBarAppearance.h +2 -1
  371. package/ios/TopBar/ANNBarAppearance.mm +111 -30
  372. package/ios/TopBar/ANNBarBackgroundComponent.mm +16 -0
  373. package/ios/TopBar/ANNBarButtonComponentView.h +4 -4
  374. package/ios/TopBar/ANNBarButtonComponentView.mm +1 -1
  375. package/ios/TopBar/ANNBarButtons.h +14 -8
  376. package/ios/TopBar/ANNBarButtons.mm +397 -80
  377. package/ios/TopBar/ANNIconButtonImage.h +1 -0
  378. package/ios/TopBar/ANNIconButtonImage.mm +34 -1
  379. package/ios/TopBar/ANNLargeTitlePresenter.h +13 -0
  380. package/ios/TopBar/ANNLargeTitlePresenter.mm +50 -7
  381. package/ios/TopBar/ANNMainList.h +3 -0
  382. package/ios/TopBar/ANNMainList.mm +4 -0
  383. package/ios/TopBar/ANNScrollEdgeEffects.h +22 -6
  384. package/ios/TopBar/ANNScrollEdgeEffects.mm +123 -16
  385. package/ios/TopBar/ANNSearchPresenter.mm +172 -21
  386. package/ios/TopBar/ANNSearchResultsViewController.mm +29 -6
  387. package/ios/TopBar/ANNTopBarPresenter.h +8 -2
  388. package/ios/TopBar/ANNTopBarPresenter.mm +155 -33
  389. package/ios/TurboModules/ANNTurboEventEmitter.mm +4 -35
  390. package/ios/TurboModules/ANNTurboModule.mm +104 -33
  391. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.cpp +20 -0
  392. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +5 -14
  393. package/lib/module/ARCHITECTURE.md +40 -27
  394. package/lib/module/adapters/NativeANNTurboModule.js.map +1 -1
  395. package/lib/module/api/app/AppRegistry.js +14 -2
  396. package/lib/module/api/app/AppRegistry.js.map +1 -1
  397. package/lib/module/api/app/createNavigation.js +190 -66
  398. package/lib/module/api/app/createNavigation.js.map +1 -1
  399. package/lib/module/api/commands/commands.js +54 -6
  400. package/lib/module/api/commands/commands.js.map +1 -1
  401. package/lib/module/api/events/navigationEvents.js +6 -2
  402. package/lib/module/api/events/navigationEvents.js.map +1 -1
  403. package/lib/module/api/hooks/useNavigation.js +8 -3
  404. package/lib/module/api/hooks/useNavigation.js.map +1 -1
  405. package/lib/module/api/hooks/useSafeAreaInsets.js +4 -3
  406. package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -1
  407. package/lib/module/api/linking/dispatchedLinks.js +23 -0
  408. package/lib/module/api/linking/dispatchedLinks.js.map +1 -0
  409. package/lib/module/api/linking/linking.js +11 -0
  410. package/lib/module/api/linking/linking.js.map +1 -1
  411. package/lib/module/api/navigation.js.map +1 -1
  412. package/lib/module/api/options/OptionsChain.js +2 -2
  413. package/lib/module/api/screens/arrangement.js +5 -2
  414. package/lib/module/api/screens/arrangement.js.map +1 -1
  415. package/lib/module/api/screens/defineScreen.js +45 -3
  416. package/lib/module/api/screens/defineScreen.js.map +1 -1
  417. package/lib/module/api/screens/nativeScreens.js +31 -6
  418. package/lib/module/api/screens/nativeScreens.js.map +1 -1
  419. package/lib/module/api/screens/registerScreens.js +193 -35
  420. package/lib/module/api/screens/registerScreens.js.map +1 -1
  421. package/lib/module/api/theme/theme.js +5 -0
  422. package/lib/module/api/theme/theme.js.map +1 -1
  423. package/lib/module/engine/commands.js +51 -9
  424. package/lib/module/engine/commands.js.map +1 -1
  425. package/lib/module/engine/layout.js +20 -11
  426. package/lib/module/engine/layout.js.map +1 -1
  427. package/lib/module/engine/nativeScreens.js +9 -0
  428. package/lib/module/engine/nativeScreens.js.map +1 -1
  429. package/lib/module/engine/options.js +49 -15
  430. package/lib/module/engine/options.js.map +1 -1
  431. package/lib/module/engine/optionsChange.js +102 -0
  432. package/lib/module/engine/optionsChange.js.map +1 -0
  433. package/lib/module/engine/places.js +52 -7
  434. package/lib/module/engine/places.js.map +1 -1
  435. package/lib/module/engine/props.js +30 -1
  436. package/lib/module/engine/props.js.map +1 -1
  437. package/lib/module/engine/refresh.js +85 -0
  438. package/lib/module/engine/refresh.js.map +1 -0
  439. package/lib/module/engine/rememberedOptions.js +61 -1
  440. package/lib/module/engine/rememberedOptions.js.map +1 -1
  441. package/lib/module/engine/screens.js +77 -16
  442. package/lib/module/engine/screens.js.map +1 -1
  443. package/lib/module/interfaces/contract/commands.json +101 -0
  444. package/lib/module/interfaces/contract/errors.json +275 -0
  445. package/lib/typescript/adapters/NativeANNTurboModule.d.ts +12 -2
  446. package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -1
  447. package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -1
  448. package/lib/typescript/api/app/createNavigation.d.ts +8 -3
  449. package/lib/typescript/api/app/createNavigation.d.ts.map +1 -1
  450. package/lib/typescript/api/commands/commands.d.ts.map +1 -1
  451. package/lib/typescript/api/commands/presentation.d.ts +4 -3
  452. package/lib/typescript/api/commands/presentation.d.ts.map +1 -1
  453. package/lib/typescript/api/events/navigationEvents.d.ts +3 -3
  454. package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -1
  455. package/lib/typescript/api/hooks/useNavigation.d.ts +1 -1
  456. package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -1
  457. package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts +4 -3
  458. package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -1
  459. package/lib/typescript/api/index.d.ts +1 -1
  460. package/lib/typescript/api/index.d.ts.map +1 -1
  461. package/lib/typescript/api/linking/dispatchedLinks.d.ts +7 -0
  462. package/lib/typescript/api/linking/dispatchedLinks.d.ts.map +1 -0
  463. package/lib/typescript/api/linking/linking.d.ts +8 -0
  464. package/lib/typescript/api/linking/linking.d.ts.map +1 -1
  465. package/lib/typescript/api/navigation.d.ts +4 -1
  466. package/lib/typescript/api/navigation.d.ts.map +1 -1
  467. package/lib/typescript/api/options/OptionsChain.d.ts +2 -2
  468. package/lib/typescript/api/screens/arrangement.d.ts +12 -2
  469. package/lib/typescript/api/screens/arrangement.d.ts.map +1 -1
  470. package/lib/typescript/api/screens/defineScreen.d.ts +23 -4
  471. package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -1
  472. package/lib/typescript/api/screens/nativeScreens.d.ts +8 -1
  473. package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -1
  474. package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -1
  475. package/lib/typescript/api/theme/theme.d.ts +2 -0
  476. package/lib/typescript/api/theme/theme.d.ts.map +1 -1
  477. package/lib/typescript/engine/commands.d.ts +5 -0
  478. package/lib/typescript/engine/commands.d.ts.map +1 -1
  479. package/lib/typescript/engine/layout.d.ts.map +1 -1
  480. package/lib/typescript/engine/nativeScreens.d.ts +5 -0
  481. package/lib/typescript/engine/nativeScreens.d.ts.map +1 -1
  482. package/lib/typescript/engine/options.d.ts +5 -2
  483. package/lib/typescript/engine/options.d.ts.map +1 -1
  484. package/lib/typescript/engine/optionsChange.d.ts +28 -0
  485. package/lib/typescript/engine/optionsChange.d.ts.map +1 -0
  486. package/lib/typescript/engine/places.d.ts +7 -2
  487. package/lib/typescript/engine/places.d.ts.map +1 -1
  488. package/lib/typescript/engine/props.d.ts +8 -1
  489. package/lib/typescript/engine/props.d.ts.map +1 -1
  490. package/lib/typescript/engine/refresh.d.ts +35 -0
  491. package/lib/typescript/engine/refresh.d.ts.map +1 -0
  492. package/lib/typescript/engine/rememberedOptions.d.ts +13 -0
  493. package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -1
  494. package/lib/typescript/engine/screens.d.ts +27 -6
  495. package/lib/typescript/engine/screens.d.ts.map +1 -1
  496. package/lib/typescript/interfaces/ComponentEvents.d.ts +4 -4
  497. package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -1
  498. package/lib/typescript/interfaces/Events.d.ts +28 -10
  499. package/lib/typescript/interfaces/Events.d.ts.map +1 -1
  500. package/lib/typescript/interfaces/Options.d.ts +1 -1
  501. package/lib/typescript/interfaces/Options.d.ts.map +1 -1
  502. package/lib/typescript/interfaces/options/animations.d.ts +80 -22
  503. package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
  504. package/lib/typescript/interfaces/options/bottomTabs.d.ts +21 -7
  505. package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -1
  506. package/lib/typescript/interfaces/options/buttons.d.ts +23 -15
  507. package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -1
  508. package/lib/typescript/interfaces/options/modals.d.ts +34 -26
  509. package/lib/typescript/interfaces/options/modals.d.ts.map +1 -1
  510. package/lib/typescript/interfaces/options/sideMenu.d.ts +23 -6
  511. package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -1
  512. package/lib/typescript/interfaces/options/stack.d.ts +17 -3
  513. package/lib/typescript/interfaces/options/stack.d.ts.map +1 -1
  514. package/lib/typescript/interfaces/options/system.d.ts +18 -11
  515. package/lib/typescript/interfaces/options/system.d.ts.map +1 -1
  516. package/lib/typescript/interfaces/options/toolbar.d.ts +2 -2
  517. package/lib/typescript/interfaces/options/topBar.d.ts +68 -38
  518. package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -1
  519. package/metro/acceptPlugin.js +57 -0
  520. package/metro/babelTransformer.js +45 -0
  521. package/metro/index.js +36 -0
  522. package/package.json +3 -1
  523. package/src/ARCHITECTURE.md +40 -27
  524. package/src/adapters/NativeANNTurboModule.ts +12 -2
  525. package/src/api/app/AppRegistry.ts +16 -2
  526. package/src/api/app/createNavigation.ts +203 -69
  527. package/src/api/commands/commands.ts +48 -7
  528. package/src/api/commands/presentation.ts +4 -3
  529. package/src/api/events/navigationEvents.ts +10 -4
  530. package/src/api/hooks/useNavigation.ts +9 -4
  531. package/src/api/hooks/useSafeAreaInsets.ts +4 -3
  532. package/src/api/index.ts +1 -0
  533. package/src/api/linking/dispatchedLinks.ts +18 -0
  534. package/src/api/linking/linking.ts +22 -1
  535. package/src/api/navigation.ts +4 -1
  536. package/src/api/options/OptionsChain.ts +2 -2
  537. package/src/api/screens/arrangement.ts +17 -4
  538. package/src/api/screens/defineScreen.ts +49 -5
  539. package/src/api/screens/nativeScreens.ts +40 -4
  540. package/src/api/screens/registerScreens.tsx +185 -42
  541. package/src/api/theme/theme.ts +5 -0
  542. package/src/engine/commands.ts +70 -13
  543. package/src/engine/layout.ts +27 -11
  544. package/src/engine/nativeScreens.ts +10 -1
  545. package/src/engine/options.ts +45 -19
  546. package/src/engine/optionsChange.ts +107 -0
  547. package/src/engine/places.ts +65 -7
  548. package/src/engine/props.ts +30 -1
  549. package/src/engine/refresh.ts +97 -0
  550. package/src/engine/rememberedOptions.ts +74 -1
  551. package/src/engine/screens.tsx +76 -21
  552. package/src/interfaces/ComponentEvents.ts +4 -4
  553. package/src/interfaces/Events.ts +29 -10
  554. package/src/interfaces/Options.ts +1 -0
  555. package/src/interfaces/contract/commands.json +101 -0
  556. package/src/interfaces/contract/errors.json +275 -0
  557. package/src/interfaces/options/animations.ts +81 -22
  558. package/src/interfaces/options/bottomTabs.ts +21 -7
  559. package/src/interfaces/options/buttons.ts +23 -15
  560. package/src/interfaces/options/modals.ts +34 -26
  561. package/src/interfaces/options/sideMenu.ts +24 -6
  562. package/src/interfaces/options/stack.ts +17 -3
  563. package/src/interfaces/options/system.ts +18 -11
  564. package/src/interfaces/options/toolbar.ts +2 -2
  565. package/src/interfaces/options/topBar.ts +68 -38
  566. package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +0 -41
  567. package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +0 -69
  568. package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +0 -62
  569. package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +0 -62
  570. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +0 -223
  571. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +0 -31
  572. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +0 -138
  573. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +0 -88
  574. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +0 -33
  575. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +0 -66
  576. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +0 -179
  577. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +0 -139
  578. package/ios/Layouts/Screen/ANNScreenInsets.h +0 -30
  579. package/ios/Layouts/Screen/ANNScreenInsets.mm +0 -68
  580. package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +0 -27
  581. package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +0 -55
@@ -1,223 +0,0 @@
1
- package dev.apexnative.navigation.viewcontrollers.bottomtabs
2
-
3
- import android.app.Activity
4
- import android.app.Application
5
- import android.os.Bundle
6
- import android.view.View
7
- import android.view.ViewGroup
8
- import android.view.ViewTreeObserver
9
- import androidx.core.view.ViewCompat
10
- import androidx.core.view.WindowInsetsCompat
11
- import dev.apexnative.navigation.NavigationActivity
12
- import dev.apexnative.navigation.utils.UiUtils
13
- import dev.apexnative.navigation.viewcontrollers.modal.ModalContainer
14
- import dev.apexnative.navigation.views.bottomtabs.BottomTabsLayout
15
- import dev.apexnative.navigation.views.bottomtabs.CustomTabRow
16
- import java.util.WeakHashMap
17
-
18
- /**
19
- * Puts the custom rows of the tabs in their place, as it works now: an observer of every activity of the process that
20
- * touches only the navigation's activities; on each layout pass of such a window it finds the tabs with a row through
21
- * the view tree, and puts each row in the window's content right above the layer holding its tabs (after the rows
22
- * already there) — tabs in a modal: in the modal's own view, right above its root's view (or its sheet), so the row
23
- * moves with the modal and newer modals cover it —, over the bar as [CustomTabRowGeometry] says — applied only when it
24
- * changed, so UI tests reach idle. A row whose tabs left the window leaves it too, and comes back to its place as they
25
- * do. Before each frame the row takes its tabs' alpha (a root that waits under the old one is transparent) and the
26
- * motion of the bar's container, and stays out of accessibility and touches while they wait. Main thread only.
27
- */
28
- internal object CustomTabRowPlacer : Application.ActivityLifecycleCallbacks {
29
- private var registered = false
30
- // The listeners of each observed activity's window.
31
- private val observed = WeakHashMap<Activity, Listeners>()
32
- // The rows placed at the last layout pass of each activity, with their tabs.
33
- private val rows = WeakHashMap<CustomTabRow, BottomTabsLayout>()
34
-
35
- private class Listeners(
36
- val observer: ViewTreeObserver,
37
- val layout: ViewTreeObserver.OnGlobalLayoutListener,
38
- val draw: ViewTreeObserver.OnPreDrawListener,
39
- )
40
-
41
- /** [activity] has tabs with a row: its window is observed from now on, and the process's later activities. */
42
- fun track(activity: Activity) {
43
- if (!registered) {
44
- registered = true
45
- activity.application?.registerActivityLifecycleCallbacks(this)
46
- }
47
- observe(activity)
48
- }
49
-
50
- /** The tabs of [row] go: the row leaves the window. */
51
- fun forget(row: CustomTabRow) {
52
- rows.remove(row)
53
- (row.parent as? ViewGroup)?.removeView(row)
54
- }
55
-
56
- override fun onActivityResumed(activity: Activity) = observe(activity)
57
-
58
- override fun onActivityDestroyed(activity: Activity) {
59
- val listeners = observed.remove(activity) ?: return
60
- if (!listeners.observer.isAlive) return
61
- listeners.observer.removeOnGlobalLayoutListener(listeners.layout)
62
- listeners.observer.removeOnPreDrawListener(listeners.draw)
63
- }
64
-
65
- override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) = Unit
66
-
67
- override fun onActivityStarted(activity: Activity) = Unit
68
-
69
- override fun onActivityPaused(activity: Activity) = Unit
70
-
71
- override fun onActivityStopped(activity: Activity) = Unit
72
-
73
- override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) = Unit
74
-
75
- // Only the navigation's activities: another activity's views are never looked for.
76
- private fun observe(activity: Activity) {
77
- if (activity !is NavigationActivity || observed.containsKey(activity)) return
78
- val decor = activity.window?.decorView ?: return
79
- val observer = decor.viewTreeObserver
80
- val layout = ViewTreeObserver.OnGlobalLayoutListener { place(activity) }
81
- val draw = ViewTreeObserver.OnPreDrawListener {
82
- follow(activity)
83
- true
84
- }
85
- observer.addOnGlobalLayoutListener(layout)
86
- observer.addOnPreDrawListener(draw)
87
- observed[activity] = Listeners(observer, layout, draw)
88
- }
89
-
90
- private fun contentOf(activity: Activity): ViewGroup? =
91
- activity.window?.decorView?.findViewById(android.R.id.content)
92
-
93
- // Each layout pass: the tabs with a row in the content, and the rows in their places.
94
- private fun place(activity: NavigationActivity) {
95
- val content = contentOf(activity) ?: return
96
- val found = ArrayList<BottomTabsLayout>()
97
- collect(content, found)
98
- val placed = found.mapNotNull { tabs -> tabs.row?.also { place(activity, content, tabs, it) } }.toSet()
99
- // A row whose tabs left the window leaves it too.
100
- rows.entries.filter { (row, tabs) -> row !in placed && tabs.context === activity }.forEach { (row, _) ->
101
- (row.parent as? ViewGroup)?.removeView(row)
102
- }
103
- }
104
-
105
- private fun collect(view: View, found: MutableList<BottomTabsLayout>) {
106
- if (view is CustomTabRow) return
107
- if (view is BottomTabsLayout && view.row != null) found += view
108
- if (view is ViewGroup) for (index in 0 until view.childCount) collect(view.getChildAt(index), found)
109
- }
110
-
111
- private fun place(activity: NavigationActivity, content: ViewGroup, tabs: BottomTabsLayout, row: CustomTabRow) {
112
- rows[row] = tabs
113
- val (host, layer) = placeIn(content, tabs) ?: return
114
- if (row.parent !== host) {
115
- (row.parent as? ViewGroup)?.removeView(row)
116
- // Margins of the host's own kind: the host converts them (a frame or a coordinator layout).
117
- host.addView(row, indexAbove(host, layer, row), ViewGroup.MarginLayoutParams(0, 0))
118
- row.place = null
119
- } else if (host.indexOfChild(row) != indexAbove(host, layer, row)) {
120
- val params = row.layoutParams
121
- host.removeView(row)
122
- host.addView(row, indexAbove(host, layer, row), params)
123
- }
124
- row.showWith(tabs.bar)
125
- if (tabs.bar.visibility == View.GONE || tabs.bar.width == 0) return
126
- val place = placeOf(activity, host, tabs, row)
127
- if (!CustomTabRowGeometry.needsPlacing(row.place, place)) return
128
- row.place = place
129
- val params = row.layoutParams as? ViewGroup.MarginLayoutParams ?: return
130
- params.width = place.right - place.left
131
- params.height = place.bottom - place.top
132
- params.leftMargin = place.left
133
- params.topMargin = place.top
134
- row.layoutParams = params
135
- }
136
-
137
- // Over the bar: its edges less the margins, its bottom, the height of the content and the margin below it, in the
138
- // coordinates of the row's [host].
139
- private fun placeOf(
140
- activity: Activity,
141
- host: ViewGroup,
142
- tabs: BottomTabsLayout,
143
- row: CustomTabRow,
144
- ): CustomTabRowGeometry.Place {
145
- val bar = IntArray(2).also(tabs.bar::getLocationInWindow)
146
- val origin = IntArray(2).also(host::getLocationInWindow)
147
- val options = row.options
148
- val margin = UiUtils.dpToPixels(
149
- activity,
150
- options.horizontalMargin.get(CustomTabRowGeometry.HORIZONTAL_MARGIN_DP.toDouble()),
151
- )
152
- val height = options.height.get(null)?.let { UiUtils.dpToPixels(activity, it) }
153
- val extra = UiUtils.dpToPixels(activity, CustomTabRowGeometry.EXTRA_HEIGHT_DP.toDouble())
154
- // Where the bar rests: its container's motion (a ride, a slide, the hide on scroll) the row takes before each
155
- // frame as its own translation.
156
- val left = bar[0] - origin[0] - tabs.container.translationX.toInt()
157
- val top = bar[1] - origin[1] - tabs.container.translationY.toInt()
158
- // Never over the navigation bar's buttons: the bar is above them, and so is the row.
159
- val navigationBar = if ((activity as? NavigationActivity)?.isEdgeToEdge == true) navigationBarOf(host) else 0
160
- return CustomTabRowGeometry.place(
161
- barLeft = left,
162
- barRight = left + tabs.bar.width,
163
- barBottom = minOf(top + tabs.bar.height, host.height - navigationBar),
164
- margin = margin,
165
- content = CustomTabRowGeometry.content(tabs.bar.height, height, extra),
166
- bottomMargin = UiUtils.dpToPixels(activity, options.bottomMargin.get(0.0)),
167
- )
168
- }
169
-
170
- // The navigation bar at the bottom of the window, through the compat insets on every version.
171
- private fun navigationBarOf(view: View): Int =
172
- ViewCompat.getRootWindowInsets(view)?.getInsets(WindowInsetsCompat.Type.navigationBars())?.bottom ?: 0
173
-
174
- // Where the row of [tabs] goes, and the child there it goes right above: tabs in a modal, the modal's own view and
175
- // the view in it that holds them (its root's, or its sheet's container); else the content and the layer of the
176
- // root or of the overlays. A sheet's drag moves it without a layout: the row doesn't follow a drag.
177
- private fun placeIn(content: ViewGroup, tabs: View): Pair<ViewGroup, View>? {
178
- var current: View = tabs
179
- while (true) {
180
- val parent = current.parent as? ViewGroup ?: return null
181
- if (parent is ModalContainer || parent === content) return parent to current
182
- current = parent
183
- }
184
- }
185
-
186
- // Right above [layer], after the rows already there.
187
- private fun indexAbove(host: ViewGroup, layer: View, row: CustomTabRow): Int {
188
- var index = host.indexOfChild(layer) + 1
189
- while (index < host.childCount) {
190
- val child = host.getChildAt(index)
191
- if (child !is CustomTabRow || child === row) break
192
- index++
193
- }
194
- return index
195
- }
196
-
197
- // Before each frame: the row takes the alpha of its tabs up to the view it is in and the container's translation,
198
- // and leaves accessibility while they wait to show.
199
- private fun follow(activity: Activity) {
200
- val content = contentOf(activity) ?: return
201
- for ((row, tabs) in rows) {
202
- val host = row.parent as? View ?: continue
203
- if (host !== content && host !is ModalContainer) continue
204
- var alpha = tabs.container.alpha
205
- var current: View? = tabs
206
- while (current != null && current !== host) {
207
- alpha *= current.alpha
208
- current = current.parent as? View
209
- }
210
- if (row.alpha != alpha) row.alpha = alpha
211
- // The row goes with the bar's container: a ride, a slide, the hide on scroll.
212
- val container = tabs.container
213
- if (row.translationX != container.translationX) row.translationX = container.translationX
214
- if (row.translationY != container.translationY) row.translationY = container.translationY
215
- val mode = if (row.hiddenFromAccessibility()) {
216
- View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
217
- } else {
218
- View.IMPORTANT_FOR_ACCESSIBILITY_AUTO
219
- }
220
- if (row.importantForAccessibility != mode) row.importantForAccessibility = mode
221
- }
222
- }
223
- }
@@ -1,31 +0,0 @@
1
- package dev.apexnative.navigation.views.element
2
-
3
- import android.annotation.SuppressLint
4
- import android.content.Context
5
- import android.graphics.Canvas
6
- import android.view.MotionEvent
7
- import android.view.View
8
-
9
- /**
10
- * The empty view that stands in an element's place in its parent while the element is in the transition layer: the same
11
- * id at the same index with the same layout, so Fabric finds the parent's children as it left them; React removing it
12
- * removes the element for good. It has no `nativeID`, so no search finds it as the element. It draws nothing and takes
13
- * no touches. Main thread only.
14
- */
15
- @SuppressLint("ViewConstructor")
16
- internal class ElementStub(context: Context, element: View) : View(context) {
17
- init {
18
- id = element.id
19
- importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO
20
- isClickable = false
21
- isFocusable = false
22
- }
23
-
24
- override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) =
25
- setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec))
26
-
27
- override fun draw(canvas: Canvas) = Unit
28
-
29
- @SuppressLint("ClickableViewAccessibility")
30
- override fun onTouchEvent(event: MotionEvent?): Boolean = false
31
- }
@@ -1,138 +0,0 @@
1
- package dev.apexnative.navigation.views.element.animators
2
-
3
- import android.animation.Animator
4
- import android.graphics.Matrix
5
- import android.view.View
6
- import android.view.ViewOutlineProvider
7
- import android.widget.ImageView
8
- import androidx.core.animation.doOnEnd
9
- import androidx.core.animation.doOnStart
10
- import com.facebook.react.views.view.ReactViewGroup
11
- import dev.apexnative.navigation.utils.borderRadius
12
- import dev.apexnative.navigation.views.animations.ValueInterpolation
13
- import dev.apexnative.navigation.views.element.TransitionLayer
14
- import kotlin.math.max
15
- import kotlin.math.min
16
- import kotlin.math.roundToInt
17
-
18
- /**
19
- * A shared image of another kind (an `ImageView` that isn't React Native's): its place by a translation; its image
20
- * matrix from `from`'s fit (`centerCrop`, `fitXY`, `fitCenter`, `centerInside`) to its own, the part seen from `from`'s
21
- * size to its own, the corner radius of the parent that clips it (`borderRadius` with `overflow: hidden`) by its
22
- * outline. Another fit: the pair moves without the change of its matrix, and a line goes to the log. Everything goes
23
- * back as it was at the end. Main thread only.
24
- */
25
- internal class ImageMatrixAnimator(
26
- private val from: ImageView,
27
- private val to: ImageView,
28
- private val layer: TransitionLayer,
29
- /** The parents the views are clipped by in their screens: [to]'s is the one it had before the layer. */
30
- private val fromParent: View?,
31
- private val toParent: View?,
32
- private val id: String,
33
- private val log: (String) -> Unit,
34
- ) {
35
- /** The animator; none when [to] has no place in the layer. */
36
- fun create(): Animator? {
37
- val geometry = FlightGeometry.of(from, to, layer) ?: return null
38
- val toRect = geometry.to
39
- val fromFit = from.scaleType
40
- val toFit = to.scaleType
41
- // The image whose matrix changes; none when a fit isn't one of the four or there is no image to fit.
42
- val image = to.drawable?.takeIf {
43
- fromFit in FITS && toFit in FITS && it.intrinsicWidth > 0 && it.intrinsicHeight > 0
44
- }
45
- val fits = image != null
46
- if (!fits) log("The image '$id' fits by ${fromFit.name} and ${toFit.name}: it moves without a change of fit")
47
- val fromRadius = clipRadius(fromParent) * geometry.fromScale
48
- val toRadius = clipRadius(toParent)
49
- val outline = FlightOutline()
50
- var savedProvider: ViewOutlineProvider? = null
51
- var savedClip = false
52
- val savedMatrix = Matrix(to.imageMatrix)
53
- val start = FloatArray(MATRIX)
54
- val end = FloatArray(MATRIX)
55
- val values = FloatArray(MATRIX)
56
- val matrix = Matrix()
57
- return MoveAnimator().apply {
58
- fun frame(time: Float) {
59
- val f = curve.getInterpolation(time)
60
- val left = ValueInterpolation.number(geometry.from.left, toRect.left, f, time)
61
- val top = ValueInterpolation.number(geometry.from.top, toRect.top, f, time)
62
- val width = ValueInterpolation.number(geometry.from.width(), toRect.width(), f, time).roundToInt()
63
- val height = ValueInterpolation.number(geometry.from.height(), toRect.height(), f, time).roundToInt()
64
- layer.place(to, toRect.left.toInt(), toRect.top.toInt(), width, height)
65
- to.translationX = left - toRect.left
66
- to.translationY = top - toRect.top
67
- outline.width = width
68
- outline.height = height
69
- outline.radius = ValueInterpolation.number(fromRadius, toRadius, f, time)
70
- to.invalidateOutline()
71
- if (image != null) {
72
- val imageWidth = image.intrinsicWidth
73
- val imageHeight = image.intrinsicHeight
74
- fitMatrix(fromFit, imageWidth, imageHeight, width, height).getValues(start)
75
- fitMatrix(toFit, imageWidth, imageHeight, width, height).getValues(end)
76
- for (i in 0 until MATRIX) values[i] = ValueInterpolation.number(start[i], end[i], f, time)
77
- matrix.setValues(values)
78
- to.imageMatrix = matrix
79
- }
80
- }
81
- doOnStart {
82
- savedProvider = to.outlineProvider
83
- savedClip = to.clipToOutline
84
- to.outlineProvider = outline
85
- to.clipToOutline = true
86
- if (fits) to.scaleType = ImageView.ScaleType.MATRIX
87
- frame(0f)
88
- }
89
- addUpdateListener { frame(it.animatedFraction) }
90
- doOnEnd {
91
- if (fits) {
92
- to.scaleType = toFit
93
- to.imageMatrix = savedMatrix
94
- }
95
- to.outlineProvider = savedProvider
96
- to.clipToOutline = savedClip
97
- to.translationX = 0f
98
- to.translationY = 0f
99
- layer.place(to, toRect.left.toInt(), toRect.top.toInt(), toRect.width().toInt(),
100
- toRect.height().toInt())
101
- }
102
- }
103
- }
104
-
105
- // The radius of a React parent that clips what is in it; 0 for another.
106
- private fun clipRadius(parent: View?): Float =
107
- (parent as? ReactViewGroup)?.takeIf { it.overflow == HIDDEN }?.borderRadius ?: 0f
108
-
109
- private companion object {
110
- const val MATRIX = 9
111
- const val HIDDEN = "hidden"
112
- val FITS = setOf(
113
- ImageView.ScaleType.CENTER_CROP,
114
- ImageView.ScaleType.FIT_XY,
115
- ImageView.ScaleType.FIT_CENTER,
116
- ImageView.ScaleType.CENTER_INSIDE,
117
- )
118
-
119
- // The matrix of a fit of an image of [imageWidth] × [imageHeight] into [width] × [height].
120
- fun fitMatrix(fit: ImageView.ScaleType, imageWidth: Int, imageHeight: Int, width: Int, height: Int): Matrix {
121
- val sx = width.toFloat() / imageWidth
122
- val sy = height.toFloat() / imageHeight
123
- val matrix = Matrix()
124
- if (fit == ImageView.ScaleType.FIT_XY) {
125
- matrix.setScale(sx, sy)
126
- return matrix
127
- }
128
- val scale = when (fit) {
129
- ImageView.ScaleType.CENTER_CROP -> max(sx, sy)
130
- ImageView.ScaleType.CENTER_INSIDE -> min(1f, min(sx, sy))
131
- else -> min(sx, sy)
132
- }
133
- matrix.setScale(scale, scale)
134
- matrix.postTranslate((width - imageWidth * scale) / 2f, (height - imageHeight * scale) / 2f)
135
- return matrix
136
- }
137
- }
138
- }
@@ -1,88 +0,0 @@
1
- package dev.apexnative.navigation.views.element.animators
2
-
3
- import android.animation.Animator
4
- import android.view.View
5
- import android.view.ViewOutlineProvider
6
- import androidx.core.animation.doOnEnd
7
- import androidx.core.animation.doOnStart
8
- import com.facebook.react.uimanager.BackgroundStyleApplicator
9
- import com.facebook.react.uimanager.style.BorderRadiusProp
10
- import dev.apexnative.navigation.utils.borderRadius
11
- import dev.apexnative.navigation.views.animations.ValueInterpolation
12
- import dev.apexnative.navigation.views.element.TransitionLayer
13
- import kotlin.math.roundToInt
14
-
15
- /**
16
- * A shared React view without children moves itself: from `from`'s place on the screen to its own by a translation; its
17
- * size and corner radius by an outline that grows from `from`'s (at the scale of its parents) to its own while it is
18
- * laid out at the larger of the two sizes; its own radius taken off meanwhile and put back as it was; its background
19
- * color from `from`'s to its own in Lab, ending exactly on its own (`BackgroundStyleApplicator`); its rotation from
20
- * `from`'s to its own. Main thread only.
21
- */
22
- internal class PlainViewAnimator(
23
- private val from: View,
24
- private val to: View,
25
- private val layer: TransitionLayer,
26
- ) {
27
- /** The animator; none when [to] has no place in the layer. */
28
- fun create(): Animator? {
29
- val geometry = FlightGeometry.of(from, to, layer) ?: return null
30
- val fromRadius = from.borderRadius * geometry.fromScale
31
- val toRadius = to.borderRadius
32
- val fromColor = BackgroundStyleApplicator.getBackgroundColor(from)
33
- val toColor = BackgroundStyleApplicator.getBackgroundColor(to)
34
- val fromRotation = from.rotation
35
- val toRotation = to.rotation
36
- val ownRadius = BackgroundStyleApplicator.getBorderRadius(to, RADIUS)
37
- val outline = FlightOutline()
38
- var savedProvider: ViewOutlineProvider? = null
39
- var savedClip = false
40
- val (width, height) = geometry.largest
41
- val toRect = geometry.to
42
- return MoveAnimator().apply {
43
- fun frame(time: Float) {
44
- val f = curve.getInterpolation(time)
45
- val left = ValueInterpolation.number(geometry.from.left, toRect.left, f, time)
46
- val top = ValueInterpolation.number(geometry.from.top, toRect.top, f, time)
47
- to.translationX = left - toRect.left
48
- to.translationY = top - toRect.top
49
- val from = geometry.from
50
- outline.width = ValueInterpolation.number(from.width(), toRect.width(), f, time).roundToInt()
51
- outline.height = ValueInterpolation.number(from.height(), toRect.height(), f, time).roundToInt()
52
- outline.radius = ValueInterpolation.number(fromRadius, toRadius, f, time)
53
- to.invalidateOutline()
54
- if (fromColor != toColor) {
55
- val color = ValueInterpolation.color(fromColor, toColor, f, time)
56
- BackgroundStyleApplicator.setBackgroundColor(to, color)
57
- }
58
- to.rotation = ValueInterpolation.number(fromRotation, toRotation, f, time)
59
- }
60
- doOnStart {
61
- savedProvider = to.outlineProvider
62
- savedClip = to.clipToOutline
63
- if (ownRadius != null) BackgroundStyleApplicator.setBorderRadius(to, RADIUS, null)
64
- to.outlineProvider = outline
65
- to.clipToOutline = true
66
- layer.place(to, toRect.left.toInt(), toRect.top.toInt(), width, height)
67
- frame(0f)
68
- }
69
- addUpdateListener { frame(it.animatedFraction) }
70
- // A cancelled flight ends too: the view goes back whole.
71
- doOnEnd {
72
- to.translationX = 0f
73
- to.translationY = 0f
74
- to.rotation = toRotation
75
- if (fromColor != toColor) BackgroundStyleApplicator.setBackgroundColor(to, toColor)
76
- if (ownRadius != null) BackgroundStyleApplicator.setBorderRadius(to, RADIUS, ownRadius)
77
- to.outlineProvider = savedProvider
78
- to.clipToOutline = savedClip
79
- layer.place(to, toRect.left.toInt(), toRect.top.toInt(), toRect.width().toInt(),
80
- toRect.height().toInt())
81
- }
82
- }
83
- }
84
-
85
- private companion object {
86
- val RADIUS = BorderRadiusProp.BORDER_RADIUS
87
- }
88
- }
@@ -1,33 +0,0 @@
1
- package dev.apexnative.navigation.views.element.animators
2
-
3
- import android.animation.Animator
4
- import android.view.View
5
- import dev.apexnative.navigation.options.SharedElementTransitionOptions
6
-
7
- /**
8
- * One animator of a shared element: how [from], on the screen that goes, becomes [to], on the screen that comes, when
9
- * both are of [type]. The core picks one by the views' classes (`SharedAnimatorFactory`) and runs it in the
10
- * transition's layer.
11
- */
12
- abstract class PropertyAnimatorCreator<T : View>(
13
- protected val from: View,
14
- protected val to: View,
15
- private val type: Class<T>,
16
- ) {
17
- /** Whether this animator takes part: both views are of its type and differ in what it animates. */
18
- fun shouldAnimate(): Boolean {
19
- if (!type.isInstance(from) || !type.isInstance(to)) return false
20
- val fromChild = type.cast(from) ?: return false
21
- val toChild = type.cast(to) ?: return false
22
- return shouldAnimateProperty(fromChild, toChild)
23
- }
24
-
25
- /** Whether [fromChild] and [toChild] differ in what this animator animates. */
26
- abstract fun shouldAnimateProperty(fromChild: T, toChild: T): Boolean
27
-
28
- /**
29
- * The animator of the pair for [options]; the core gives it the pair's duration, delay and curve (each animator
30
- * its own, never through a set around it).
31
- */
32
- abstract fun create(options: SharedElementTransitionOptions): Animator
33
- }
@@ -1,66 +0,0 @@
1
- package dev.apexnative.navigation.views.element.animators
2
-
3
- import android.animation.Animator
4
- import androidx.core.animation.doOnEnd
5
- import androidx.core.animation.doOnStart
6
- import com.facebook.drawee.drawable.ScalingUtils
7
- import com.facebook.react.views.image.ReactImageView
8
- import dev.apexnative.navigation.views.animations.ValueInterpolation
9
- import dev.apexnative.navigation.views.element.TransitionLayer
10
- import kotlin.math.roundToInt
11
-
12
- /**
13
- * A shared React image: its place by a translation from `from`'s on the screen; its content by Fresco's scale type
14
- * going from `from`'s fit to its own (`ScalingUtils.InterpolatingScaleType`); the part seen from `from`'s size to its
15
- * own (it is laid out at the size of each frame); its rotation from `from`'s to its own; Fresco's own fade off
16
- * meanwhile. Everything goes back as it was at the end. Main thread only.
17
- */
18
- internal class ReactImageAnimator(
19
- private val from: ReactImageView,
20
- private val to: ReactImageView,
21
- private val layer: TransitionLayer,
22
- ) {
23
- /** The animator; none when [to] has no place in the layer or no hierarchy. */
24
- fun create(): Animator? {
25
- if (!from.hasHierarchy() || !to.hasHierarchy()) return null
26
- val geometry = FlightGeometry.of(from, to, layer) ?: return null
27
- val toRect = geometry.to
28
- val toType = to.hierarchy.actualImageScaleType ?: ScalingUtils.ScaleType.CENTER_CROP
29
- val fromType = from.hierarchy.actualImageScaleType ?: ScalingUtils.ScaleType.CENTER_CROP
30
- val scale = ScalingUtils.InterpolatingScaleType(fromType, toType)
31
- val fromRotation = from.rotation
32
- val toRotation = to.rotation
33
- var savedFade = 0
34
- return MoveAnimator().apply {
35
- fun frame(time: Float) {
36
- val f = curve.getInterpolation(time)
37
- val left = ValueInterpolation.number(geometry.from.left, toRect.left, f, time)
38
- val top = ValueInterpolation.number(geometry.from.top, toRect.top, f, time)
39
- val width = ValueInterpolation.number(geometry.from.width(), toRect.width(), f, time).roundToInt()
40
- val height = ValueInterpolation.number(geometry.from.height(), toRect.height(), f, time).roundToInt()
41
- layer.place(to, toRect.left.toInt(), toRect.top.toInt(), width, height)
42
- to.translationX = left - toRect.left
43
- to.translationY = top - toRect.top
44
- scale.setValue(if (time >= 1f) 1f else f)
45
- to.rotation = ValueInterpolation.number(fromRotation, toRotation, f, time)
46
- to.invalidate()
47
- }
48
- doOnStart {
49
- savedFade = to.hierarchy.fadeDuration
50
- to.hierarchy.fadeDuration = 0
51
- to.hierarchy.setActualImageScaleType(scale)
52
- frame(0f)
53
- }
54
- addUpdateListener { frame(it.animatedFraction) }
55
- doOnEnd {
56
- to.hierarchy.setActualImageScaleType(toType)
57
- to.hierarchy.fadeDuration = savedFade
58
- to.translationX = 0f
59
- to.translationY = 0f
60
- to.rotation = toRotation
61
- layer.place(to, toRect.left.toInt(), toRect.top.toInt(), toRect.width().toInt(),
62
- toRect.height().toInt())
63
- }
64
- }
65
- }
66
- }