@apexnative/navigation 1.0.0-alpha.0 → 1.0.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (574) hide show
  1. package/ApexNavigation.podspec +2 -1
  2. package/CHANGELOG.md +128 -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/SecondaryScreenPresenter.kt +13 -5
  67. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/AppliedTabCalls.kt +49 -0
  68. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +5 -3
  69. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +108 -34
  70. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +25 -24
  71. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +22 -0
  72. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +3 -3
  73. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +0 -5
  74. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +28 -7
  75. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +12 -9
  76. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +2 -2
  77. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +27 -7
  78. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +1 -1
  79. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +103 -56
  80. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +29 -11
  81. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +2 -6
  82. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +22 -24
  83. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +109 -21
  84. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +21 -6
  85. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +476 -73
  86. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +57 -25
  87. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetBack.kt +42 -0
  88. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetStops.kt +83 -0
  89. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackCheck.kt +50 -0
  90. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +49 -14
  91. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +71 -12
  92. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +37 -11
  93. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +10 -8
  94. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +11 -4
  95. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +3 -3
  96. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +6 -6
  97. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +42 -9
  98. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +19 -8
  99. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +16 -7
  100. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +43 -4
  101. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +23 -0
  102. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +77 -17
  103. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/BackPreview.kt +315 -0
  104. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +3 -3
  105. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +30 -20
  106. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +216 -18
  107. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +26 -1
  108. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +149 -41
  109. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +26 -8
  110. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +115 -6
  111. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabMotion.kt +142 -0
  112. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +222 -48
  113. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +3 -5
  114. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +30 -34
  115. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +5 -51
  116. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarRowTransition.kt +3 -2
  117. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +11 -5
  118. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +13 -56
  119. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +219 -54
  120. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +9 -2
  121. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +6 -9
  122. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +75 -21
  123. package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationLayer.kt +73 -0
  124. package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +29 -11
  125. package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +14 -0
  126. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +9 -7
  127. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +61 -2
  128. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +0 -5
  129. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +72 -10
  130. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStep.kt +31 -0
  131. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +143 -135
  132. package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +13 -5
  133. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +37 -112
  134. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +9 -6
  135. package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionViews.kt +100 -0
  136. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +112 -4
  137. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +346 -36
  138. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMorph.kt +199 -0
  139. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +56 -41
  140. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextMorph.kt +176 -0
  141. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewMorph.kt +108 -0
  142. package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +12 -3
  143. package/android/src/main/java/dev/apexnative/navigation/views/stack/ScreenEdge.kt +45 -0
  144. package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +140 -1
  145. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +14 -10
  146. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCopy.kt +85 -0
  147. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +13 -0
  148. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +5 -17
  149. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +73 -34
  150. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +6 -6
  151. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonView.kt +113 -0
  152. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarMenu.kt +219 -0
  153. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +125 -178
  154. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +34 -64
  155. package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonRow.kt +216 -0
  156. package/android/src/main/jni/ANNContentHeights.cpp +82 -0
  157. package/android/src/main/res/drawable/apex_navigation_ic_arrow_right.xml +14 -0
  158. package/android/src/main/res/layout/apex_navigation_menu_header.xml +19 -0
  159. package/android/src/main/res/layout/apex_navigation_menu_item.xml +68 -0
  160. package/android/src/main/res/values/styles.xml +1 -1
  161. package/android/src/main/res/values-night/styles.xml +1 -1
  162. package/cli/app.js +1 -1
  163. package/cli/doctor/checks/app.js +77 -14
  164. package/cli/doctor/checks/splash.js +4 -22
  165. package/cli/migrate/native.js +18 -0
  166. package/cli/project.js +10 -2
  167. package/cli/setup/index.js +18 -0
  168. package/cli/setup/source.js +2 -1
  169. package/cli/setup/steps/appDelegate.js +66 -11
  170. package/cli/setup/steps/mainApplication.js +134 -19
  171. package/cli/setup/steps/metro.js +46 -0
  172. package/cli/setup/steps/sceneDelegate.js +108 -0
  173. package/cli/splash/index.js +3 -1
  174. package/cli/upgrade/changelog.js +2 -2
  175. package/docs-md/architecture/native-screens.md +4 -0
  176. package/docs-md/architecture/theme-and-context.md +131 -12
  177. package/docs-md/architecture/transitions.md +58 -12
  178. package/docs-md/containers/modals.md +8 -4
  179. package/docs-md/containers/overlays.md +3 -1
  180. package/docs-md/containers/side-menu.md +19 -2
  181. package/docs-md/containers/tabs.md +5 -1
  182. package/docs-md/flows/bottom-sheets.md +4 -2
  183. package/docs-md/flows/forms-in-a-modal.md +1 -1
  184. package/docs-md/fundamentals/screens-and-props.md +9 -1
  185. package/docs-md/fundamentals/starting-the-app.md +1 -1
  186. package/docs-md/guides/cli.md +4 -3
  187. package/docs-md/guides/deep-links.md +15 -33
  188. package/docs-md/help/glossary.md +4 -4
  189. package/docs-md/help/troubleshooting.md +44 -6
  190. package/docs-md/index.json +57 -1
  191. package/docs-md/migration/from-expo-router.md +1 -1
  192. package/docs-md/migration/from-react-native-navigation.md +9 -3
  193. package/docs-md/migration/from-react-navigation.md +2 -2
  194. package/docs-md/screen-ui/back-and-gestures.md +46 -2
  195. package/docs-md/screen-ui/bar-buttons.md +5 -5
  196. package/docs-md/screen-ui/search.md +1 -1
  197. package/docs-md/screen-ui/system-ui.md +17 -12
  198. package/docs-md/screen-ui/toolbar-and-fab.md +4 -2
  199. package/docs-md/screen-ui/top-bar.md +8 -4
  200. package/docs-md/start/installation.md +21 -3
  201. package/ios/Animations/ANNFrameDriver.h +55 -15
  202. package/ios/Animations/ANNFrameDriver.mm +216 -60
  203. package/ios/Animations/ANNTransitionAnimator.h +26 -5
  204. package/ios/Animations/ANNTransitionAnimator.mm +61 -13
  205. package/ios/Animations/ANNTransitionPlan.h +2 -2
  206. package/ios/Animations/ANNTransitionPlan.mm +10 -0
  207. package/ios/Animations/ANNTransitionWait.mm +6 -7
  208. package/ios/Animations/Elements/ANNElementFinder.h +57 -0
  209. package/ios/Animations/Elements/ANNElementFinder.mm +174 -2
  210. package/ios/Animations/Elements/ANNElementTransition.h +10 -8
  211. package/ios/Animations/Elements/ANNElementTransition.mm +19 -21
  212. package/ios/Animations/Elements/ANNSharedElementFlight.h +16 -11
  213. package/ios/Animations/Elements/ANNSharedElementFlight.mm +308 -69
  214. package/ios/Animations/Interpolators/ANNInterpolate.h +2 -30
  215. package/ios/Animations/Interpolators/ANNTransformParts.h +48 -0
  216. package/ios/Animations/Interpolators/ANNTransformParts.mm +507 -0
  217. package/ios/Animations/Interpolators/ANNViewTracks.h +9 -6
  218. package/ios/Animations/Interpolators/ANNViewTracks.mm +100 -30
  219. package/ios/CLAUDE.md +60 -24
  220. package/ios/CORE.md +44 -34
  221. package/ios/Contract/ANNCommandAnswer.h +13 -5
  222. package/ios/Contract/ANNCommandAnswer.mm +40 -32
  223. package/ios/Contract/ANNCommandContract.h +15 -0
  224. package/ios/Contract/ANNCommandContract.mm +78 -0
  225. package/ios/Contract/ANNCommandRunner.h +10 -9
  226. package/ios/Contract/ANNCommandRunner.mm +22 -28
  227. package/ios/Contract/ANNErrorTexts.h +6 -2
  228. package/ios/Contract/ANNErrorTexts.mm +18 -10
  229. package/ios/Contract/ANNLayoutNode.h +3 -3
  230. package/ios/Contract/ANNLayoutReader.h +3 -3
  231. package/ios/Core/ANNAppDelegate.mm +0 -2
  232. package/ios/Core/ANNAppearanceDispatcher.h +5 -4
  233. package/ios/Core/ANNAppearanceDispatcher.mm +12 -1
  234. package/ios/Core/ANNDeepLinkQueue.h +22 -2
  235. package/ios/Core/ANNDeepLinkQueue.mm +121 -14
  236. package/ios/Core/ANNErrorHandler.h +9 -4
  237. package/ios/Core/ANNErrorHandler.mm +20 -2
  238. package/ios/Core/ANNEventContract.h +246 -0
  239. package/ios/Core/ANNEventContract.mm +225 -0
  240. package/ios/Core/ANNEventEmitter.h +6 -2
  241. package/ios/Core/ANNEventEmitter.mm +117 -80
  242. package/ios/Core/ANNHinge.h +6 -0
  243. package/ios/Core/ANNHinge.mm +15 -4
  244. package/ios/Core/ANNJavaScriptCalls.h +33 -0
  245. package/ios/Core/ANNJavaScriptCalls.mm +52 -0
  246. package/ios/Core/ANNLayoutProtocol.h +5 -5
  247. package/ios/Core/ANNNavigationState.h +7 -5
  248. package/ios/Core/ANNNavigationState.mm +8 -7
  249. package/ios/Core/ANNNodeHelper.h +32 -12
  250. package/ios/Core/ANNNodeHelper.mm +100 -3
  251. package/ios/Core/ANNParking.h +5 -4
  252. package/ios/Core/ANNReloadCoordinator.mm +5 -12
  253. package/ios/Core/ANNRenderWait.h +20 -6
  254. package/ios/Core/ANNRenderWait.mm +143 -56
  255. package/ios/Core/ANNSceneDelegate.mm +25 -15
  256. package/ios/Core/ANNSystemUI.h +3 -2
  257. package/ios/Core/ANNSystemUI.mm +7 -0
  258. package/ios/Core/ANNUtils.h +7 -0
  259. package/ios/Core/ANNUtils.mm +10 -0
  260. package/ios/Core/ApexNavigation+Internal.h +1 -1
  261. package/ios/Core/ApexNavigation.mm +7 -6
  262. package/ios/Core/UIViewController+LayoutProtocol.h +9 -2
  263. package/ios/Core/UIViewController+LayoutProtocol.mm +8 -0
  264. package/ios/Layouts/Arrangement/ANNArrangementState.h +2 -17
  265. package/ios/Layouts/Arrangement/ANNArrangementState.mm +0 -38
  266. package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +10 -8
  267. package/ios/Layouts/Modal/ANNModalCoordinator.h +1 -1
  268. package/ios/Layouts/Modal/ANNModalCoordinator.mm +57 -16
  269. package/ios/Layouts/Modal/ANNModalPresentation.h +8 -5
  270. package/ios/Layouts/Modal/ANNModalPresentation.mm +12 -12
  271. package/ios/Layouts/Modal/ANNSheetPresenter.mm +83 -1
  272. package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +2 -8
  273. package/ios/Layouts/Root/ANNRootCoordinator.mm +58 -19
  274. package/ios/Layouts/Root/ANNSplashViewController.h +5 -3
  275. package/ios/Layouts/Root/ANNSplashViewController.mm +147 -0
  276. package/ios/Layouts/Screen/ANNComponentPresenter.h +11 -3
  277. package/ios/Layouts/Screen/ANNComponentPresenter.mm +34 -6
  278. package/ios/Layouts/Screen/ANNComponentViewController.h +15 -13
  279. package/ios/Layouts/Screen/ANNComponentViewController.mm +130 -75
  280. package/ios/Layouts/Screen/ANNNativeScreenContext.mm +7 -5
  281. package/ios/Layouts/Screen/ANNPreviewInteraction.h +7 -4
  282. package/ios/Layouts/Screen/ANNPreviewInteraction.mm +72 -10
  283. package/ios/Layouts/Screen/ANNScreenEnvironment.h +63 -0
  284. package/ios/Layouts/Screen/ANNScreenEnvironment.mm +181 -0
  285. package/ios/Layouts/Screen/ANNScreenPlace.h +53 -0
  286. package/ios/Layouts/Screen/ANNScreenPlace.mm +205 -0
  287. package/ios/Layouts/Screen/ANNScreenRegions.h +3 -18
  288. package/ios/Layouts/Screen/ANNScreenRegions.mm +9 -44
  289. package/ios/Layouts/Screen/ANNScreenSafeArea.h +4 -9
  290. package/ios/Layouts/Screen/ANNScreenSafeArea.mm +14 -16
  291. package/ios/Layouts/Screen/ANNScreenSettling.h +32 -0
  292. package/ios/Layouts/Screen/ANNScreenSettling.mm +137 -0
  293. package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +8 -0
  294. package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +83 -14
  295. package/ios/Layouts/SplitView/ANNSplitViewCommands.h +3 -2
  296. package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +105 -39
  297. package/ios/Layouts/SplitView/ANNSplitViewController.mm +7 -8
  298. package/ios/Layouts/Stack/ANNPreviewPush.h +7 -6
  299. package/ios/Layouts/Stack/ANNPreviewPush.mm +142 -27
  300. package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +11 -2
  301. package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +14 -7
  302. package/ios/Layouts/Stack/ANNStackCommands.mm +1 -0
  303. package/ios/Layouts/Stack/ANNStackController.h +8 -0
  304. package/ios/Layouts/Stack/ANNStackController.mm +184 -16
  305. package/ios/Layouts/Stack/ANNStackQueue.h +5 -2
  306. package/ios/Layouts/Stack/ANNStackQueue.mm +56 -43
  307. package/ios/Layouts/Stack/ANNSwipePopInteraction.h +26 -0
  308. package/ios/Layouts/Stack/ANNSwipePopInteraction.mm +185 -0
  309. package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +28 -4
  310. package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +4 -2
  311. package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +2 -3
  312. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +4 -0
  313. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +11 -0
  314. package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.h +12 -1
  315. package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +23 -0
  316. package/ios/Layouts/Tabs/ANNBottomTabsController.h +3 -0
  317. package/ios/Layouts/Tabs/ANNBottomTabsController.mm +237 -57
  318. package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +8 -3
  319. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +6 -2
  320. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +232 -43
  321. package/ios/Layouts/Tabs/ANNTabsDesign.h +6 -5
  322. package/ios/Layouts/Tabs/ANNTabsDesign.mm +9 -1
  323. package/ios/Layouts/Tabs/UITabBar+utils.h +5 -5
  324. package/ios/Layouts/Tabs/UITabBar+utils.mm +32 -13
  325. package/ios/Options/ANNAnimationOptions.h +2 -1
  326. package/ios/Options/ANNAnimationOptions.mm +1 -1
  327. package/ios/Options/ANNBottomTabsOptions.h +2 -0
  328. package/ios/Options/ANNBottomTabsOptions.mm +1 -0
  329. package/ios/Options/ANNOptions.h +25 -0
  330. package/ios/Options/ANNOptions.mm +157 -1
  331. package/ios/Options/ANNOptionsCache.h +7 -6
  332. package/ios/Options/ANNOptionsReader.mm +108 -0
  333. package/ios/Options/ANNSearchBarOptions.h +4 -3
  334. package/ios/Options/ANNSheetOptions.h +4 -1
  335. package/ios/Options/ANNSideMenuOptions.h +2 -0
  336. package/ios/Options/ANNSideMenuOptions.mm +2 -0
  337. package/ios/Options/ANNStackPopAnimationOptions.h +13 -0
  338. package/ios/Options/ANNStackPopAnimationOptions.mm +11 -0
  339. package/ios/Options/ANNUserChoice.h +57 -0
  340. package/ios/Options/ANNUserChoice.mm +44 -0
  341. package/ios/Options/Params/ANNImageSource.h +61 -0
  342. package/ios/Options/Params/ANNImageSource.mm +101 -0
  343. package/ios/Options/Params/ANNOptionImages.h +37 -0
  344. package/ios/Options/Params/ANNOptionImages.mm +284 -0
  345. package/ios/Options/Params/ANNParam.h +15 -0
  346. package/ios/Options/Params/ANNParam.mm +61 -0
  347. package/ios/Options/Params/Color.h +3 -0
  348. package/ios/Options/Params/Color.mm +21 -0
  349. package/ios/Options/Params/ColorParser.h +4 -3
  350. package/ios/Options/Params/ColorParser.mm +22 -4
  351. package/ios/Options/Params/Image.h +15 -2
  352. package/ios/Options/Params/Image.mm +35 -2
  353. package/ios/Options/Params/ImageParser.h +5 -5
  354. package/ios/Options/Params/ImageParser.mm +28 -46
  355. package/ios/Public/ApexNavigation/ANNSceneDelegate.h +3 -0
  356. package/ios/Public/ApexNavigation/ApexNavigation.h +1 -1
  357. package/ios/RECIPES.md +13 -6
  358. package/ios/React/ANNReactView.mm +6 -25
  359. package/ios/React/ANNSafeAreaViewComponentView.mm +28 -17
  360. package/ios/React/ANNSurfaceHostingView.h +14 -0
  361. package/ios/React/ANNSurfaceHostingView.mm +144 -1
  362. package/ios/React/Slots/ANNSlotComponentView.mm +24 -17
  363. package/ios/React/Slots/ANNSlotContainers.h +14 -6
  364. package/ios/React/Slots/ANNSlotContainers.mm +75 -2
  365. package/ios/React/Slots/ANNSlotHost.mm +1 -3
  366. package/ios/React/Slots/ANNSlotScreenView.mm +8 -2
  367. package/ios/TopBar/ANNBackButtonPresenter.mm +6 -5
  368. package/ios/TopBar/ANNBarAppearance.h +2 -1
  369. package/ios/TopBar/ANNBarAppearance.mm +111 -30
  370. package/ios/TopBar/ANNBarBackgroundComponent.mm +16 -0
  371. package/ios/TopBar/ANNBarButtonComponentView.h +4 -4
  372. package/ios/TopBar/ANNBarButtonComponentView.mm +1 -1
  373. package/ios/TopBar/ANNBarButtons.h +14 -8
  374. package/ios/TopBar/ANNBarButtons.mm +397 -80
  375. package/ios/TopBar/ANNIconButtonImage.h +1 -0
  376. package/ios/TopBar/ANNIconButtonImage.mm +34 -1
  377. package/ios/TopBar/ANNLargeTitlePresenter.h +13 -0
  378. package/ios/TopBar/ANNLargeTitlePresenter.mm +50 -7
  379. package/ios/TopBar/ANNMainList.h +3 -0
  380. package/ios/TopBar/ANNMainList.mm +4 -0
  381. package/ios/TopBar/ANNScrollEdgeEffects.h +22 -6
  382. package/ios/TopBar/ANNScrollEdgeEffects.mm +123 -16
  383. package/ios/TopBar/ANNSearchPresenter.mm +172 -21
  384. package/ios/TopBar/ANNSearchResultsViewController.mm +29 -6
  385. package/ios/TopBar/ANNTopBarPresenter.h +8 -2
  386. package/ios/TopBar/ANNTopBarPresenter.mm +155 -33
  387. package/ios/TurboModules/ANNTurboEventEmitter.mm +4 -35
  388. package/ios/TurboModules/ANNTurboModule.mm +104 -33
  389. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.cpp +20 -0
  390. package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +5 -14
  391. package/lib/module/ARCHITECTURE.md +40 -27
  392. package/lib/module/adapters/NativeANNTurboModule.js.map +1 -1
  393. package/lib/module/api/app/AppRegistry.js +14 -2
  394. package/lib/module/api/app/AppRegistry.js.map +1 -1
  395. package/lib/module/api/app/createNavigation.js +190 -66
  396. package/lib/module/api/app/createNavigation.js.map +1 -1
  397. package/lib/module/api/commands/commands.js +54 -6
  398. package/lib/module/api/commands/commands.js.map +1 -1
  399. package/lib/module/api/events/navigationEvents.js +6 -2
  400. package/lib/module/api/events/navigationEvents.js.map +1 -1
  401. package/lib/module/api/hooks/useNavigation.js +8 -3
  402. package/lib/module/api/hooks/useNavigation.js.map +1 -1
  403. package/lib/module/api/hooks/useSafeAreaInsets.js +4 -3
  404. package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -1
  405. package/lib/module/api/linking/dispatchedLinks.js +23 -0
  406. package/lib/module/api/linking/dispatchedLinks.js.map +1 -0
  407. package/lib/module/api/linking/linking.js +11 -0
  408. package/lib/module/api/linking/linking.js.map +1 -1
  409. package/lib/module/api/navigation.js.map +1 -1
  410. package/lib/module/api/options/OptionsChain.js +2 -2
  411. package/lib/module/api/screens/defineScreen.js +45 -3
  412. package/lib/module/api/screens/defineScreen.js.map +1 -1
  413. package/lib/module/api/screens/nativeScreens.js +31 -6
  414. package/lib/module/api/screens/nativeScreens.js.map +1 -1
  415. package/lib/module/api/screens/registerScreens.js +193 -35
  416. package/lib/module/api/screens/registerScreens.js.map +1 -1
  417. package/lib/module/api/theme/theme.js +5 -0
  418. package/lib/module/api/theme/theme.js.map +1 -1
  419. package/lib/module/engine/commands.js +51 -9
  420. package/lib/module/engine/commands.js.map +1 -1
  421. package/lib/module/engine/layout.js +20 -11
  422. package/lib/module/engine/layout.js.map +1 -1
  423. package/lib/module/engine/nativeScreens.js +9 -0
  424. package/lib/module/engine/nativeScreens.js.map +1 -1
  425. package/lib/module/engine/options.js +49 -15
  426. package/lib/module/engine/options.js.map +1 -1
  427. package/lib/module/engine/optionsChange.js +102 -0
  428. package/lib/module/engine/optionsChange.js.map +1 -0
  429. package/lib/module/engine/places.js +52 -7
  430. package/lib/module/engine/places.js.map +1 -1
  431. package/lib/module/engine/props.js +30 -1
  432. package/lib/module/engine/props.js.map +1 -1
  433. package/lib/module/engine/refresh.js +85 -0
  434. package/lib/module/engine/refresh.js.map +1 -0
  435. package/lib/module/engine/rememberedOptions.js +61 -1
  436. package/lib/module/engine/rememberedOptions.js.map +1 -1
  437. package/lib/module/engine/screens.js +77 -16
  438. package/lib/module/engine/screens.js.map +1 -1
  439. package/lib/module/interfaces/contract/commands.json +101 -0
  440. package/lib/module/interfaces/contract/errors.json +275 -0
  441. package/lib/typescript/adapters/NativeANNTurboModule.d.ts +12 -2
  442. package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -1
  443. package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -1
  444. package/lib/typescript/api/app/createNavigation.d.ts +8 -3
  445. package/lib/typescript/api/app/createNavigation.d.ts.map +1 -1
  446. package/lib/typescript/api/commands/commands.d.ts.map +1 -1
  447. package/lib/typescript/api/commands/presentation.d.ts +4 -3
  448. package/lib/typescript/api/commands/presentation.d.ts.map +1 -1
  449. package/lib/typescript/api/events/navigationEvents.d.ts +3 -3
  450. package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -1
  451. package/lib/typescript/api/hooks/useNavigation.d.ts +1 -1
  452. package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -1
  453. package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts +4 -3
  454. package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -1
  455. package/lib/typescript/api/index.d.ts +1 -1
  456. package/lib/typescript/api/index.d.ts.map +1 -1
  457. package/lib/typescript/api/linking/dispatchedLinks.d.ts +7 -0
  458. package/lib/typescript/api/linking/dispatchedLinks.d.ts.map +1 -0
  459. package/lib/typescript/api/linking/linking.d.ts +8 -0
  460. package/lib/typescript/api/linking/linking.d.ts.map +1 -1
  461. package/lib/typescript/api/navigation.d.ts +4 -1
  462. package/lib/typescript/api/navigation.d.ts.map +1 -1
  463. package/lib/typescript/api/options/OptionsChain.d.ts +2 -2
  464. package/lib/typescript/api/screens/defineScreen.d.ts +23 -4
  465. package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -1
  466. package/lib/typescript/api/screens/nativeScreens.d.ts +8 -1
  467. package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -1
  468. package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -1
  469. package/lib/typescript/api/theme/theme.d.ts +2 -0
  470. package/lib/typescript/api/theme/theme.d.ts.map +1 -1
  471. package/lib/typescript/engine/commands.d.ts +5 -0
  472. package/lib/typescript/engine/commands.d.ts.map +1 -1
  473. package/lib/typescript/engine/layout.d.ts.map +1 -1
  474. package/lib/typescript/engine/nativeScreens.d.ts +5 -0
  475. package/lib/typescript/engine/nativeScreens.d.ts.map +1 -1
  476. package/lib/typescript/engine/options.d.ts +5 -2
  477. package/lib/typescript/engine/options.d.ts.map +1 -1
  478. package/lib/typescript/engine/optionsChange.d.ts +28 -0
  479. package/lib/typescript/engine/optionsChange.d.ts.map +1 -0
  480. package/lib/typescript/engine/places.d.ts +7 -2
  481. package/lib/typescript/engine/places.d.ts.map +1 -1
  482. package/lib/typescript/engine/props.d.ts +8 -1
  483. package/lib/typescript/engine/props.d.ts.map +1 -1
  484. package/lib/typescript/engine/refresh.d.ts +35 -0
  485. package/lib/typescript/engine/refresh.d.ts.map +1 -0
  486. package/lib/typescript/engine/rememberedOptions.d.ts +13 -0
  487. package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -1
  488. package/lib/typescript/engine/screens.d.ts +27 -6
  489. package/lib/typescript/engine/screens.d.ts.map +1 -1
  490. package/lib/typescript/interfaces/ComponentEvents.d.ts +4 -4
  491. package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -1
  492. package/lib/typescript/interfaces/Events.d.ts +28 -10
  493. package/lib/typescript/interfaces/Events.d.ts.map +1 -1
  494. package/lib/typescript/interfaces/Options.d.ts +1 -1
  495. package/lib/typescript/interfaces/Options.d.ts.map +1 -1
  496. package/lib/typescript/interfaces/options/animations.d.ts +80 -22
  497. package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
  498. package/lib/typescript/interfaces/options/bottomTabs.d.ts +21 -7
  499. package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -1
  500. package/lib/typescript/interfaces/options/buttons.d.ts +23 -15
  501. package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -1
  502. package/lib/typescript/interfaces/options/modals.d.ts +34 -26
  503. package/lib/typescript/interfaces/options/modals.d.ts.map +1 -1
  504. package/lib/typescript/interfaces/options/sideMenu.d.ts +23 -6
  505. package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -1
  506. package/lib/typescript/interfaces/options/stack.d.ts +17 -3
  507. package/lib/typescript/interfaces/options/stack.d.ts.map +1 -1
  508. package/lib/typescript/interfaces/options/system.d.ts +18 -11
  509. package/lib/typescript/interfaces/options/system.d.ts.map +1 -1
  510. package/lib/typescript/interfaces/options/toolbar.d.ts +2 -2
  511. package/lib/typescript/interfaces/options/topBar.d.ts +68 -38
  512. package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -1
  513. package/metro/acceptPlugin.js +57 -0
  514. package/metro/babelTransformer.js +45 -0
  515. package/metro/index.js +36 -0
  516. package/package.json +4 -25
  517. package/src/ARCHITECTURE.md +40 -27
  518. package/src/adapters/NativeANNTurboModule.ts +12 -2
  519. package/src/api/app/AppRegistry.ts +16 -2
  520. package/src/api/app/createNavigation.ts +203 -69
  521. package/src/api/commands/commands.ts +48 -7
  522. package/src/api/commands/presentation.ts +4 -3
  523. package/src/api/events/navigationEvents.ts +10 -4
  524. package/src/api/hooks/useNavigation.ts +9 -4
  525. package/src/api/hooks/useSafeAreaInsets.ts +4 -3
  526. package/src/api/index.ts +1 -0
  527. package/src/api/linking/dispatchedLinks.ts +18 -0
  528. package/src/api/linking/linking.ts +22 -1
  529. package/src/api/navigation.ts +4 -1
  530. package/src/api/options/OptionsChain.ts +2 -2
  531. package/src/api/screens/defineScreen.ts +49 -5
  532. package/src/api/screens/nativeScreens.ts +40 -4
  533. package/src/api/screens/registerScreens.tsx +185 -42
  534. package/src/api/theme/theme.ts +5 -0
  535. package/src/engine/commands.ts +70 -13
  536. package/src/engine/layout.ts +27 -11
  537. package/src/engine/nativeScreens.ts +10 -1
  538. package/src/engine/options.ts +45 -19
  539. package/src/engine/optionsChange.ts +107 -0
  540. package/src/engine/places.ts +65 -7
  541. package/src/engine/props.ts +30 -1
  542. package/src/engine/refresh.ts +97 -0
  543. package/src/engine/rememberedOptions.ts +74 -1
  544. package/src/engine/screens.tsx +76 -21
  545. package/src/interfaces/ComponentEvents.ts +4 -4
  546. package/src/interfaces/Events.ts +29 -10
  547. package/src/interfaces/Options.ts +1 -0
  548. package/src/interfaces/contract/commands.json +101 -0
  549. package/src/interfaces/contract/errors.json +275 -0
  550. package/src/interfaces/options/animations.ts +81 -22
  551. package/src/interfaces/options/bottomTabs.ts +21 -7
  552. package/src/interfaces/options/buttons.ts +23 -15
  553. package/src/interfaces/options/modals.ts +34 -26
  554. package/src/interfaces/options/sideMenu.ts +24 -6
  555. package/src/interfaces/options/stack.ts +17 -3
  556. package/src/interfaces/options/system.ts +18 -11
  557. package/src/interfaces/options/toolbar.ts +2 -2
  558. package/src/interfaces/options/topBar.ts +68 -38
  559. package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +0 -41
  560. package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +0 -69
  561. package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +0 -62
  562. package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +0 -62
  563. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +0 -223
  564. package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +0 -31
  565. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +0 -138
  566. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +0 -88
  567. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +0 -33
  568. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +0 -66
  569. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +0 -179
  570. package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +0 -139
  571. package/ios/Layouts/Screen/ANNScreenInsets.h +0 -30
  572. package/ios/Layouts/Screen/ANNScreenInsets.mm +0 -68
  573. package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +0 -27
  574. package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +0 -55
