@amazon-devices/react-navigation__stack 2.0.1758683737

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 (242) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +5 -0
  3. package/SystemBundles/ed2637c0b74cd42ce066fca701acc5cb0850978c5296fae5bd715d5e4c67b128.bundle +29321 -0
  4. package/SystemBundles/ed2637c0b74cd42ce066fca701acc5cb0850978c5296fae5bd715d5e4c67b128.map +1 -0
  5. package/SystemModules/amzn__react-navigation__stack-2.modules.txt +95 -0
  6. package/SystemModules/amzn__react-navigation__stack-2.private.modules.txt +258 -0
  7. package/SystemModules/keplerscript-system-bundle-config.json +7 -0
  8. package/THIRD_PARTY_NOTICES.txt +24 -0
  9. package/kepler-compatibility.json +8 -0
  10. package/kepler-transformed-package-info.json +3 -0
  11. package/lib/commonjs/TransitionConfigs/CardStyleInterpolators.js +353 -0
  12. package/lib/commonjs/TransitionConfigs/CardStyleInterpolators.js.map +1 -0
  13. package/lib/commonjs/TransitionConfigs/HeaderStyleInterpolators.js +259 -0
  14. package/lib/commonjs/TransitionConfigs/HeaderStyleInterpolators.js.map +1 -0
  15. package/lib/commonjs/TransitionConfigs/TransitionPresets.js +134 -0
  16. package/lib/commonjs/TransitionConfigs/TransitionPresets.js.map +1 -0
  17. package/lib/commonjs/TransitionConfigs/TransitionSpecs.js +100 -0
  18. package/lib/commonjs/TransitionConfigs/TransitionSpecs.js.map +1 -0
  19. package/lib/commonjs/index.js +69 -0
  20. package/lib/commonjs/index.js.map +1 -0
  21. package/lib/commonjs/navigators/createStackNavigator.js +82 -0
  22. package/lib/commonjs/navigators/createStackNavigator.js.map +1 -0
  23. package/lib/commonjs/types.js +6 -0
  24. package/lib/commonjs/types.js.map +1 -0
  25. package/lib/commonjs/utils/CardAnimationContext.js +11 -0
  26. package/lib/commonjs/utils/CardAnimationContext.js.map +1 -0
  27. package/lib/commonjs/utils/GestureHandlerRefContext.js +11 -0
  28. package/lib/commonjs/utils/GestureHandlerRefContext.js.map +1 -0
  29. package/lib/commonjs/utils/ModalPresentationContext.js +12 -0
  30. package/lib/commonjs/utils/ModalPresentationContext.js.map +1 -0
  31. package/lib/commonjs/utils/conditional.js +32 -0
  32. package/lib/commonjs/utils/conditional.js.map +1 -0
  33. package/lib/commonjs/utils/debounce.js +19 -0
  34. package/lib/commonjs/utils/debounce.js.map +1 -0
  35. package/lib/commonjs/utils/findLastIndex.js +15 -0
  36. package/lib/commonjs/utils/findLastIndex.js.map +1 -0
  37. package/lib/commonjs/utils/getDistanceForDirection.js +20 -0
  38. package/lib/commonjs/utils/getDistanceForDirection.js.map +1 -0
  39. package/lib/commonjs/utils/getInvertedMultiplier.js +20 -0
  40. package/lib/commonjs/utils/getInvertedMultiplier.js.map +1 -0
  41. package/lib/commonjs/utils/memoize.js +33 -0
  42. package/lib/commonjs/utils/memoize.js.map +1 -0
  43. package/lib/commonjs/utils/useCardAnimation.js +19 -0
  44. package/lib/commonjs/utils/useCardAnimation.js.map +1 -0
  45. package/lib/commonjs/utils/useGestureHandlerRef.js +19 -0
  46. package/lib/commonjs/utils/useGestureHandlerRef.js.map +1 -0
  47. package/lib/commonjs/utils/useKeyboardManager.js +96 -0
  48. package/lib/commonjs/utils/useKeyboardManager.js.map +1 -0
  49. package/lib/commonjs/views/GestureHandler.android.js +17 -0
  50. package/lib/commonjs/views/GestureHandler.android.js.map +1 -0
  51. package/lib/commonjs/views/GestureHandler.ios.js +17 -0
  52. package/lib/commonjs/views/GestureHandler.ios.js.map +1 -0
  53. package/lib/commonjs/views/GestureHandler.js +24 -0
  54. package/lib/commonjs/views/GestureHandler.js.map +1 -0
  55. package/lib/commonjs/views/GestureHandlerNative.js +34 -0
  56. package/lib/commonjs/views/GestureHandlerNative.js.map +1 -0
  57. package/lib/commonjs/views/Header/Header.js +61 -0
  58. package/lib/commonjs/views/Header/Header.js.map +1 -0
  59. package/lib/commonjs/views/Header/HeaderContainer.js +127 -0
  60. package/lib/commonjs/views/Header/HeaderContainer.js.map +1 -0
  61. package/lib/commonjs/views/Header/HeaderSegment.js +139 -0
  62. package/lib/commonjs/views/Header/HeaderSegment.js.map +1 -0
  63. package/lib/commonjs/views/ModalStatusBarManager.js +42 -0
  64. package/lib/commonjs/views/ModalStatusBarManager.js.map +1 -0
  65. package/lib/commonjs/views/Screens.js +44 -0
  66. package/lib/commonjs/views/Screens.js.map +1 -0
  67. package/lib/commonjs/views/Stack/Card.js +469 -0
  68. package/lib/commonjs/views/Stack/Card.js.map +1 -0
  69. package/lib/commonjs/views/Stack/CardContainer.js +259 -0
  70. package/lib/commonjs/views/Stack/CardContainer.js.map +1 -0
  71. package/lib/commonjs/views/Stack/CardSheet.js +54 -0
  72. package/lib/commonjs/views/Stack/CardSheet.js.map +1 -0
  73. package/lib/commonjs/views/Stack/CardStack.js +442 -0
  74. package/lib/commonjs/views/Stack/CardStack.js.map +1 -0
  75. package/lib/commonjs/views/Stack/StackView.js +333 -0
  76. package/lib/commonjs/views/Stack/StackView.js.map +1 -0
  77. package/lib/module/TransitionConfigs/CardStyleInterpolators.js +338 -0
  78. package/lib/module/TransitionConfigs/CardStyleInterpolators.js.map +1 -0
  79. package/lib/module/TransitionConfigs/HeaderStyleInterpolators.js +248 -0
  80. package/lib/module/TransitionConfigs/HeaderStyleInterpolators.js.map +1 -0
  81. package/lib/module/TransitionConfigs/TransitionPresets.js +128 -0
  82. package/lib/module/TransitionConfigs/TransitionPresets.js.map +1 -0
  83. package/lib/module/TransitionConfigs/TransitionSpecs.js +94 -0
  84. package/lib/module/TransitionConfigs/TransitionSpecs.js.map +1 -0
  85. package/lib/module/index.js +33 -0
  86. package/lib/module/index.js.map +1 -0
  87. package/lib/module/navigators/createStackNavigator.js +73 -0
  88. package/lib/module/navigators/createStackNavigator.js.map +1 -0
  89. package/lib/module/types.js +2 -0
  90. package/lib/module/types.js.map +1 -0
  91. package/lib/module/utils/CardAnimationContext.js +3 -0
  92. package/lib/module/utils/CardAnimationContext.js.map +1 -0
  93. package/lib/module/utils/GestureHandlerRefContext.js +3 -0
  94. package/lib/module/utils/GestureHandlerRefContext.js.map +1 -0
  95. package/lib/module/utils/ModalPresentationContext.js +4 -0
  96. package/lib/module/utils/ModalPresentationContext.js.map +1 -0
  97. package/lib/module/utils/conditional.js +26 -0
  98. package/lib/module/utils/conditional.js.map +1 -0
  99. package/lib/module/utils/debounce.js +13 -0
  100. package/lib/module/utils/debounce.js.map +1 -0
  101. package/lib/module/utils/findLastIndex.js +9 -0
  102. package/lib/module/utils/findLastIndex.js.map +1 -0
  103. package/lib/module/utils/getDistanceForDirection.js +13 -0
  104. package/lib/module/utils/getDistanceForDirection.js.map +1 -0
  105. package/lib/module/utils/getInvertedMultiplier.js +14 -0
  106. package/lib/module/utils/getInvertedMultiplier.js.map +1 -0
  107. package/lib/module/utils/memoize.js +27 -0
  108. package/lib/module/utils/memoize.js.map +1 -0
  109. package/lib/module/utils/useCardAnimation.js +10 -0
  110. package/lib/module/utils/useCardAnimation.js.map +1 -0
  111. package/lib/module/utils/useGestureHandlerRef.js +10 -0
  112. package/lib/module/utils/useGestureHandlerRef.js.map +1 -0
  113. package/lib/module/utils/useKeyboardManager.js +88 -0
  114. package/lib/module/utils/useKeyboardManager.js.map +1 -0
  115. package/lib/module/views/GestureHandler.android.js +2 -0
  116. package/lib/module/views/GestureHandler.android.js.map +1 -0
  117. package/lib/module/views/GestureHandler.ios.js +2 -0
  118. package/lib/module/views/GestureHandler.ios.js.map +1 -0
  119. package/lib/module/views/GestureHandler.js +16 -0
  120. package/lib/module/views/GestureHandler.js.map +1 -0
  121. package/lib/module/views/GestureHandlerNative.js +14 -0
  122. package/lib/module/views/GestureHandlerNative.js.map +1 -0
  123. package/lib/module/views/Header/Header.js +52 -0
  124. package/lib/module/views/Header/Header.js.map +1 -0
  125. package/lib/module/views/Header/HeaderContainer.js +118 -0
  126. package/lib/module/views/Header/HeaderContainer.js.map +1 -0
  127. package/lib/module/views/Header/HeaderSegment.js +130 -0
  128. package/lib/module/views/Header/HeaderSegment.js.map +1 -0
  129. package/lib/module/views/ModalStatusBarManager.js +34 -0
  130. package/lib/module/views/ModalStatusBarManager.js.map +1 -0
  131. package/lib/module/views/Screens.js +34 -0
  132. package/lib/module/views/Screens.js.map +1 -0
  133. package/lib/module/views/Stack/Card.js +458 -0
  134. package/lib/module/views/Stack/Card.js.map +1 -0
  135. package/lib/module/views/Stack/CardContainer.js +250 -0
  136. package/lib/module/views/Stack/CardContainer.js.map +1 -0
  137. package/lib/module/views/Stack/CardSheet.js +46 -0
  138. package/lib/module/views/Stack/CardSheet.js.map +1 -0
  139. package/lib/module/views/Stack/CardStack.js +432 -0
  140. package/lib/module/views/Stack/CardStack.js.map +1 -0
  141. package/lib/module/views/Stack/StackView.js +323 -0
  142. package/lib/module/views/Stack/StackView.js.map +1 -0
  143. package/lib/typescript/src/TransitionConfigs/CardStyleInterpolators.d.ts +35 -0
  144. package/lib/typescript/src/TransitionConfigs/CardStyleInterpolators.d.ts.map +1 -0
  145. package/lib/typescript/src/TransitionConfigs/HeaderStyleInterpolators.d.ts +23 -0
  146. package/lib/typescript/src/TransitionConfigs/HeaderStyleInterpolators.d.ts.map +1 -0
  147. package/lib/typescript/src/TransitionConfigs/TransitionPresets.d.ts +42 -0
  148. package/lib/typescript/src/TransitionConfigs/TransitionPresets.d.ts.map +1 -0
  149. package/lib/typescript/src/TransitionConfigs/TransitionSpecs.d.ts +36 -0
  150. package/lib/typescript/src/TransitionConfigs/TransitionSpecs.d.ts.map +1 -0
  151. package/lib/typescript/src/index.d.ts +29 -0
  152. package/lib/typescript/src/index.d.ts.map +1 -0
  153. package/lib/typescript/src/navigators/createStackNavigator.d.ts +8 -0
  154. package/lib/typescript/src/navigators/createStackNavigator.d.ts.map +1 -0
  155. package/lib/typescript/src/types.d.ts +481 -0
  156. package/lib/typescript/src/types.d.ts.map +1 -0
  157. package/lib/typescript/src/utils/CardAnimationContext.d.ts +5 -0
  158. package/lib/typescript/src/utils/CardAnimationContext.d.ts.map +1 -0
  159. package/lib/typescript/src/utils/GestureHandlerRefContext.d.ts +4 -0
  160. package/lib/typescript/src/utils/GestureHandlerRefContext.d.ts.map +1 -0
  161. package/lib/typescript/src/utils/ModalPresentationContext.d.ts +4 -0
  162. package/lib/typescript/src/utils/ModalPresentationContext.d.ts.map +1 -0
  163. package/lib/typescript/src/utils/conditional.d.ts +10 -0
  164. package/lib/typescript/src/utils/conditional.d.ts.map +1 -0
  165. package/lib/typescript/src/utils/debounce.d.ts +2 -0
  166. package/lib/typescript/src/utils/debounce.d.ts.map +1 -0
  167. package/lib/typescript/src/utils/findLastIndex.d.ts +2 -0
  168. package/lib/typescript/src/utils/findLastIndex.d.ts.map +1 -0
  169. package/lib/typescript/src/utils/getDistanceForDirection.d.ts +3 -0
  170. package/lib/typescript/src/utils/getDistanceForDirection.d.ts.map +1 -0
  171. package/lib/typescript/src/utils/getInvertedMultiplier.d.ts +3 -0
  172. package/lib/typescript/src/utils/getInvertedMultiplier.d.ts.map +1 -0
  173. package/lib/typescript/src/utils/memoize.d.ts +2 -0
  174. package/lib/typescript/src/utils/memoize.d.ts.map +1 -0
  175. package/lib/typescript/src/utils/useCardAnimation.d.ts +2 -0
  176. package/lib/typescript/src/utils/useCardAnimation.d.ts.map +1 -0
  177. package/lib/typescript/src/utils/useGestureHandlerRef.d.ts +3 -0
  178. package/lib/typescript/src/utils/useGestureHandlerRef.d.ts.map +1 -0
  179. package/lib/typescript/src/utils/useKeyboardManager.d.ts +6 -0
  180. package/lib/typescript/src/utils/useKeyboardManager.d.ts.map +1 -0
  181. package/lib/typescript/src/views/GestureHandler.android.d.ts +2 -0
  182. package/lib/typescript/src/views/GestureHandler.android.d.ts.map +1 -0
  183. package/lib/typescript/src/views/GestureHandler.d.ts +14 -0
  184. package/lib/typescript/src/views/GestureHandler.d.ts.map +1 -0
  185. package/lib/typescript/src/views/GestureHandler.ios.d.ts +2 -0
  186. package/lib/typescript/src/views/GestureHandler.ios.d.ts.map +1 -0
  187. package/lib/typescript/src/views/GestureHandlerNative.d.ts +6 -0
  188. package/lib/typescript/src/views/GestureHandlerNative.d.ts.map +1 -0
  189. package/lib/typescript/src/views/Header/Header.d.ts +5 -0
  190. package/lib/typescript/src/views/Header/Header.d.ts.map +1 -0
  191. package/lib/typescript/src/views/Header/HeaderContainer.d.ts +20 -0
  192. package/lib/typescript/src/views/Header/HeaderContainer.d.ts.map +1 -0
  193. package/lib/typescript/src/views/Header/HeaderSegment.d.ts +14 -0
  194. package/lib/typescript/src/views/Header/HeaderSegment.d.ts.map +1 -0
  195. package/lib/typescript/src/views/ModalStatusBarManager.d.ts +12 -0
  196. package/lib/typescript/src/views/ModalStatusBarManager.d.ts.map +1 -0
  197. package/lib/typescript/src/views/Screens.d.ts +13 -0
  198. package/lib/typescript/src/views/Screens.d.ts.map +1 -0
  199. package/lib/typescript/src/views/Stack/Card.d.ts +76 -0
  200. package/lib/typescript/src/views/Stack/Card.d.ts.map +1 -0
  201. package/lib/typescript/src/views/Stack/CardContainer.d.ts +63 -0
  202. package/lib/typescript/src/views/Stack/CardContainer.d.ts.map +1 -0
  203. package/lib/typescript/src/views/Stack/CardSheet.d.ts +15 -0
  204. package/lib/typescript/src/views/Stack/CardSheet.d.ts.map +1 -0
  205. package/lib/typescript/src/views/Stack/CardStack.d.ts +67 -0
  206. package/lib/typescript/src/views/Stack/CardStack.d.ts.map +1 -0
  207. package/lib/typescript/src/views/Stack/StackView.d.ts +122 -0
  208. package/lib/typescript/src/views/Stack/StackView.d.ts.map +1 -0
  209. package/package.json +1 -0
  210. package/src/TransitionConfigs/CardStyleInterpolators.tsx +394 -0
  211. package/src/TransitionConfigs/HeaderStyleInterpolators.tsx +268 -0
  212. package/src/TransitionConfigs/TransitionPresets.tsx +152 -0
  213. package/src/TransitionConfigs/TransitionSpecs.tsx +96 -0
  214. package/src/index.tsx +51 -0
  215. package/src/navigators/createStackNavigator.tsx +136 -0
  216. package/src/types.tsx +547 -0
  217. package/src/utils/CardAnimationContext.tsx +7 -0
  218. package/src/utils/GestureHandlerRefContext.tsx +5 -0
  219. package/src/utils/ModalPresentationContext.tsx +5 -0
  220. package/src/utils/conditional.tsx +33 -0
  221. package/src/utils/debounce.tsx +17 -0
  222. package/src/utils/findLastIndex.tsx +12 -0
  223. package/src/utils/getDistanceForDirection.tsx +18 -0
  224. package/src/utils/getInvertedMultiplier.tsx +18 -0
  225. package/src/utils/memoize.tsx +33 -0
  226. package/src/utils/useCardAnimation.tsx +15 -0
  227. package/src/utils/useGestureHandlerRef.tsx +15 -0
  228. package/src/utils/useKeyboardManager.tsx +105 -0
  229. package/src/views/GestureHandler.android.tsx +1 -0
  230. package/src/views/GestureHandler.ios.tsx +1 -0
  231. package/src/views/GestureHandler.tsx +23 -0
  232. package/src/views/GestureHandlerNative.tsx +23 -0
  233. package/src/views/Header/Header.tsx +72 -0
  234. package/src/views/Header/HeaderContainer.tsx +186 -0
  235. package/src/views/Header/HeaderSegment.tsx +205 -0
  236. package/src/views/ModalStatusBarManager.tsx +50 -0
  237. package/src/views/Screens.tsx +43 -0
  238. package/src/views/Stack/Card.tsx +628 -0
  239. package/src/views/Stack/CardContainer.tsx +320 -0
  240. package/src/views/Stack/CardSheet.tsx +61 -0
  241. package/src/views/Stack/CardStack.tsx +717 -0
  242. package/src/views/Stack/StackView.tsx +474 -0
