@amazon-devices/react-navigation__stack 7.0.1759135970 → 8.0.9000000000-rn-83

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 (275) hide show
  1. package/SystemBundles/03e0ad8b8bcf16e659904adab730cbe9c1832c4a36017809f129fea7fb07b4fc.bundle +13453 -0
  2. package/SystemBundles/03e0ad8b8bcf16e659904adab730cbe9c1832c4a36017809f129fea7fb07b4fc.map +4627 -0
  3. package/SystemModules/amzn__react-navigation__stack-8.modules.txt +32 -0
  4. package/SystemModules/amzn__react-navigation__stack-8.private.modules.txt +91 -0
  5. package/SystemModules/keplerscript-system-bundle-config.json +4 -4
  6. package/kepler-compatibility.json +2 -2
  7. package/lib/module/TransitionConfigs/CardStyleInterpolators.js +57 -1
  8. package/lib/module/TransitionConfigs/CardStyleInterpolators.js.map +1 -1
  9. package/lib/module/TransitionConfigs/HeaderStyleInterpolators.js +30 -16
  10. package/lib/module/TransitionConfigs/HeaderStyleInterpolators.js.map +1 -1
  11. package/lib/module/TransitionConfigs/TransitionPresets.js +32 -4
  12. package/lib/module/TransitionConfigs/TransitionPresets.js.map +1 -1
  13. package/lib/module/TransitionConfigs/TransitionSpecs.js +32 -2
  14. package/lib/module/TransitionConfigs/TransitionSpecs.js.map +1 -1
  15. package/lib/module/index.js +13 -11
  16. package/lib/module/index.js.map +1 -1
  17. package/lib/module/navigators/createStackNavigator.js +46 -48
  18. package/lib/module/navigators/createStackNavigator.js.map +1 -1
  19. package/lib/module/package.json +1 -0
  20. package/lib/module/types.js +2 -0
  21. package/lib/module/types.js.map +1 -1
  22. package/lib/module/utils/CardAnimationContext.js +3 -1
  23. package/lib/module/utils/CardAnimationContext.js.map +1 -1
  24. package/lib/module/utils/GestureHandlerRefContext.js +3 -1
  25. package/lib/module/utils/GestureHandlerRefContext.js.map +1 -1
  26. package/lib/module/utils/ModalPresentationContext.js +3 -2
  27. package/lib/module/utils/ModalPresentationContext.js.map +1 -1
  28. package/lib/module/utils/conditional.js +3 -1
  29. package/lib/module/utils/conditional.js.map +1 -1
  30. package/lib/module/utils/findLastIndex.js +4 -2
  31. package/lib/module/utils/findLastIndex.js.map +1 -1
  32. package/lib/module/utils/gestureActivationCriteria.js +60 -0
  33. package/lib/module/utils/gestureActivationCriteria.js.map +1 -0
  34. package/lib/module/utils/getDistanceForDirection.js +5 -3
  35. package/lib/module/utils/getDistanceForDirection.js.map +1 -1
  36. package/lib/module/utils/getInvertedMultiplier.js +5 -4
  37. package/lib/module/utils/getInvertedMultiplier.js.map +1 -1
  38. package/lib/module/utils/getModalRoutesKeys.js +12 -0
  39. package/lib/module/utils/getModalRoutesKeys.js.map +1 -0
  40. package/lib/module/utils/getShadowStyle.js +24 -0
  41. package/lib/module/utils/getShadowStyle.js.map +1 -0
  42. package/lib/module/utils/{debounce.js → throttle.js} +5 -4
  43. package/lib/module/utils/throttle.js.map +1 -0
  44. package/lib/module/utils/useCardAnimation.js +4 -2
  45. package/lib/module/utils/useCardAnimation.js.map +1 -1
  46. package/lib/module/utils/useGestureHandlerRef.js +5 -3
  47. package/lib/module/utils/useGestureHandlerRef.js.map +1 -1
  48. package/lib/module/utils/useKeyboardManager.js +8 -6
  49. package/lib/module/utils/useKeyboardManager.js.map +1 -1
  50. package/lib/module/views/GestureHandler.android.js +3 -1
  51. package/lib/module/views/GestureHandler.android.js.map +1 -1
  52. package/lib/module/views/GestureHandler.ios.js +3 -1
  53. package/lib/module/views/GestureHandler.ios.js.map +1 -1
  54. package/lib/module/views/GestureHandler.js +6 -1
  55. package/lib/module/views/GestureHandler.js.map +1 -1
  56. package/lib/module/views/GestureHandler.kepler.js +4 -0
  57. package/lib/module/views/GestureHandler.kepler.js.map +1 -0
  58. package/lib/module/views/GestureHandlerNative.js +13 -9
  59. package/lib/module/views/GestureHandlerNative.js.map +1 -1
  60. package/lib/module/views/Header/Header.js +12 -8
  61. package/lib/module/views/Header/Header.js.map +1 -1
  62. package/lib/module/views/Header/HeaderContainer.js +103 -93
  63. package/lib/module/views/Header/HeaderContainer.js.map +1 -1
  64. package/lib/module/views/Header/HeaderSegment.js +43 -31
  65. package/lib/module/views/Header/HeaderSegment.js.map +1 -1
  66. package/lib/module/views/Screens.js +17 -9
  67. package/lib/module/views/Screens.js.map +1 -1
  68. package/lib/module/views/Stack/Card.js +313 -338
  69. package/lib/module/views/Stack/Card.js.map +1 -1
  70. package/lib/module/views/Stack/CardA11yWrapper.js +43 -0
  71. package/lib/module/views/Stack/CardA11yWrapper.js.map +1 -0
  72. package/lib/module/views/Stack/CardContainer.js +116 -90
  73. package/lib/module/views/Stack/CardContainer.js.map +1 -1
  74. package/lib/module/views/Stack/CardContent.js +74 -0
  75. package/lib/module/views/Stack/CardContent.js.map +1 -0
  76. package/lib/module/views/Stack/CardStack.js +246 -180
  77. package/lib/module/views/Stack/CardStack.js.map +1 -1
  78. package/lib/module/views/Stack/StackView.js +80 -64
  79. package/lib/module/views/Stack/StackView.js.map +1 -1
  80. package/lib/typescript/package.json +1 -0
  81. package/lib/typescript/src/TransitionConfigs/CardStyleInterpolators.d.ts +8 -0
  82. package/lib/typescript/src/TransitionConfigs/CardStyleInterpolators.d.ts.map +1 -1
  83. package/lib/typescript/src/TransitionConfigs/HeaderStyleInterpolators.d.ts +3 -3
  84. package/lib/typescript/src/TransitionConfigs/HeaderStyleInterpolators.d.ts.map +1 -1
  85. package/lib/typescript/src/TransitionConfigs/TransitionPresets.d.ts +8 -0
  86. package/lib/typescript/src/TransitionConfigs/TransitionPresets.d.ts.map +1 -1
  87. package/lib/typescript/src/TransitionConfigs/TransitionSpecs.d.ts +10 -0
  88. package/lib/typescript/src/TransitionConfigs/TransitionSpecs.d.ts.map +1 -1
  89. package/lib/typescript/src/index.d.ts +8 -8
  90. package/lib/typescript/src/index.d.ts.map +1 -1
  91. package/lib/typescript/src/navigators/createStackNavigator.d.ts +15 -7
  92. package/lib/typescript/src/navigators/createStackNavigator.d.ts.map +1 -1
  93. package/lib/typescript/src/types.d.ts +84 -24
  94. package/lib/typescript/src/types.d.ts.map +1 -1
  95. package/lib/typescript/src/utils/CardAnimationContext.d.ts +1 -2
  96. package/lib/typescript/src/utils/CardAnimationContext.d.ts.map +1 -1
  97. package/lib/typescript/src/utils/GestureHandlerRefContext.d.ts +1 -2
  98. package/lib/typescript/src/utils/GestureHandlerRefContext.d.ts.map +1 -1
  99. package/lib/typescript/src/utils/ModalPresentationContext.d.ts +1 -2
  100. package/lib/typescript/src/utils/ModalPresentationContext.d.ts.map +1 -1
  101. package/lib/typescript/src/utils/conditional.d.ts +1 -1
  102. package/lib/typescript/src/utils/conditional.d.ts.map +1 -1
  103. package/lib/typescript/src/utils/findLastIndex.d.ts +1 -1
  104. package/lib/typescript/src/utils/findLastIndex.d.ts.map +1 -1
  105. package/lib/typescript/src/utils/gestureActivationCriteria.d.ts +57 -0
  106. package/lib/typescript/src/utils/gestureActivationCriteria.d.ts.map +1 -0
  107. package/lib/typescript/src/utils/getDistanceForDirection.d.ts +1 -1
  108. package/lib/typescript/src/utils/getDistanceForDirection.d.ts.map +1 -1
  109. package/lib/typescript/src/utils/getInvertedMultiplier.d.ts +1 -1
  110. package/lib/typescript/src/utils/getInvertedMultiplier.d.ts.map +1 -1
  111. package/lib/typescript/src/utils/getModalRoutesKeys.d.ts +4 -0
  112. package/lib/typescript/src/utils/getModalRoutesKeys.d.ts.map +1 -0
  113. package/lib/typescript/src/utils/getShadowStyle.d.ts +27 -0
  114. package/lib/typescript/src/utils/getShadowStyle.d.ts.map +1 -0
  115. package/lib/typescript/src/utils/throttle.d.ts +2 -0
  116. package/lib/typescript/src/utils/throttle.d.ts.map +1 -0
  117. package/lib/typescript/src/utils/useCardAnimation.d.ts +1 -1
  118. package/lib/typescript/src/utils/useCardAnimation.d.ts.map +1 -1
  119. package/lib/typescript/src/utils/useGestureHandlerRef.d.ts +1 -1
  120. package/lib/typescript/src/utils/useGestureHandlerRef.d.ts.map +1 -1
  121. package/lib/typescript/src/utils/useKeyboardManager.d.ts +1 -1
  122. package/lib/typescript/src/utils/useKeyboardManager.d.ts.map +1 -1
  123. package/lib/typescript/src/views/GestureHandler.d.ts +3 -2
  124. package/lib/typescript/src/views/GestureHandler.d.ts.map +1 -1
  125. package/lib/typescript/src/views/GestureHandler.kepler.d.ts +2 -0
  126. package/lib/typescript/src/views/GestureHandler.kepler.d.ts.map +1 -0
  127. package/lib/typescript/src/views/GestureHandlerNative.d.ts +4 -5
  128. package/lib/typescript/src/views/GestureHandlerNative.d.ts.map +1 -1
  129. package/lib/typescript/src/views/Header/Header.d.ts +1 -2
  130. package/lib/typescript/src/views/Header/Header.d.ts.map +1 -1
  131. package/lib/typescript/src/views/Header/HeaderContainer.d.ts +4 -5
  132. package/lib/typescript/src/views/Header/HeaderContainer.d.ts.map +1 -1
  133. package/lib/typescript/src/views/Header/HeaderSegment.d.ts +2 -2
  134. package/lib/typescript/src/views/Header/HeaderSegment.d.ts.map +1 -1
  135. package/lib/typescript/src/views/Screens.d.ts +7 -5
  136. package/lib/typescript/src/views/Screens.d.ts.map +1 -1
  137. package/lib/typescript/src/views/Stack/Card.d.ts +14 -42
  138. package/lib/typescript/src/views/Stack/Card.d.ts.map +1 -1
  139. package/lib/typescript/src/views/Stack/CardA11yWrapper.d.ts +15 -0
  140. package/lib/typescript/src/views/Stack/CardA11yWrapper.d.ts.map +1 -0
  141. package/lib/typescript/src/views/Stack/CardContainer.d.ts +6 -8
  142. package/lib/typescript/src/views/Stack/CardContainer.d.ts.map +1 -1
  143. package/lib/typescript/src/views/Stack/CardContent.d.ts +13 -0
  144. package/lib/typescript/src/views/Stack/CardContent.d.ts.map +1 -0
  145. package/lib/typescript/src/views/Stack/CardStack.d.ts +8 -7
  146. package/lib/typescript/src/views/Stack/CardStack.d.ts.map +1 -1
  147. package/lib/typescript/src/views/Stack/StackView.d.ts +10 -81
  148. package/lib/typescript/src/views/Stack/StackView.d.ts.map +1 -1
  149. package/oss-attribution/attribution.txt +76 -0
  150. package/oss-attribution/licenseInfos.json +27 -0
  151. package/package.json +105 -1
  152. package/src/TransitionConfigs/CardStyleInterpolators.tsx +72 -6
  153. package/src/TransitionConfigs/HeaderStyleInterpolators.tsx +43 -25
  154. package/src/TransitionConfigs/TransitionPresets.tsx +35 -5
  155. package/src/TransitionConfigs/TransitionSpecs.tsx +30 -2
  156. package/src/index.tsx +12 -7
  157. package/src/navigators/createStackNavigator.tsx +47 -63
  158. package/src/types.tsx +116 -24
  159. package/src/utils/CardAnimationContext.tsx +3 -3
  160. package/src/utils/GestureHandlerRefContext.tsx +2 -2
  161. package/src/utils/ModalPresentationContext.tsx +1 -3
  162. package/src/utils/conditional.tsx +1 -1
  163. package/src/utils/findLastIndex.tsx +2 -5
  164. package/src/utils/gestureActivationCriteria.tsx +70 -0
  165. package/src/utils/getDistanceForDirection.tsx +5 -4
  166. package/src/utils/getInvertedMultiplier.tsx +5 -6
  167. package/src/utils/getModalRoutesKeys.ts +21 -0
  168. package/src/utils/getShadowStyle.tsx +37 -0
  169. package/src/utils/throttle.tsx +16 -0
  170. package/src/utils/useCardAnimation.tsx +2 -2
  171. package/src/utils/useGestureHandlerRef.tsx +3 -3
  172. package/src/utils/useKeyboardManager.tsx +5 -7
  173. package/src/views/GestureHandler.kepler.tsx +1 -0
  174. package/src/views/GestureHandler.tsx +2 -2
  175. package/src/views/GestureHandlerNative.tsx +5 -5
  176. package/src/views/Header/Header.tsx +8 -7
  177. package/src/views/Header/HeaderContainer.tsx +23 -18
  178. package/src/views/Header/HeaderSegment.tsx +41 -43
  179. package/src/views/Screens.tsx +4 -2
  180. package/src/views/Stack/Card.tsx +480 -462
  181. package/src/views/Stack/CardA11yWrapper.tsx +67 -0
  182. package/src/views/Stack/CardContainer.tsx +127 -108
  183. package/src/views/Stack/CardContent.tsx +92 -0
  184. package/src/views/Stack/CardStack.tsx +375 -243
  185. package/src/views/Stack/StackView.tsx +73 -62
  186. package/SystemBundles/b598f9dfffcd611d6cd7d6a3c5ab3d66234659a03b40b6579fddb628e61b8313.bundle +0 -28538
  187. package/SystemBundles/b598f9dfffcd611d6cd7d6a3c5ab3d66234659a03b40b6579fddb628e61b8313.map +0 -1
  188. package/SystemModules/amzn__react-navigation__stack-7.modules.txt +0 -95
  189. package/SystemModules/amzn__react-navigation__stack-7.private.modules.txt +0 -185
  190. package/THIRD_PARTY_NOTICES.txt +0 -24
  191. package/lib/commonjs/TransitionConfigs/CardStyleInterpolators.js +0 -353
  192. package/lib/commonjs/TransitionConfigs/CardStyleInterpolators.js.map +0 -1
  193. package/lib/commonjs/TransitionConfigs/HeaderStyleInterpolators.js +0 -259
  194. package/lib/commonjs/TransitionConfigs/HeaderStyleInterpolators.js.map +0 -1
  195. package/lib/commonjs/TransitionConfigs/TransitionPresets.js +0 -134
  196. package/lib/commonjs/TransitionConfigs/TransitionPresets.js.map +0 -1
  197. package/lib/commonjs/TransitionConfigs/TransitionSpecs.js +0 -100
  198. package/lib/commonjs/TransitionConfigs/TransitionSpecs.js.map +0 -1
  199. package/lib/commonjs/index.js +0 -69
  200. package/lib/commonjs/index.js.map +0 -1
  201. package/lib/commonjs/navigators/createStackNavigator.js +0 -82
  202. package/lib/commonjs/navigators/createStackNavigator.js.map +0 -1
  203. package/lib/commonjs/types.js +0 -6
  204. package/lib/commonjs/types.js.map +0 -1
  205. package/lib/commonjs/utils/CardAnimationContext.js +0 -11
  206. package/lib/commonjs/utils/CardAnimationContext.js.map +0 -1
  207. package/lib/commonjs/utils/GestureHandlerRefContext.js +0 -11
  208. package/lib/commonjs/utils/GestureHandlerRefContext.js.map +0 -1
  209. package/lib/commonjs/utils/ModalPresentationContext.js +0 -12
  210. package/lib/commonjs/utils/ModalPresentationContext.js.map +0 -1
  211. package/lib/commonjs/utils/conditional.js +0 -32
  212. package/lib/commonjs/utils/conditional.js.map +0 -1
  213. package/lib/commonjs/utils/debounce.js +0 -19
  214. package/lib/commonjs/utils/debounce.js.map +0 -1
  215. package/lib/commonjs/utils/findLastIndex.js +0 -15
  216. package/lib/commonjs/utils/findLastIndex.js.map +0 -1
  217. package/lib/commonjs/utils/getDistanceForDirection.js +0 -20
  218. package/lib/commonjs/utils/getDistanceForDirection.js.map +0 -1
  219. package/lib/commonjs/utils/getInvertedMultiplier.js +0 -20
  220. package/lib/commonjs/utils/getInvertedMultiplier.js.map +0 -1
  221. package/lib/commonjs/utils/memoize.js +0 -33
  222. package/lib/commonjs/utils/memoize.js.map +0 -1
  223. package/lib/commonjs/utils/useCardAnimation.js +0 -19
  224. package/lib/commonjs/utils/useCardAnimation.js.map +0 -1
  225. package/lib/commonjs/utils/useGestureHandlerRef.js +0 -19
  226. package/lib/commonjs/utils/useGestureHandlerRef.js.map +0 -1
  227. package/lib/commonjs/utils/useKeyboardManager.js +0 -96
  228. package/lib/commonjs/utils/useKeyboardManager.js.map +0 -1
  229. package/lib/commonjs/views/GestureHandler.android.js +0 -17
  230. package/lib/commonjs/views/GestureHandler.android.js.map +0 -1
  231. package/lib/commonjs/views/GestureHandler.ios.js +0 -17
  232. package/lib/commonjs/views/GestureHandler.ios.js.map +0 -1
  233. package/lib/commonjs/views/GestureHandler.js +0 -24
  234. package/lib/commonjs/views/GestureHandler.js.map +0 -1
  235. package/lib/commonjs/views/GestureHandlerNative.js +0 -34
  236. package/lib/commonjs/views/GestureHandlerNative.js.map +0 -1
  237. package/lib/commonjs/views/Header/Header.js +0 -61
  238. package/lib/commonjs/views/Header/Header.js.map +0 -1
  239. package/lib/commonjs/views/Header/HeaderContainer.js +0 -127
  240. package/lib/commonjs/views/Header/HeaderContainer.js.map +0 -1
  241. package/lib/commonjs/views/Header/HeaderSegment.js +0 -139
  242. package/lib/commonjs/views/Header/HeaderSegment.js.map +0 -1
  243. package/lib/commonjs/views/ModalStatusBarManager.js +0 -42
  244. package/lib/commonjs/views/ModalStatusBarManager.js.map +0 -1
  245. package/lib/commonjs/views/Screens.js +0 -44
  246. package/lib/commonjs/views/Screens.js.map +0 -1
  247. package/lib/commonjs/views/Stack/Card.js +0 -469
  248. package/lib/commonjs/views/Stack/Card.js.map +0 -1
  249. package/lib/commonjs/views/Stack/CardContainer.js +0 -259
  250. package/lib/commonjs/views/Stack/CardContainer.js.map +0 -1
  251. package/lib/commonjs/views/Stack/CardSheet.js +0 -54
  252. package/lib/commonjs/views/Stack/CardSheet.js.map +0 -1
  253. package/lib/commonjs/views/Stack/CardStack.js +0 -442
  254. package/lib/commonjs/views/Stack/CardStack.js.map +0 -1
  255. package/lib/commonjs/views/Stack/StackView.js +0 -333
  256. package/lib/commonjs/views/Stack/StackView.js.map +0 -1
  257. package/lib/module/utils/debounce.js.map +0 -1
  258. package/lib/module/utils/memoize.js +0 -27
  259. package/lib/module/utils/memoize.js.map +0 -1
  260. package/lib/module/views/ModalStatusBarManager.js +0 -34
  261. package/lib/module/views/ModalStatusBarManager.js.map +0 -1
  262. package/lib/module/views/Stack/CardSheet.js +0 -46
  263. package/lib/module/views/Stack/CardSheet.js.map +0 -1
  264. package/lib/typescript/src/utils/debounce.d.ts +0 -2
  265. package/lib/typescript/src/utils/debounce.d.ts.map +0 -1
  266. package/lib/typescript/src/utils/memoize.d.ts +0 -2
  267. package/lib/typescript/src/utils/memoize.d.ts.map +0 -1
  268. package/lib/typescript/src/views/ModalStatusBarManager.d.ts +0 -12
  269. package/lib/typescript/src/views/ModalStatusBarManager.d.ts.map +0 -1
  270. package/lib/typescript/src/views/Stack/CardSheet.d.ts +0 -15
  271. package/lib/typescript/src/views/Stack/CardSheet.d.ts.map +0 -1
  272. package/src/utils/debounce.tsx +0 -17
  273. package/src/utils/memoize.tsx +0 -33
  274. package/src/views/ModalStatusBarManager.tsx +0 -50
  275. package/src/views/Stack/CardSheet.tsx +0 -61