@@ -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
- }
@@ -1,179 +0,0 @@
1
- package dev.apexnative.navigation.views.element.animators
2
-
3
- import android.animation.Animator
4
- import android.graphics.Canvas
5
- import android.graphics.ColorFilter
6
- import android.graphics.Picture
7
- import android.graphics.PixelFormat
8
- import android.graphics.PointF
9
- import android.graphics.drawable.Drawable
10
- import android.text.Layout
11
- import android.view.View
12
- import android.view.ViewGroup
13
- import android.widget.TextView
14
- import androidx.core.animation.doOnEnd
15
- import androidx.core.animation.doOnStart
16
- import com.facebook.react.views.text.ReactTextView
17
- import dev.apexnative.navigation.options.SharedElementTransitionOptions
18
- import dev.apexnative.navigation.utils.TextViewUtils
19
- import dev.apexnative.navigation.utils.ViewUtils
20
- import kotlin.math.roundToInt
21
-
22
- // The text moves as two pictures of itself, of the text that goes away and of the text that comes, the same text or
23
- // another. Both keep their proportions, scaled by the font size from a point of the first line, and one turns into the
24
- // other in a quarter of the move: at its start when the text grows, at its end when it shrinks, so the larger picture
25
- // shows most of the way (as on iOS). The pictures are drawing commands, not pixels: they stay sharp at any scale and
26
- // keep the colors, emoji and background of the text. They are drawn in the overlay of the transition layer while `to`
27
- // is hidden.
28
- class TextChangeAnimator(from: View, to: View) : PropertyAnimatorCreator<ReactTextView>(from, to, ReactTextView::class.java) {
29
- private val pictures by lazy { pictures() }
30
-
31
- override fun shouldAnimateProperty(fromChild: ReactTextView, toChild: ReactTextView): Boolean {
32
- val fromPlace = ViewUtils.getLocationOnScreen(from)
33
- val toPlace = ViewUtils.getLocationOnScreen(to)
34
- return (fromChild.text.toString() != toChild.text.toString() ||
35
- TextViewUtils.getTextSize(fromChild) != TextViewUtils.getTextSize(toChild) || fromPlace != toPlace
36
- ) && pictures != null
37
- }
38
-
39
- override fun create(options: SharedElementTransitionOptions): Animator {
40
- val (start, end) = checkNotNull(pictures)
41
- val layer = to.parent as ViewGroup
42
- val drawable = TextMorphDrawable(start, end)
43
- // Everything changes between the start and the end of the animation: a cancelled one ends too.
44
- return MoveAnimator().apply {
45
- doOnStart {
46
- drawable.setBounds(0, 0, layer.width, layer.height)
47
- layer.overlay.add(drawable)
48
- to.alpha = 0f
49
- }
50
- addUpdateListener {
51
- drawable.update(it.animatedFraction, curve.getInterpolation(it.animatedFraction))
52
- layer.invalidate()
53
- }
54
- doOnEnd {
55
- layer.overlay.remove(drawable)
56
- layer.invalidate()
57
- to.alpha = end.alpha
58
- }
59
- }
60
- }
61
-
62
- // `to` is in the transition layer already, at its margins (the coordinates of the other animators); `from` is where
63
- // it is on the screen. Texts that line up the same way go from that point of their first lines (the same text lies
64
- // over itself); others from the start of the line, as on iOS: a centered text no longer sticks out of a text at the
65
- // start.
66
- private fun pictures(): Pair<TextPicture, TextPicture>? {
67
- if (to.parent !is ViewGroup) return null
68
- val toPlace = to.layoutParams as? ViewGroup.MarginLayoutParams ?: return null
69
- val fromLayout = (from as TextView).layout ?: return null
70
- val toLayout = (to as TextView).layout ?: return null
71
- val edge = lineEdge(fromLayout).takeIf { it == lineEdge(toLayout) } ?: LineEdge.START
72
- val fromPlace = ViewUtils.getLocationOnScreen(from)
73
- .apply { ViewUtils.getLocationOnScreen(to.parent as View).let { offset(-it.x, -it.y) } }
74
- val start = TextPicture.of(from, fromPlace.x, fromPlace.y, edge) ?: return null
75
- val end = TextPicture.of(to, toPlace.leftMargin, toPlace.topMargin, edge) ?: return null
76
- return start to end
77
- }
78
- }
79
-
80
- // A text's picture, the point of its first line it is scaled from (in the view) and where that point is in the
81
- // transition layer, its font size and opacity.
82
- private class TextPicture(
83
- val picture: Picture,
84
- val anchor: PointF,
85
- val position: PointF,
86
- val fontSize: Float,
87
- val alpha: Float
88
- ) {
89
- companion object {
90
- fun of(view: TextView, left: Int, top: Int, edge: LineEdge): TextPicture? {
91
- val layout = view.layout ?: return null
92
- val fontSize = TextViewUtils.getTextSize(view).takeIf { it > 0 } ?: view.textSize
93
- if (view.width <= 0 || view.height <= 0 || layout.lineCount == 0 || fontSize <= 0) return null
94
- // Without a picture (recording failed) the text goes to its place at once, as a different text does.
95
- val picture = recordPicture(view) ?: return null
96
- val anchor = PointF(
97
- view.totalPaddingLeft + edgeX(layout, edge),
98
- view.totalPaddingTop + layout.getLineBaseline(0).toFloat()
99
- )
100
- return TextPicture(picture, anchor, PointF(left + anchor.x, top + anchor.y), fontSize, view.alpha)
101
- }
102
-
103
- // That point of the first line, in the direction of the text.
104
- private fun edgeX(layout: Layout, edge: LineEdge): Float {
105
- val left = layout.getLineLeft(0)
106
- val right = layout.getLineRight(0)
107
- val rightToLeft = layout.getParagraphDirection(0) == Layout.DIR_RIGHT_TO_LEFT
108
- return when (edge) {
109
- LineEdge.CENTER -> (left + right) / 2
110
- LineEdge.START -> if (rightToLeft) right else left
111
- LineEdge.END -> if (rightToLeft) left else right
112
- }
113
- }
114
- }
115
- }
116
-
117
- // Where the lines of a text line up: their start, center or end, in the direction of the text.
118
- private enum class LineEdge { START, CENTER, END }
119
-
120
- // ALIGN_LEFT and ALIGN_RIGHT are hidden constants, for Gravity.LEFT and RIGHT.
121
- private fun lineEdge(layout: Layout): LineEdge {
122
- val rightToLeft = layout.getParagraphDirection(0) == Layout.DIR_RIGHT_TO_LEFT
123
- return when (layout.getParagraphAlignment(0).name) {
124
- "ALIGN_CENTER" -> LineEdge.CENTER
125
- "ALIGN_OPPOSITE" -> LineEdge.END
126
- "ALIGN_LEFT" -> if (rightToLeft) LineEdge.END else LineEdge.START
127
- "ALIGN_RIGHT" -> if (rightToLeft) LineEdge.START else LineEdge.END
128
- else -> LineEdge.START
129
- }
130
- }
131
-
132
- // Both pictures where the move has brought the text: the font size and the point of the first line go from the start
133
- // to the end along the transition's curve, the pictures change over by the clock.
134
- private class TextMorphDrawable(private val start: TextPicture, private val end: TextPicture) : Drawable() {
135
- private val grows = end.fontSize >= start.fontSize
136
- private var progress = 0f
137
- private var changeOver = 0f
138
-
139
- fun update(time: Float, progress: Float) {
140
- this.progress = progress
141
- val changeOverStart = if (grows) 0f else 1f - CHANGE_OVER
142
- changeOver = ((time - changeOverStart) / CHANGE_OVER).coerceIn(0f, 1f)
143
- }
144
-
145
- override fun draw(canvas: Canvas) {
146
- val x = start.position.x + (end.position.x - start.position.x) * progress
147
- val y = start.position.y + (end.position.y - start.position.y) * progress
148
- val fontSize = start.fontSize + (end.fontSize - start.fontSize) * progress
149
- draw(canvas, start, x, y, fontSize, 1f - changeOver)
150
- draw(canvas, end, x, y, fontSize, changeOver)
151
- }
152
-
153
- private fun draw(canvas: Canvas, text: TextPicture, x: Float, y: Float, fontSize: Float, shown: Float) {
154
- val alpha = (shown * text.alpha * 255).roundToInt().coerceIn(0, 255)
155
- if (alpha == 0) return
156
- val scale = fontSize / text.fontSize
157
- val count = canvas.save()
158
- canvas.translate(x, y)
159
- canvas.scale(scale, scale)
160
- canvas.translate(-text.anchor.x, -text.anchor.y)
161
- // The picture fades as a whole: its letters and background don't show through each other.
162
- if (alpha < 255) {
163
- canvas.saveLayerAlpha(0f, 0f, text.picture.width.toFloat(), text.picture.height.toFloat(), alpha)
164
- }
165
- canvas.drawPicture(text.picture)
166
- canvas.restoreToCount(count)
167
- }
168
-
169
- override fun setAlpha(alpha: Int) = Unit
170
-
171
- override fun setColorFilter(colorFilter: ColorFilter?) = Unit
172
-
173
- @Deprecated("Deprecated in Java")
174
- override fun getOpacity(): Int = PixelFormat.TRANSLUCENT
175
-
176
- private companion object {
177
- const val CHANGE_OVER = 0.25f
178
- }
179
- }
@@ -1,139 +0,0 @@
1
- package dev.apexnative.navigation.views.element.animators
2
-
3
- import android.animation.Animator
4
- import android.graphics.Canvas
5
- import android.graphics.ColorFilter
6
- import android.graphics.Paint
7
- import android.graphics.Picture
8
- import android.graphics.PixelFormat
9
- import android.graphics.PorterDuff
10
- import android.graphics.PorterDuffXfermode
11
- import android.graphics.RectF
12
- import android.graphics.drawable.Drawable
13
- import android.view.View
14
- import android.view.ViewGroup
15
- import androidx.core.animation.doOnEnd
16
- import androidx.core.animation.doOnStart
17
- import com.facebook.react.views.view.ReactViewGroup
18
- import dev.apexnative.navigation.options.SharedElementTransitionOptions
19
- import dev.apexnative.navigation.utils.ViewUtils
20
- import dev.apexnative.navigation.utils.borderRadius
21
- import dev.apexnative.navigation.utils.computeInheritedScale
22
- import kotlin.math.roundToInt
23
-
24
- // A view with children moves as two pictures of itself, as on iOS: of the view that goes away and of the one that
25
- // comes, each with its children. The copy goes from the place, size and corner radius of the one to those of the other,
26
- // both pictures fill it, and the picture of the destination shows over the other on the way. The pictures are drawing
27
- // commands: an avatar's letter grows sharp. They are drawn in the overlay of the transition layer while `to` is hidden,
28
- // and nothing else moves the pair. A view without children moves itself, its outline growing, as before.
29
- class ViewChangeAnimator(from: View, to: View) : PropertyAnimatorCreator<ReactViewGroup>(from, to, ReactViewGroup::class.java) {
30
- private val pictures by lazy { pictures() }
31
-
32
- override fun shouldAnimateProperty(fromChild: ReactViewGroup, toChild: ReactViewGroup): Boolean =
33
- (fromChild.childCount > 0 || toChild.childCount > 0) && pictures != null
34
-
35
- override fun create(options: SharedElementTransitionOptions): Animator {
36
- val (start, end) = checkNotNull(pictures)
37
- val layer = to.parent as ViewGroup
38
- val drawable = ViewMorphDrawable(start, end)
39
- // Everything changes between the start and the end of the animation: a cancelled one ends too.
40
- return MoveAnimator().apply {
41
- doOnStart {
42
- drawable.setBounds(0, 0, layer.width, layer.height)
43
- layer.overlay.add(drawable)
44
- to.alpha = 0f
45
- }
46
- addUpdateListener {
47
- drawable.progress = curve.getInterpolation(it.animatedFraction)
48
- layer.invalidate()
49
- }
50
- doOnEnd {
51
- layer.overlay.remove(drawable)
52
- layer.invalidate()
53
- to.alpha = end.alpha
54
- }
55
- }
56
- }
57
-
58
- // `to` is in the transition layer already, at its margins (the coordinates of the other animators); `from` is where
59
- // it is on the screen, at the scale of its parents.
60
- private fun pictures(): Pair<ViewPicture, ViewPicture>? {
61
- if (to.parent !is ViewGroup) return null
62
- val toPlace = to.layoutParams as? ViewGroup.MarginLayoutParams ?: return null
63
- val fromPlace = ViewUtils.getLocationOnScreen(from)
64
- .apply { ViewUtils.getLocationOnScreen(to.parent as View).let { offset(-it.x, -it.y) } }
65
- val (scaleX, scaleY) = computeInheritedScale(from)
66
- val fromRect = RectF(0f, 0f, from.width * scaleX, from.height * scaleY).apply {
67
- offset(fromPlace.x.toFloat(), fromPlace.y.toFloat())
68
- }
69
- val toRect = RectF(0f, 0f, to.width.toFloat(), to.height.toFloat()).apply {
70
- offset(toPlace.leftMargin.toFloat(), toPlace.topMargin.toFloat())
71
- }
72
- val start = ViewPicture.of(from as ReactViewGroup, fromRect, scaleX) ?: return null
73
- val end = ViewPicture.of(to as ReactViewGroup, toRect, 1f) ?: return null
74
- return start to end
75
- }
76
- }
77
-
78
- // A view's picture, its place in the transition layer, its corner radius there and its opacity.
79
- private class ViewPicture(val picture: Picture, val rect: RectF, val radius: Float, val alpha: Float) {
80
- companion object {
81
- fun of(view: ReactViewGroup, rect: RectF, scale: Float): ViewPicture? {
82
- if (view.width <= 0 || view.height <= 0) return null
83
- val picture = recordPicture(view) ?: return null
84
- return ViewPicture(picture, rect, view.borderRadius * scale, view.alpha)
85
- }
86
- }
87
- }
88
-
89
- // The copy where the move has brought it: its place, size and corner radius go from the start to the end along the
90
- // transition's curve, and so does the picture of the end over the picture of the start.
91
- private class ViewMorphDrawable(private val start: ViewPicture, private val end: ViewPicture) : Drawable() {
92
- var progress = 0f
93
- private val rect = RectF()
94
- private val maskPaint = Paint(Paint.ANTI_ALIAS_FLAG)
95
- // What is drawn over the mask keeps only the mask's pixels: the corners stay smooth (a clip path on the hardware
96
- // canvas is not anti-aliased).
97
- private val contentPaint = Paint().apply { xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN) }
98
-
99
- override fun draw(canvas: Canvas) {
100
- rect.set(
101
- lerp(start.rect.left, end.rect.left),
102
- lerp(start.rect.top, end.rect.top),
103
- lerp(start.rect.right, end.rect.right),
104
- lerp(start.rect.bottom, end.rect.bottom)
105
- )
106
- if (rect.isEmpty) return
107
- val radius = lerp(start.radius, end.radius)
108
- val count = canvas.saveLayer(rect, null)
109
- canvas.drawRoundRect(rect, radius, radius, maskPaint)
110
- canvas.saveLayer(rect, contentPaint)
111
- draw(canvas, start, start.alpha)
112
- draw(canvas, end, end.alpha * progress)
113
- canvas.restoreToCount(count)
114
- }
115
-
116
- // A picture fills the copy, as on iOS.
117
- private fun draw(canvas: Canvas, view: ViewPicture, shown: Float) {
118
- val alpha = (shown * 255).roundToInt().coerceIn(0, 255)
119
- if (alpha == 0) return
120
- val width = view.picture.width.toFloat()
121
- val height = view.picture.height.toFloat()
122
- val count = canvas.save()
123
- canvas.translate(rect.left, rect.top)
124
- canvas.scale(rect.width() / width, rect.height() / height)
125
- // The picture fades as a whole: its children and background don't show through each other.
126
- if (alpha < 255) canvas.saveLayerAlpha(0f, 0f, width, height, alpha)
127
- canvas.drawPicture(view.picture)
128
- canvas.restoreToCount(count)
129
- }
130
-
131
- private fun lerp(from: Float, to: Float) = from + (to - from) * progress
132
-
133
- override fun setAlpha(alpha: Int) = Unit
134
-
135
- override fun setColorFilter(colorFilter: ColorFilter?) = Unit
136
-
137
- @Deprecated("Deprecated in Java")
138
- override fun getOpacity(): Int = PixelFormat.TRANSLUCENT
139
- }
@@ -1,30 +0,0 @@
1
- #import "ANNEventEmitter.h"
2
- #import <UIKit/UIKit.h>
3
-
4
- NS_ASSUME_NONNULL_BEGIN
5
-
6
- /// Posted on the main queue when the padding of a screen's safe area view changed; the object is the screen id.
7
- extern NSNotificationName const ANNScreenSafeAreaPaddingDidChangeNotification;
8
-
9
- /// The safe area of each screen: how much of its content the bars and the system cover on each side. The padding is
10
- /// the part of it the screen's safe area view keeps its content out of: the insets on the edges the screen's options
11
- /// give. JavaScript gets the rest, what still covers the content (0 on a padded edge): it reads it from its own thread
12
- /// for a screen's first render, and gets every change as `ANN.ScreenInsetsChanged`. Main queue, but the reads.
13
- @interface ANNScreenInsets : NSObject
14
-
15
- /// Keeps the screen's insets and padding, and tells when they changed.
16
- + (void)setInsets:(UIEdgeInsets)insets
17
- padding:(UIEdgeInsets)padding
18
- forScreenId:(NSString *)screenId
19
- eventEmitter:(ANNEventEmitter *)eventEmitter;
20
- /// The padding of the screen's safe area view; none before the screen was laid out. Main queue.
21
- + (UIEdgeInsets)paddingForScreenId:(NSString *)screenId;
22
- /// `{ top, right, bottom, left }`, or nil before the screen was laid out. Any thread.
23
- + (nullable NSDictionary<NSString *, NSNumber *> *)insetsForScreenId:(NSString *)screenId;
24
- + (void)removeScreenId:(NSString *)screenId;
25
- /// Forgets every screen: after a reload the new JavaScript counts its ids anew. Main queue.
26
- + (void)removeAll;
27
-
28
- @end
29
-
30
- NS_ASSUME_NONNULL_END
@@ -1,68 +0,0 @@
1
- #import "ANNScreenInsets.h"
2
-
3
- NSNotificationName const ANNScreenSafeAreaPaddingDidChangeNotification = @"ANNScreenSafeAreaPaddingDidChange";
4
-
5
- static NSMutableDictionary<NSString *, NSDictionary<NSString *, NSNumber *> *> *ANNScreenInsetsById;
6
- // Main queue only.
7
- static NSMutableDictionary<NSString *, NSValue *> *ANNScreenPaddingById;
8
-
9
- @implementation ANNScreenInsets
10
-
11
- + (void)initialize {
12
- if (self == ANNScreenInsets.class) {
13
- ANNScreenInsetsById = [NSMutableDictionary new];
14
- ANNScreenPaddingById = [NSMutableDictionary new];
15
- }
16
- }
17
-
18
- + (void)setInsets:(UIEdgeInsets)insets
19
- padding:(UIEdgeInsets)padding
20
- forScreenId:(NSString *)screenId
21
- eventEmitter:(ANNEventEmitter *)eventEmitter {
22
- NSValue *paddingValue = [NSValue valueWithUIEdgeInsets:padding];
23
- if (![ANNScreenPaddingById[screenId] isEqualToValue:paddingValue]) {
24
- ANNScreenPaddingById[screenId] = paddingValue;
25
- [NSNotificationCenter.defaultCenter postNotificationName:ANNScreenSafeAreaPaddingDidChangeNotification
26
- object:screenId];
27
- }
28
- // JavaScript gets what still covers the content: the edges the safe area view keeps it off are 0.
29
- NSDictionary<NSString *, NSNumber *> *value = @{
30
- @"top" : @(MAX(insets.top - padding.top, 0)),
31
- @"right" : @(MAX(insets.right - padding.right, 0)),
32
- @"bottom" : @(MAX(insets.bottom - padding.bottom, 0)),
33
- @"left" : @(MAX(insets.left - padding.left, 0)),
34
- };
35
- @synchronized(ANNScreenInsetsById) {
36
- if ([ANNScreenInsetsById[screenId] isEqualToDictionary:value]) {
37
- return;
38
- }
39
- ANNScreenInsetsById[screenId] = value;
40
- }
41
- [eventEmitter sendScreenInsetsChanged:screenId insets:value];
42
- }
43
-
44
- + (NSDictionary<NSString *, NSNumber *> *)insetsForScreenId:(NSString *)screenId {
45
- @synchronized(ANNScreenInsetsById) {
46
- return ANNScreenInsetsById[screenId];
47
- }
48
- }
49
-
50
- + (UIEdgeInsets)paddingForScreenId:(NSString *)screenId {
51
- return ANNScreenPaddingById[screenId].UIEdgeInsetsValue;
52
- }
53
-
54
- + (void)removeScreenId:(NSString *)screenId {
55
- [ANNScreenPaddingById removeObjectForKey:screenId];
56
- @synchronized(ANNScreenInsetsById) {
57
- [ANNScreenInsetsById removeObjectForKey:screenId];
58
- }
59
- }
60
-
61
- + (void)removeAll {
62
- [ANNScreenPaddingById removeAllObjects];
63
- @synchronized(ANNScreenInsetsById) {
64
- [ANNScreenInsetsById removeAllObjects];
65
- }
66
- }
67
-
68
- @end
@@ -1,27 +0,0 @@
1
- #import <UIKit/UIKit.h>
2
-
3
- NS_ASSUME_NONNULL_BEGIN
4
-
5
- /// Where the React views of unselected tabs mount while the tabs render: a window of zero size that clips what it
6
- /// holds, hidden from accessibility, in the scene of the navigation's main window. Nothing in it is seen and its safe
7
- /// area views never lay out there: a tab renders its content where it shows. One per tabs node; it goes when it holds
8
- /// nothing more or with its tabs. Main queue.
9
- @interface ANNTabsPreloadWindow : UIWindow
10
-
11
- /// A new window in the scene of the main window; when the main window has no scene yet, it joins the scene as the main
12
- /// window connects (`mainWindowSceneDidConnect:`), before it holds anything that could be seen.
13
- + (instancetype)preloadWindow;
14
-
15
- /// The main window connected to its scene: every live preload window joins it.
16
- + (void)mainWindowSceneDidConnect:(UIWindowScene *)windowScene;
17
-
18
- /// A reload of the JavaScript: every live preload window hides at once; its views go with their old tabs after the
19
- /// reload's hold.
20
- + (void)hideAllAfterReload;
21
-
22
- /// The window goes: it hides and leaves its scene. Its views are the tabs' to take back first.
23
- - (void)close;
24
-
25
- @end
26
-
27
- NS_ASSUME_NONNULL_END
@@ -1,55 +0,0 @@
1
- #import "ANNTabsPreloadWindow.h"
2
- #import "ANNAssert.h"
3
- #import "ApexNavigation+Internal.h"
4
-
5
- // Every live preload window, weakly: the reload hides them, the scene's connection moves them. Main queue.
6
- static NSHashTable<ANNTabsPreloadWindow *> *ANNPreloadWindows(void) {
7
- static NSHashTable<ANNTabsPreloadWindow *> *windows;
8
- if (!windows) {
9
- windows = [NSHashTable weakObjectsHashTable];
10
- }
11
- return windows;
12
- }
13
-
14
- @implementation ANNTabsPreloadWindow
15
-
16
- + (instancetype)preloadWindow {
17
- ANNAssertMainQueue();
18
- UIWindowScene *scene = ApexNavigation.mainWindow.windowScene;
19
- ANNTabsPreloadWindow *window =
20
- scene ? [[self alloc] initWithWindowScene:scene] : [[self alloc] initWithFrame:CGRectZero];
21
- window.frame = CGRectZero;
22
- window.clipsToBounds = YES;
23
- window.userInteractionEnabled = NO;
24
- window.accessibilityElementsHidden = YES;
25
- window.backgroundColor = UIColor.clearColor;
26
- // Under every window of the app: nothing of it is ever drawn over the navigation.
27
- window.windowLevel = UIWindowLevelNormal - 1;
28
- window.hidden = NO;
29
- [ANNPreloadWindows() addObject:window];
30
- return window;
31
- }
32
-
33
- + (void)mainWindowSceneDidConnect:(UIWindowScene *)windowScene {
34
- ANNAssertMainQueue();
35
- for (ANNTabsPreloadWindow *window in ANNPreloadWindows().allObjects) {
36
- if (window.windowScene != windowScene) {
37
- window.windowScene = windowScene;
38
- }
39
- }
40
- }
41
-
42
- + (void)hideAllAfterReload {
43
- ANNAssertMainQueue();
44
- for (ANNTabsPreloadWindow *window in ANNPreloadWindows().allObjects) {
45
- window.hidden = YES;
46
- }
47
- }
48
-
49
- - (void)close {
50
- self.hidden = YES;
51
- [ANNPreloadWindows() removeObject:self];
52
- self.windowScene = nil;
53
- }
54
-
55
- @end