@@ -0,0 +1,394 @@
1
+ import { Animated, Platform } from 'react-native';
2
+
3
+ import type {
4
+ StackCardInterpolatedStyle,
5
+ StackCardInterpolationProps,
6
+ } from '../types';
7
+ import conditional from '../utils/conditional';
8
+
9
+ const { add, multiply } = Animated;
10
+
11
+ /**
12
+ * Standard iOS-style slide in from the right.
13
+ */
14
+ export function forHorizontalIOS({
15
+ current,
16
+ next,
17
+ inverted,
18
+ layouts: { screen },
19
+ }: StackCardInterpolationProps): StackCardInterpolatedStyle {
20
+ const translateFocused = multiply(
21
+ current.progress.interpolate({
22
+ inputRange: [0, 1],
23
+ outputRange: [screen.width, 0],
24
+ extrapolate: 'clamp',
25
+ }),
26
+ inverted
27
+ );
28
+
29
+ const translateUnfocused = next
30
+ ? multiply(
31
+ next.progress.interpolate({
32
+ inputRange: [0, 1],
33
+ outputRange: [0, screen.width * -0.3],
34
+ extrapolate: 'clamp',
35
+ }),
36
+ inverted
37
+ )
38
+ : 0;
39
+
40
+ const overlayOpacity = current.progress.interpolate({
41
+ inputRange: [0, 1],
42
+ outputRange: [0, 0.07],
43
+ extrapolate: 'clamp',
44
+ });
45
+
46
+ const shadowOpacity = current.progress.interpolate({
47
+ inputRange: [0, 1],
48
+ outputRange: [0, 0.3],
49
+ extrapolate: 'clamp',
50
+ });
51
+
52
+ return {
53
+ cardStyle: {
54
+ transform: [
55
+ // Translation for the animation of the current card
56
+ { translateX: translateFocused },
57
+ // Translation for the animation of the card on top of this
58
+ { translateX: translateUnfocused },
59
+ ],
60
+ },
61
+ overlayStyle: { opacity: overlayOpacity },
62
+ shadowStyle: { shadowOpacity },
63
+ };
64
+ }
65
+
66
+ /**
67
+ * Standard iOS-style slide in from the bottom (used for modals).
68
+ */
69
+ export function forVerticalIOS({
70
+ current,
71
+ inverted,
72
+ layouts: { screen },
73
+ }: StackCardInterpolationProps): StackCardInterpolatedStyle {
74
+ const translateY = multiply(
75
+ current.progress.interpolate({
76
+ inputRange: [0, 1],
77
+ outputRange: [screen.height, 0],
78
+ extrapolate: 'clamp',
79
+ }),
80
+ inverted
81
+ );
82
+
83
+ return {
84
+ cardStyle: {
85
+ transform: [{ translateY }],
86
+ },
87
+ };
88
+ }
89
+
90
+ /**
91
+ * Standard iOS-style modal animation in iOS 13.
92
+ */
93
+ export function forModalPresentationIOS({
94
+ index,
95
+ current,
96
+ next,
97
+ inverted,
98
+ layouts: { screen },
99
+ insets,
100
+ }: StackCardInterpolationProps): StackCardInterpolatedStyle {
101
+ const hasNotchIos =
102
+ Platform.OS === 'ios' &&
103
+ !Platform.isPad &&
104
+ !Platform.isTV &&
105
+ insets.top > 20;
106
+ const isLandscape = screen.width > screen.height;
107
+ const topOffset = isLandscape ? 0 : 10;
108
+ const statusBarHeight = insets.top;
109
+ const aspectRatio = screen.height / screen.width;
110
+
111
+ const progress = add(
112
+ current.progress.interpolate({
113
+ inputRange: [0, 1],
114
+ outputRange: [0, 1],
115
+ extrapolate: 'clamp',
116
+ }),
117
+ next
118
+ ? next.progress.interpolate({
119
+ inputRange: [0, 1],
120
+ outputRange: [0, 1],
121
+ extrapolate: 'clamp',
122
+ })
123
+ : 0
124
+ );
125
+
126
+ const isFirst = index === 0;
127
+
128
+ const translateY = multiply(
129
+ progress.interpolate({
130
+ inputRange: [0, 1, 2],
131
+ outputRange: [
132
+ screen.height,
133
+ isFirst ? 0 : topOffset,
134
+ (isFirst ? statusBarHeight : 0) - topOffset * aspectRatio,
135
+ ],
136
+ }),
137
+ inverted
138
+ );
139
+
140
+ const overlayOpacity = progress.interpolate({
141
+ inputRange: [0, 1, 1.0001, 2],
142
+ outputRange: [0, 0.3, 1, 1],
143
+ });
144
+
145
+ const scale = isLandscape
146
+ ? 1
147
+ : progress.interpolate({
148
+ inputRange: [0, 1, 2],
149
+ outputRange: [
150
+ 1,
151
+ 1,
152
+ screen.width ? 1 - (topOffset * 2) / screen.width : 1,
153
+ ],
154
+ });
155
+
156
+ const borderRadius = isLandscape
157
+ ? 0
158
+ : isFirst
159
+ ? progress.interpolate({
160
+ inputRange: [0, 1, 1.0001, 2],
161
+ outputRange: [0, 0, hasNotchIos ? 38 : 0, 10],
162
+ })
163
+ : 10;
164
+
165
+ return {
166
+ cardStyle: {
167
+ overflow: 'hidden',
168
+ borderTopLeftRadius: borderRadius,
169
+ borderTopRightRadius: borderRadius,
170
+ // We don't need these for the animation
171
+ // But different border radius for corners improves animation perf
172
+ borderBottomLeftRadius: hasNotchIos ? borderRadius : 0,
173
+ borderBottomRightRadius: hasNotchIos ? borderRadius : 0,
174
+ marginTop: isFirst ? 0 : statusBarHeight,
175
+ marginBottom: isFirst ? 0 : topOffset,
176
+ transform: [{ translateY }, { scale }],
177
+ },
178
+ overlayStyle: { opacity: overlayOpacity },
179
+ };
180
+ }
181
+
182
+ /**
183
+ * Standard Android-style fade in from the bottom for Android Oreo.
184
+ */
185
+ export function forFadeFromBottomAndroid({
186
+ current,
187
+ inverted,
188
+ layouts: { screen },
189
+ closing,
190
+ }: StackCardInterpolationProps): StackCardInterpolatedStyle {
191
+ const translateY = multiply(
192
+ current.progress.interpolate({
193
+ inputRange: [0, 1],
194
+ outputRange: [screen.height * 0.08, 0],
195
+ extrapolate: 'clamp',
196
+ }),
197
+ inverted
198
+ );
199
+
200
+ const opacity = conditional(
201
+ closing,
202
+ current.progress,
203
+ current.progress.interpolate({
204
+ inputRange: [0, 0.5, 0.9, 1],
205
+ outputRange: [0, 0.25, 0.7, 1],
206
+ extrapolate: 'clamp',
207
+ })
208
+ );
209
+
210
+ return {
211
+ cardStyle: {
212
+ opacity,
213
+ transform: [{ translateY }],
214
+ },
215
+ };
216
+ }
217
+
218
+ /**
219
+ * Standard Android-style reveal from the bottom for Android Pie.
220
+ */
221
+ export function forRevealFromBottomAndroid({
222
+ current,
223
+ next,
224
+ inverted,
225
+ layouts: { screen },
226
+ }: StackCardInterpolationProps): StackCardInterpolatedStyle {
227
+ const containerTranslateY = multiply(
228
+ current.progress.interpolate({
229
+ inputRange: [0, 1],
230
+ outputRange: [screen.height, 0],
231
+ extrapolate: 'clamp',
232
+ }),
233
+ inverted
234
+ );
235
+
236
+ const cardTranslateYFocused = multiply(
237
+ current.progress.interpolate({
238
+ inputRange: [0, 1],
239
+ outputRange: [screen.height * (95.9 / 100) * -1, 0],
240
+ extrapolate: 'clamp',
241
+ }),
242
+ inverted
243
+ );
244
+
245
+ const cardTranslateYUnfocused = next
246
+ ? multiply(
247
+ next.progress.interpolate({
248
+ inputRange: [0, 1],
249
+ outputRange: [0, screen.height * (2 / 100) * -1],
250
+ extrapolate: 'clamp',
251
+ }),
252
+ inverted
253
+ )
254
+ : 0;
255
+
256
+ const overlayOpacity = current.progress.interpolate({
257
+ inputRange: [0, 0.36, 1],
258
+ outputRange: [0, 0.1, 0.1],
259
+ extrapolate: 'clamp',
260
+ });
261
+
262
+ return {
263
+ containerStyle: {
264
+ overflow: 'hidden',
265
+ transform: [{ translateY: containerTranslateY }],
266
+ },
267
+ cardStyle: {
268
+ transform: [
269
+ { translateY: cardTranslateYFocused },
270
+ { translateY: cardTranslateYUnfocused },
271
+ ],
272
+ },
273
+ overlayStyle: { opacity: overlayOpacity },
274
+ };
275
+ }
276
+
277
+ /**
278
+ * Standard Android-style zoom for Android 10.
279
+ */
280
+ export function forScaleFromCenterAndroid({
281
+ current,
282
+ next,
283
+ closing,
284
+ }: StackCardInterpolationProps): StackCardInterpolatedStyle {
285
+ const progress = add(
286
+ current.progress.interpolate({
287
+ inputRange: [0, 1],
288
+ outputRange: [0, 1],
289
+ extrapolate: 'clamp',
290
+ }),
291
+ next
292
+ ? next.progress.interpolate({
293
+ inputRange: [0, 1],
294
+ outputRange: [0, 1],
295
+ extrapolate: 'clamp',
296
+ })
297
+ : 0
298
+ );
299
+
300
+ const opacity = progress.interpolate({
301
+ inputRange: [0, 0.75, 0.875, 1, 1.0825, 1.2075, 2],
302
+ outputRange: [0, 0, 1, 1, 1, 1, 0],
303
+ });
304
+
305
+ const scale = conditional(
306
+ closing,
307
+ current.progress.interpolate({
308
+ inputRange: [0, 1],
309
+ outputRange: [0.925, 1],
310
+ extrapolate: 'clamp',
311
+ }),
312
+ progress.interpolate({
313
+ inputRange: [0, 1, 2],
314
+ outputRange: [0.85, 1, 1.075],
315
+ })
316
+ );
317
+
318
+ return {
319
+ cardStyle: {
320
+ opacity,
321
+ transform: [{ scale }],
322
+ },
323
+ };
324
+ }
325
+
326
+ /**
327
+ * Standard bottom sheet slide in from the bottom for Android.
328
+ */
329
+ export function forBottomSheetAndroid({
330
+ current,
331
+ inverted,
332
+ layouts: { screen },
333
+ closing,
334
+ }: StackCardInterpolationProps): StackCardInterpolatedStyle {
335
+ const translateY = multiply(
336
+ current.progress.interpolate({
337
+ inputRange: [0, 1],
338
+ outputRange: [screen.height * 0.8, 0],
339
+ extrapolate: 'clamp',
340
+ }),
341
+ inverted
342
+ );
343
+
344
+ const opacity = conditional(
345
+ closing,
346
+ current.progress,
347
+ current.progress.interpolate({
348
+ inputRange: [0, 1],
349
+ outputRange: [0, 1],
350
+ extrapolate: 'clamp',
351
+ })
352
+ );
353
+
354
+ const overlayOpacity = current.progress.interpolate({
355
+ inputRange: [0, 1],
356
+ outputRange: [0, 0.3],
357
+ extrapolate: 'clamp',
358
+ });
359
+
360
+ return {
361
+ cardStyle: {
362
+ opacity,
363
+ transform: [{ translateY }],
364
+ },
365
+ overlayStyle: { opacity: overlayOpacity },
366
+ };
367
+ }
368
+
369
+ /**
370
+ * Simple fade animation for dialogs
371
+ */
372
+ export function forFadeFromCenter({
373
+ current: { progress },
374
+ }: StackCardInterpolationProps): StackCardInterpolatedStyle {
375
+ return {
376
+ cardStyle: {
377
+ opacity: progress.interpolate({
378
+ inputRange: [0, 0.5, 0.9, 1],
379
+ outputRange: [0, 0.25, 0.7, 1],
380
+ }),
381
+ },
382
+ overlayStyle: {
383
+ opacity: progress.interpolate({
384
+ inputRange: [0, 1],
385
+ outputRange: [0, 0.5],
386
+ extrapolate: 'clamp',
387
+ }),
388
+ },
389
+ };
390
+ }
391
+
392
+ export function forNoAnimation(): StackCardInterpolatedStyle {
393
+ return {};
394
+ }
@@ -0,0 +1,268 @@
1
+ import { Animated, I18nManager } from 'react-native';
2
+
3
+ import type {
4
+ StackHeaderInterpolatedStyle,
5
+ StackHeaderInterpolationProps,
6
+ } from '../types';
7
+
8
+ const { add } = Animated;
9
+
10
+ /**
11
+ * Standard UIKit style animation for the header where the title fades into the back button label.
12
+ */
13
+ export function forUIKit({
14
+ current,
15
+ next,
16
+ layouts,
17
+ }: StackHeaderInterpolationProps): StackHeaderInterpolatedStyle {
18
+ const defaultOffset = 100;
19
+ const leftSpacing = 27;
20
+
21
+ // The title and back button title should cross-fade to each other
22
+ // When screen is fully open, the title should be in center, and back title should be on left
23
+ // When screen is closing, the previous title will animate to back title's position
24
+ // And back title will animate to title's position
25
+ // We achieve this by calculating the offsets needed to translate title to back title's position and vice-versa
26
+ const leftLabelOffset = layouts.leftLabel
27
+ ? (layouts.screen.width - layouts.leftLabel.width) / 2 - leftSpacing
28
+ : defaultOffset;
29
+ const titleLeftOffset = layouts.title
30
+ ? (layouts.screen.width - layouts.title.width) / 2 - leftSpacing
31
+ : defaultOffset;
32
+
33
+ // When the current title is animating to right, it is centered in the right half of screen in middle of transition
34
+ // The back title also animates in from this position
35
+ const rightOffset = layouts.screen.width / 4;
36
+
37
+ const progress = add(
38
+ current.progress.interpolate({
39
+ inputRange: [0, 1],
40
+ outputRange: [0, 1],
41
+ extrapolate: 'clamp',
42
+ }),
43
+ next
44
+ ? next.progress.interpolate({
45
+ inputRange: [0, 1],
46
+ outputRange: [0, 1],
47
+ extrapolate: 'clamp',
48
+ })
49
+ : 0
50
+ );
51
+
52
+ return {
53
+ leftButtonStyle: {
54
+ opacity: progress.interpolate({
55
+ inputRange: [0.3, 1, 1.5],
56
+ outputRange: [0, 1, 0],
57
+ }),
58
+ },
59
+ leftLabelStyle: {
60
+ transform: [
61
+ {
62
+ translateX: progress.interpolate({
63
+ inputRange: [0, 1, 2],
64
+ outputRange: I18nManager.getConstants().isRTL
65
+ ? [-rightOffset, 0, leftLabelOffset]
66
+ : [leftLabelOffset, 0, -rightOffset],
67
+ }),
68
+ },
69
+ ],
70
+ },
71
+ rightButtonStyle: {
72
+ opacity: progress.interpolate({
73
+ inputRange: [0.3, 1, 1.5],
74
+ outputRange: [0, 1, 0],
75
+ }),
76
+ },
77
+ titleStyle: {
78
+ opacity: progress.interpolate({
79
+ inputRange: [0, 0.4, 1, 1.5],
80
+ outputRange: [0, 0.1, 1, 0],
81
+ }),
82
+ transform: [
83
+ {
84
+ translateX: progress.interpolate({
85
+ inputRange: [0.5, 1, 2],
86
+ outputRange: I18nManager.getConstants().isRTL
87
+ ? [-titleLeftOffset, 0, rightOffset]
88
+ : [rightOffset, 0, -titleLeftOffset],
89
+ }),
90
+ },
91
+ ],
92
+ },
93
+ backgroundStyle: {
94
+ transform: [
95
+ {
96
+ translateX: progress.interpolate({
97
+ inputRange: [0, 1, 2],
98
+ outputRange: I18nManager.getConstants().isRTL
99
+ ? [-layouts.screen.width, 0, layouts.screen.width]
100
+ : [layouts.screen.width, 0, -layouts.screen.width],
101
+ }),
102
+ },
103
+ ],
104
+ },
105
+ };
106
+ }
107
+
108
+ /**
109
+ * Simple fade animation for the header elements.
110
+ */
111
+ export function forFade({
112
+ current,
113
+ next,
114
+ }: StackHeaderInterpolationProps): StackHeaderInterpolatedStyle {
115
+ const progress = add(
116
+ current.progress.interpolate({
117
+ inputRange: [0, 1],
118
+ outputRange: [0, 1],
119
+ extrapolate: 'clamp',
120
+ }),
121
+ next
122
+ ? next.progress.interpolate({
123
+ inputRange: [0, 1],
124
+ outputRange: [0, 1],
125
+ extrapolate: 'clamp',
126
+ })
127
+ : 0
128
+ );
129
+
130
+ const opacity = progress.interpolate({
131
+ inputRange: [0, 1, 2],
132
+ outputRange: [0, 1, 0],
133
+ });
134
+
135
+ return {
136
+ leftButtonStyle: { opacity },
137
+ rightButtonStyle: { opacity },
138
+ titleStyle: { opacity },
139
+ backgroundStyle: {
140
+ opacity: progress.interpolate({
141
+ inputRange: [0, 1, 1.9, 2],
142
+ outputRange: [0, 1, 1, 0],
143
+ }),
144
+ },
145
+ };
146
+ }
147
+
148
+ /**
149
+ * Simple translate animation to translate the header to left.
150
+ */
151
+ export function forSlideLeft({
152
+ current,
153
+ next,
154
+ layouts: { screen },
155
+ }: StackHeaderInterpolationProps): StackHeaderInterpolatedStyle {
156
+ const progress = add(
157
+ current.progress.interpolate({
158
+ inputRange: [0, 1],
159
+ outputRange: [0, 1],
160
+ extrapolate: 'clamp',
161
+ }),
162
+ next
163
+ ? next.progress.interpolate({
164
+ inputRange: [0, 1],
165
+ outputRange: [0, 1],
166
+ extrapolate: 'clamp',
167
+ })
168
+ : 0
169
+ );
170
+
171
+ const translateX = progress.interpolate({
172
+ inputRange: [0, 1, 2],
173
+ outputRange: I18nManager.getConstants().isRTL
174
+ ? [-screen.width, 0, screen.width]
175
+ : [screen.width, 0, -screen.width],
176
+ });
177
+
178
+ const transform = [{ translateX }];
179
+
180
+ return {
181
+ leftButtonStyle: { transform },
182
+ rightButtonStyle: { transform },
183
+ titleStyle: { transform },
184
+ backgroundStyle: { transform },
185
+ };
186
+ }
187
+
188
+ /**
189
+ * Simple translate animation to translate the header to right.
190
+ */
191
+ export function forSlideRight({
192
+ current,
193
+ next,
194
+ layouts: { screen },
195
+ }: StackHeaderInterpolationProps): StackHeaderInterpolatedStyle {
196
+ const progress = add(
197
+ current.progress.interpolate({
198
+ inputRange: [0, 1],
199
+ outputRange: [0, 1],
200
+ extrapolate: 'clamp',
201
+ }),
202
+ next
203
+ ? next.progress.interpolate({
204
+ inputRange: [0, 1],
205
+ outputRange: [0, 1],
206
+ extrapolate: 'clamp',
207
+ })
208
+ : 0
209
+ );
210
+
211
+ const translateX = progress.interpolate({
212
+ inputRange: [0, 1, 2],
213
+ outputRange: I18nManager.getConstants().isRTL
214
+ ? [screen.width, 0, -screen.width]
215
+ : [-screen.width, 0, screen.width],
216
+ });
217
+
218
+ const transform = [{ translateX }];
219
+
220
+ return {
221
+ leftButtonStyle: { transform },
222
+ rightButtonStyle: { transform },
223
+ titleStyle: { transform },
224
+ backgroundStyle: { transform },
225
+ };
226
+ }
227
+
228
+ /**
229
+ * Simple translate animation to translate the header to slide up.
230
+ */
231
+ export function forSlideUp({
232
+ current,
233
+ next,
234
+ layouts: { header },
235
+ }: StackHeaderInterpolationProps): StackHeaderInterpolatedStyle {
236
+ const progress = add(
237
+ current.progress.interpolate({
238
+ inputRange: [0, 1],
239
+ outputRange: [0, 1],
240
+ extrapolate: 'clamp',
241
+ }),
242
+ next
243
+ ? next.progress.interpolate({
244
+ inputRange: [0, 1],
245
+ outputRange: [0, 1],
246
+ extrapolate: 'clamp',
247
+ })
248
+ : 0
249
+ );
250
+
251
+ const translateY = progress.interpolate({
252
+ inputRange: [0, 1, 2],
253
+ outputRange: [-header.height, 0, -header.height],
254
+ });
255
+
256
+ const transform = [{ translateY }];
257
+
258
+ return {
259
+ leftButtonStyle: { transform },
260
+ rightButtonStyle: { transform },
261
+ titleStyle: { transform },
262
+ backgroundStyle: { transform },
263
+ };
264
+ }
265
+
266
+ export function forNoAnimation(): StackHeaderInterpolatedStyle {
267
+ return {};
268
+ }