@@ -0,0 +1,67 @@
1
+ import * as React from 'react';
2
+ import { Platform, StyleSheet, View } from 'react-native';
3
+
4
+ type Props = {
5
+ focused: boolean;
6
+ active: boolean;
7
+ animated: boolean;
8
+ isNextScreenTransparent: boolean;
9
+ detachCurrentScreen: boolean;
10
+ children: React.ReactNode;
11
+ };
12
+
13
+ export type CardA11yWrapperRef = { setInert: (value: boolean) => void };
14
+
15
+ export const CardA11yWrapper = React.forwardRef(
16
+ (
17
+ {
18
+ focused,
19
+ active,
20
+ animated,
21
+ isNextScreenTransparent,
22
+ detachCurrentScreen,
23
+ children,
24
+ }: Props,
25
+ ref: React.Ref<CardA11yWrapperRef>
26
+ ) => {
27
+ // Manage this in separate component to avoid re-rendering card during gestures
28
+ // Otherwise the gesture animation will be interrupted as state hasn't updated yet
29
+ const [inert, setInert] = React.useState(false);
30
+
31
+ React.useImperativeHandle(ref, () => ({ setInert }), []);
32
+
33
+ const isHidden =
34
+ !animated &&
35
+ isNextScreenTransparent === false &&
36
+ detachCurrentScreen !== false &&
37
+ !focused;
38
+
39
+ return (
40
+ <View
41
+ aria-hidden={!focused}
42
+ pointerEvents={(animated ? inert : !focused) ? 'none' : 'box-none'}
43
+ style={[
44
+ StyleSheet.absoluteFill,
45
+ {
46
+ // This is necessary to avoid unfocused larger pages increasing scroll area
47
+ // The issue can be seen on the web when a smaller screen is pushed over a larger one
48
+ overflow: active ? undefined : 'hidden',
49
+ // We use visibility on web
50
+ display: Platform.OS !== 'web' && isHidden ? 'none' : 'flex',
51
+ // Hide unfocused screens when animation isn't enabled
52
+ // This is also necessary for a11y on web
53
+ // @ts-expect-error visibility is only available on web
54
+ visibility: isHidden ? 'hidden' : 'visible',
55
+ },
56
+ ]}
57
+ // Make sure this view is not removed on the new architecture, as it causes focus loss during navigation on Android.
58
+ // This can happen when the view flattening results in different trees - due to `overflow` style changing in a parent.
59
+ collapsable={false}
60
+ >
61
+ {children}
62
+ </View>
63
+ );
64
+ }
65
+ );
66
+
67
+ CardA11yWrapper.displayName = 'CardA11yWrapper';
@@ -4,27 +4,34 @@ import {
4
4
  HeaderHeightContext,
5
5
  HeaderShownContext,
6
6
  } from '@amazon-devices/react-navigation__elements';
7
- import { Route, useTheme } from '@amazon-devices/react-navigation__native';
7
+ import {
8
+ type Route,
9
+ useLinkBuilder,
10
+ useLocale,
11
+ useTheme,
12
+ } from '@amazon-devices/react-navigation__native';
8
13
  import * as React from 'react';
9
14
  import { Animated, Platform, StyleSheet, View } from 'react-native';
10
15
 
11
16
  import type { Layout, Scene } from '../../types';
12
- import ModalPresentationContext from '../../utils/ModalPresentationContext';
13
- import useKeyboardManager from '../../utils/useKeyboardManager';
17
+ import { ModalPresentationContext } from '../../utils/ModalPresentationContext';
18
+ import { useKeyboardManager } from '../../utils/useKeyboardManager';
14
19
  import type { Props as HeaderContainerProps } from '../Header/HeaderContainer';
15
- import Card from './Card';
20
+ import { Card } from './Card';
21
+ import { CardA11yWrapper, type CardA11yWrapperRef } from './CardA11yWrapper';
16
22
 
17
23
  type Props = {
18
24
  interpolationIndex: number;
19
25
  index: number;
20
26
  active: boolean;
21
27
  focused: boolean;
28
+ opening: boolean;
22
29
  closing: boolean;
23
30
  modal: boolean;
24
31
  layout: Layout;
25
32
  gesture: Animated.Value;
33
+ preloaded: boolean;
26
34
  scene: Scene;
27
- headerDarkContent: boolean | undefined;
28
35
  safeAreaInsetTop: number;
29
36
  safeAreaInsetRight: number;
30
37
  safeAreaInsetBottom: number;
@@ -32,7 +39,6 @@ type Props = {
32
39
  getPreviousScene: (props: { route: Route<string> }) => Scene | undefined;
33
40
  getFocusedRoute: () => Route<string>;
34
41
  renderHeader: (props: HeaderContainerProps) => React.ReactNode;
35
- renderScene: (props: { route: Route<string> }) => React.ReactNode;
36
42
  onOpenRoute: (props: { route: Route<string> }) => void;
37
43
  onCloseRoute: (props: { route: Route<string> }) => void;
38
44
  onTransitionStart: (
@@ -56,17 +62,17 @@ type Props = {
56
62
 
57
63
  const EPSILON = 0.1;
58
64
 
59
- function CardContainer({
65
+ function CardContainerInner({
60
66
  interpolationIndex,
61
67
  index,
62
68
  active,
69
+ opening,
63
70
  closing,
64
71
  gesture,
65
72
  focused,
66
73
  modal,
67
74
  getPreviousScene,
68
75
  getFocusedRoute,
69
- headerDarkContent,
70
76
  hasAbsoluteFloatHeader,
71
77
  headerHeight,
72
78
  onHeaderHeightChange,
@@ -81,14 +87,18 @@ function CardContainer({
81
87
  onGestureStart,
82
88
  onTransitionEnd,
83
89
  onTransitionStart,
90
+ preloaded,
84
91
  renderHeader,
85
- renderScene,
86
92
  safeAreaInsetBottom,
87
93
  safeAreaInsetLeft,
88
94
  safeAreaInsetRight,
89
95
  safeAreaInsetTop,
90
96
  scene,
91
97
  }: Props) {
98
+ const wrapperRef = React.useRef<CardA11yWrapperRef>(null);
99
+
100
+ const { direction } = useLocale();
101
+
92
102
  const parentHeaderHeight = React.useContext(HeaderHeightContext);
93
103
 
94
104
  const { onPageChangeStart, onPageChangeCancel, onPageChangeConfirm } =
@@ -143,6 +153,8 @@ function CardContainer({
143
153
  closing: boolean;
144
154
  gesture: boolean;
145
155
  }) => {
156
+ wrapperRef.current?.setInert(closing);
157
+
146
158
  const { route } = scene.descriptor;
147
159
 
148
160
  if (!gesture) {
@@ -165,14 +177,10 @@ function CardContainer({
165
177
 
166
178
  const { colors } = useTheme();
167
179
 
168
- const [pointerEvents, setPointerEvents] = React.useState<'box-none' | 'none'>(
169
- 'box-none'
170
- );
171
-
172
180
  React.useEffect(() => {
173
181
  const listener = scene.progress.next?.addListener?.(
174
182
  ({ value }: { value: number }) => {
175
- setPointerEvents(value <= EPSILON ? 'box-none' : 'none');
183
+ wrapperRef.current?.setInert(value > EPSILON);
176
184
  }
177
185
  );
178
186
 
@@ -181,11 +189,11 @@ function CardContainer({
181
189
  scene.progress.next?.removeListener?.(listener);
182
190
  }
183
191
  };
184
- }, [pointerEvents, scene.progress.next]);
192
+ }, [scene.progress.next]);
185
193
 
186
194
  const {
187
195
  presentation,
188
- animationEnabled,
196
+ animation,
189
197
  cardOverlay,
190
198
  cardOverlayEnabled,
191
199
  cardShadowEnabled,
@@ -200,119 +208,130 @@ function CardContainer({
200
208
  transitionSpec,
201
209
  } = scene.descriptor.options;
202
210
 
211
+ const { buildHref } = useLinkBuilder();
203
212
  const previousScene = getPreviousScene({ route: scene.descriptor.route });
204
213
 
205
214
  let backTitle: string | undefined;
215
+ let href: string | undefined;
206
216
 
207
217
  if (previousScene) {
208
218
  const { options, route } = previousScene.descriptor;
209
219
 
210
220
  backTitle = getHeaderTitle(options, route.name);
221
+ href = buildHref(route.name, route.params);
211
222
  }
212
223
 
213
- const headerBack = React.useMemo(
214
- () => (backTitle !== undefined ? { title: backTitle } : undefined),
215
- [backTitle]
216
- );
224
+ const canGoBack = previousScene != null;
225
+ const headerBack = React.useMemo(() => {
226
+ if (canGoBack) {
227
+ return {
228
+ href,
229
+ title: backTitle,
230
+ };
231
+ }
232
+
233
+ return undefined;
234
+ }, [canGoBack, backTitle, href]);
235
+
236
+ const animated = animation !== 'none';
217
237
 
218
238
  return (
219
- <Card
220
- interpolationIndex={interpolationIndex}
221
- gestureDirection={gestureDirection}
222
- layout={layout}
223
- insets={insets}
224
- gesture={gesture}
225
- current={scene.progress.current}
226
- next={scene.progress.next}
227
- closing={closing}
228
- onOpen={handleOpen}
229
- onClose={handleClose}
230
- overlay={cardOverlay}
231
- overlayEnabled={cardOverlayEnabled}
232
- shadowEnabled={cardShadowEnabled}
233
- onTransition={handleTransition}
234
- onGestureBegin={handleGestureBegin}
235
- onGestureCanceled={handleGestureCanceled}
236
- onGestureEnd={handleGestureEnd}
237
- gestureEnabled={index === 0 ? false : gestureEnabled}
238
- gestureResponseDistance={gestureResponseDistance}
239
- gestureVelocityImpact={gestureVelocityImpact}
240
- transitionSpec={transitionSpec}
241
- styleInterpolator={cardStyleInterpolator}
242
- accessibilityElementsHidden={!focused}
243
- importantForAccessibility={focused ? 'auto' : 'no-hide-descendants'}
244
- pointerEvents={active ? 'box-none' : pointerEvents}
245
- pageOverflowEnabled={headerMode !== 'float' && presentation !== 'modal'}
246
- headerDarkContent={headerDarkContent}
247
- containerStyle={
248
- hasAbsoluteFloatHeader && headerMode !== 'screen'
249
- ? { marginTop: headerHeight }
250
- : null
251
- }
252
- contentStyle={[
253
- {
254
- backgroundColor:
255
- presentation === 'transparentModal'
256
- ? 'transparent'
257
- : colors.background,
258
- },
259
- cardStyle,
260
- ]}
261
- style={[
262
- {
263
- // This is necessary to avoid unfocused larger pages increasing scroll area
264
- // The issue can be seen on the web when a smaller screen is pushed over a larger one
265
- overflow: active ? undefined : 'hidden',
266
- display:
267
- // Hide unfocused screens when animation isn't enabled
268
- // This is also necessary for a11y on web
269
- animationEnabled === false &&
270
- isNextScreenTransparent === false &&
271
- detachCurrentScreen !== false &&
272
- !focused
273
- ? 'none'
274
- : 'flex',
275
- },
276
- StyleSheet.absoluteFill,
277
- ]}
239
+ <CardA11yWrapper
240
+ ref={wrapperRef}
241
+ focused={focused}
242
+ active={active}
243
+ animated={animated}
244
+ isNextScreenTransparent={isNextScreenTransparent}
245
+ detachCurrentScreen={detachCurrentScreen}
278
246
  >
279
- <View style={styles.container}>
280
- <ModalPresentationContext.Provider value={modal}>
281
- <View style={styles.scene}>
282
- <HeaderBackContext.Provider value={headerBack}>
283
- <HeaderShownContext.Provider
284
- value={isParentHeaderShown || headerShown !== false}
285
- >
286
- <HeaderHeightContext.Provider
287
- value={headerShown ? headerHeight : parentHeaderHeight ?? 0}
247
+ <Card
248
+ animated={animated}
249
+ interpolationIndex={interpolationIndex}
250
+ gestureDirection={gestureDirection}
251
+ layout={layout}
252
+ insets={insets}
253
+ direction={direction}
254
+ gesture={gesture}
255
+ current={scene.progress.current}
256
+ next={scene.progress.next}
257
+ opening={opening}
258
+ closing={closing}
259
+ onOpen={handleOpen}
260
+ onClose={handleClose}
261
+ overlay={cardOverlay}
262
+ overlayEnabled={cardOverlayEnabled}
263
+ shadowEnabled={cardShadowEnabled}
264
+ onTransition={handleTransition}
265
+ onGestureBegin={handleGestureBegin}
266
+ onGestureCanceled={handleGestureCanceled}
267
+ onGestureEnd={handleGestureEnd}
268
+ gestureEnabled={index === 0 ? false : gestureEnabled}
269
+ gestureResponseDistance={gestureResponseDistance}
270
+ gestureVelocityImpact={gestureVelocityImpact}
271
+ transitionSpec={transitionSpec}
272
+ styleInterpolator={cardStyleInterpolator}
273
+ pageOverflowEnabled={headerMode !== 'float' && presentation !== 'modal'}
274
+ preloaded={preloaded}
275
+ containerStyle={
276
+ hasAbsoluteFloatHeader && headerMode !== 'screen'
277
+ ? { marginTop: headerHeight }
278
+ : null
279
+ }
280
+ contentStyle={[
281
+ {
282
+ backgroundColor:
283
+ presentation === 'transparentModal'
284
+ ? 'transparent'
285
+ : colors.background,
286
+ },
287
+ cardStyle,
288
+ ]}
289
+ >
290
+ <View style={styles.container}>
291
+ <ModalPresentationContext.Provider value={modal}>
292
+ {headerMode !== 'float'
293
+ ? renderHeader({
294
+ mode: 'screen',
295
+ layout,
296
+ scenes: [previousScene, scene],
297
+ getPreviousScene,
298
+ getFocusedRoute,
299
+ onContentHeightChange: onHeaderHeightChange,
300
+ style: styles.header,
301
+ })
302
+ : null}
303
+ <View style={styles.scene}>
304
+ <HeaderBackContext.Provider value={headerBack}>
305
+ <HeaderShownContext.Provider
306
+ value={isParentHeaderShown || headerShown !== false}
288
307
  >
289
- {renderScene({ route: scene.descriptor.route })}
290
- </HeaderHeightContext.Provider>
291
- </HeaderShownContext.Provider>
292
- </HeaderBackContext.Provider>
293
- </View>
294
- {headerMode !== 'float'
295
- ? renderHeader({
296
- mode: 'screen',
297
- layout,
298
- scenes: [previousScene, scene],
299
- getPreviousScene,
300
- getFocusedRoute,
301
- onContentHeightChange: onHeaderHeightChange,
302
- })
303
- : null}
304
- </ModalPresentationContext.Provider>
305
- </View>
306
- </Card>
308
+ <HeaderHeightContext.Provider
309
+ value={
310
+ headerShown !== false
311
+ ? headerHeight
312
+ : (parentHeaderHeight ?? 0)
313
+ }
314
+ >
315
+ {scene.descriptor.render()}
316
+ </HeaderHeightContext.Provider>
317
+ </HeaderShownContext.Provider>
318
+ </HeaderBackContext.Provider>
319
+ </View>
320
+ </ModalPresentationContext.Provider>
321
+ </View>
322
+ </Card>
323
+ </CardA11yWrapper>
307
324
  );
308
325
  }
309
326
 
310
- export default React.memo(CardContainer);
327
+ export const CardContainer = React.memo(CardContainerInner);
311
328
 
312
329
  const styles = StyleSheet.create({
313
330
  container: {
314
331
  flex: 1,
315
- flexDirection: 'column-reverse',
332
+ },
333
+ header: {
334
+ zIndex: 1,
316
335
  },
317
336
  scene: {
318
337
  flex: 1,
@@ -0,0 +1,92 @@
1
+ import * as React from 'react';
2
+ import { StyleSheet, View, type ViewProps } from 'react-native';
3
+
4
+ type Props = ViewProps & {
5
+ enabled: boolean;
6
+ layout: { width: number; height: number };
7
+ children: React.ReactNode;
8
+ };
9
+
10
+ // This component will render a page which overflows the screen
11
+ // if the container fills the body by comparing the size
12
+ // This lets the document.body handle scrolling of the content
13
+ // It's necessary for mobile browsers to be able to hide address bar on scroll
14
+ export function CardContent({ enabled, layout, style, ...rest }: Props) {
15
+ const [fill, setFill] = React.useState(false);
16
+
17
+ React.useEffect(() => {
18
+ if (typeof document === 'undefined' || !document.body) {
19
+ // Only run when DOM is available
20
+ return;
21
+ }
22
+
23
+ const width = document.body.clientWidth;
24
+ const height = document.body.clientHeight;
25
+
26
+ // Workaround for mobile Chrome, necessary when a navigation happens
27
+ // when the address bar has already collapsed, which resulted in an
28
+ // empty space at the bottom of the page (matching the height of the
29
+ // address bar). To fix this, it's necessary to update the height of
30
+ // the DOM with the current height of the window.
31
+ // See https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
32
+ const isFullHeight = height === layout.height;
33
+ const id = '__react-navigation-stack-mobile-chrome-viewport-fix';
34
+
35
+ let unsubscribe: (() => void) | undefined;
36
+
37
+ if (isFullHeight && navigator.maxTouchPoints > 0) {
38
+ const style =
39
+ document.getElementById(id) ?? document.createElement('style');
40
+
41
+ style.id = id;
42
+
43
+ const updateStyle = () => {
44
+ const vh = window.innerHeight * 0.01;
45
+
46
+ style.textContent = [
47
+ `:root { --vh: ${vh}px; }`,
48
+ `body { height: calc(var(--vh, 1vh) * 100); }`,
49
+ ].join('\n');
50
+ };
51
+
52
+ updateStyle();
53
+
54
+ if (!document.head.contains(style)) {
55
+ document.head.appendChild(style);
56
+ }
57
+
58
+ window.addEventListener('resize', updateStyle);
59
+
60
+ unsubscribe = () => {
61
+ window.removeEventListener('resize', updateStyle);
62
+ };
63
+ } else {
64
+ // Remove the workaround if the stack does not occupy the whole
65
+ // height of the page
66
+ document.getElementById(id)?.remove();
67
+ }
68
+
69
+ // eslint-disable-next-line @eslint-react/hooks-extra/no-direct-set-state-in-use-effect
70
+ setFill(width === layout.width && height === layout.height);
71
+
72
+ return unsubscribe;
73
+ }, [layout.height, layout.width]);
74
+
75
+ return (
76
+ <View
77
+ {...rest}
78
+ pointerEvents="box-none"
79
+ style={[enabled && fill ? styles.page : styles.card, style]}
80
+ />
81
+ );
82
+ }
83
+
84
+ const styles = StyleSheet.create({
85
+ page: {
86
+ minHeight: '100%',
87
+ },
88
+ card: {
89
+ flex: 1,
90
+ overflow: 'hidden',
91
+ },
92
+ });