@amazon-devices/react-navigation__stack 8.0.9000000000 → 8.0.9000000002

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 (81) hide show
  1. package/SystemModules/amzn__react-navigation__stack-8.private.modules.txt +39 -34
  2. package/kepler-compatibility.json +4 -2
  3. package/lib/module/index.js +0 -34
  4. package/lib/typescript/src/index.d.ts +1 -1
  5. package/lib/typescript/src/index.d.ts.map +1 -1
  6. package/oss-attribution/attribution.txt +76 -0
  7. package/oss-attribution/licenseInfos.json +27 -0
  8. package/package.json +1 -1
  9. package/src/index.tsx +0 -55
  10. package/SystemBundles/98ca5eeb45684e3e5615c766e1d3a956fee53d14cd6c2318098c23c210bd76d7.bundle +0 -13464
  11. package/SystemBundles/98ca5eeb45684e3e5615c766e1d3a956fee53d14cd6c2318098c23c210bd76d7.map +0 -4638
  12. package/lib/module/TransitionConfigs/CardStyleInterpolators.js +0 -394
  13. package/lib/module/TransitionConfigs/HeaderStyleInterpolators.js +0 -262
  14. package/lib/module/TransitionConfigs/TransitionPresets.js +0 -156
  15. package/lib/module/TransitionConfigs/TransitionSpecs.js +0 -124
  16. package/lib/module/navigators/createStackNavigator.js +0 -71
  17. package/lib/module/types.js +0 -4
  18. package/lib/module/utils/CardAnimationContext.js +0 -5
  19. package/lib/module/utils/GestureHandlerRefContext.js +0 -5
  20. package/lib/module/utils/ModalPresentationContext.js +0 -5
  21. package/lib/module/utils/conditional.js +0 -28
  22. package/lib/module/utils/findLastIndex.js +0 -11
  23. package/lib/module/utils/gestureActivationCriteria.js +0 -60
  24. package/lib/module/utils/getDistanceForDirection.js +0 -15
  25. package/lib/module/utils/getInvertedMultiplier.js +0 -15
  26. package/lib/module/utils/getModalRoutesKeys.js +0 -12
  27. package/lib/module/utils/getShadowStyle.js +0 -24
  28. package/lib/module/utils/throttle.js +0 -14
  29. package/lib/module/utils/useCardAnimation.js +0 -12
  30. package/lib/module/utils/useGestureHandlerRef.js +0 -12
  31. package/lib/module/utils/useKeyboardManager.js +0 -90
  32. package/lib/module/views/GestureHandler.android.js +0 -4
  33. package/lib/module/views/GestureHandler.ios.js +0 -4
  34. package/lib/module/views/GestureHandler.js +0 -21
  35. package/lib/module/views/GestureHandler.kepler.js +0 -4
  36. package/lib/module/views/GestureHandlerNative.js +0 -18
  37. package/lib/module/views/Header/Header.js +0 -56
  38. package/lib/module/views/Header/HeaderContainer.js +0 -128
  39. package/lib/module/views/Header/HeaderSegment.js +0 -142
  40. package/lib/module/views/Screens.js +0 -42
  41. package/lib/module/views/Stack/Card.js +0 -433
  42. package/lib/module/views/Stack/CardA11yWrapper.js +0 -43
  43. package/lib/module/views/Stack/CardContainer.js +0 -276
  44. package/lib/module/views/Stack/CardContent.js +0 -74
  45. package/lib/module/views/Stack/CardStack.js +0 -493
  46. package/lib/module/views/Stack/StackView.js +0 -339
  47. package/src/TransitionConfigs/CardStyleInterpolators.tsx +0 -460
  48. package/src/TransitionConfigs/HeaderStyleInterpolators.tsx +0 -286
  49. package/src/TransitionConfigs/TransitionPresets.tsx +0 -182
  50. package/src/TransitionConfigs/TransitionSpecs.tsx +0 -124
  51. package/src/navigators/createStackNavigator.tsx +0 -120
  52. package/src/types.tsx +0 -639
  53. package/src/utils/CardAnimationContext.tsx +0 -7
  54. package/src/utils/GestureHandlerRefContext.tsx +0 -5
  55. package/src/utils/ModalPresentationContext.tsx +0 -3
  56. package/src/utils/conditional.tsx +0 -33
  57. package/src/utils/findLastIndex.tsx +0 -9
  58. package/src/utils/gestureActivationCriteria.tsx +0 -70
  59. package/src/utils/getDistanceForDirection.tsx +0 -19
  60. package/src/utils/getInvertedMultiplier.tsx +0 -17
  61. package/src/utils/getModalRoutesKeys.ts +0 -21
  62. package/src/utils/getShadowStyle.tsx +0 -37
  63. package/src/utils/throttle.tsx +0 -16
  64. package/src/utils/useCardAnimation.tsx +0 -15
  65. package/src/utils/useGestureHandlerRef.tsx +0 -15
  66. package/src/utils/useKeyboardManager.tsx +0 -103
  67. package/src/views/GestureHandler.android.tsx +0 -1
  68. package/src/views/GestureHandler.ios.tsx +0 -1
  69. package/src/views/GestureHandler.kepler.tsx +0 -1
  70. package/src/views/GestureHandler.tsx +0 -23
  71. package/src/views/GestureHandlerNative.tsx +0 -23
  72. package/src/views/Header/Header.tsx +0 -73
  73. package/src/views/Header/HeaderContainer.tsx +0 -191
  74. package/src/views/Header/HeaderSegment.tsx +0 -203
  75. package/src/views/Screens.tsx +0 -45
  76. package/src/views/Stack/Card.tsx +0 -646
  77. package/src/views/Stack/CardA11yWrapper.tsx +0 -67
  78. package/src/views/Stack/CardContainer.tsx +0 -339
  79. package/src/views/Stack/CardContent.tsx +0 -92
  80. package/src/views/Stack/CardStack.tsx +0 -844
  81. package/src/views/Stack/StackView.tsx +0 -485
@@ -1,339 +0,0 @@
1
- import {
2
- getHeaderTitle,
3
- HeaderBackContext,
4
- HeaderHeightContext,
5
- HeaderShownContext,
6
- } from '@amazon-devices/react-navigation__elements';
7
- import {
8
- type Route,
9
- useLinkBuilder,
10
- useLocale,
11
- useTheme,
12
- } from '@amazon-devices/react-navigation__native';
13
- import * as React from 'react';
14
- import { Animated, Platform, StyleSheet, View } from 'react-native';
15
-
16
- import type { Layout, Scene } from '../../types';
17
- import { ModalPresentationContext } from '../../utils/ModalPresentationContext';
18
- import { useKeyboardManager } from '../../utils/useKeyboardManager';
19
- import type { Props as HeaderContainerProps } from '../Header/HeaderContainer';
20
- import { Card } from './Card';
21
- import { CardA11yWrapper, type CardA11yWrapperRef } from './CardA11yWrapper';
22
-
23
- type Props = {
24
- interpolationIndex: number;
25
- index: number;
26
- active: boolean;
27
- focused: boolean;
28
- opening: boolean;
29
- closing: boolean;
30
- modal: boolean;
31
- layout: Layout;
32
- gesture: Animated.Value;
33
- preloaded: boolean;
34
- scene: Scene;
35
- safeAreaInsetTop: number;
36
- safeAreaInsetRight: number;
37
- safeAreaInsetBottom: number;
38
- safeAreaInsetLeft: number;
39
- getPreviousScene: (props: { route: Route<string> }) => Scene | undefined;
40
- getFocusedRoute: () => Route<string>;
41
- renderHeader: (props: HeaderContainerProps) => React.ReactNode;
42
- onOpenRoute: (props: { route: Route<string> }) => void;
43
- onCloseRoute: (props: { route: Route<string> }) => void;
44
- onTransitionStart: (
45
- props: { route: Route<string> },
46
- closing: boolean
47
- ) => void;
48
- onTransitionEnd: (props: { route: Route<string> }, closing: boolean) => void;
49
- onGestureStart: (props: { route: Route<string> }) => void;
50
- onGestureEnd: (props: { route: Route<string> }) => void;
51
- onGestureCancel: (props: { route: Route<string> }) => void;
52
- hasAbsoluteFloatHeader: boolean;
53
- headerHeight: number;
54
- onHeaderHeightChange: (props: {
55
- route: Route<string>;
56
- height: number;
57
- }) => void;
58
- isParentHeaderShown: boolean;
59
- isNextScreenTransparent: boolean;
60
- detachCurrentScreen: boolean;
61
- };
62
-
63
- const EPSILON = 0.1;
64
-
65
- function CardContainerInner({
66
- interpolationIndex,
67
- index,
68
- active,
69
- opening,
70
- closing,
71
- gesture,
72
- focused,
73
- modal,
74
- getPreviousScene,
75
- getFocusedRoute,
76
- hasAbsoluteFloatHeader,
77
- headerHeight,
78
- onHeaderHeightChange,
79
- isParentHeaderShown,
80
- isNextScreenTransparent,
81
- detachCurrentScreen,
82
- layout,
83
- onCloseRoute,
84
- onOpenRoute,
85
- onGestureCancel,
86
- onGestureEnd,
87
- onGestureStart,
88
- onTransitionEnd,
89
- onTransitionStart,
90
- preloaded,
91
- renderHeader,
92
- safeAreaInsetBottom,
93
- safeAreaInsetLeft,
94
- safeAreaInsetRight,
95
- safeAreaInsetTop,
96
- scene,
97
- }: Props) {
98
- const wrapperRef = React.useRef<CardA11yWrapperRef>(null);
99
-
100
- const { direction } = useLocale();
101
-
102
- const parentHeaderHeight = React.useContext(HeaderHeightContext);
103
-
104
- const { onPageChangeStart, onPageChangeCancel, onPageChangeConfirm } =
105
- useKeyboardManager(
106
- React.useCallback(() => {
107
- const { options, navigation } = scene.descriptor;
108
-
109
- return (
110
- navigation.isFocused() && options.keyboardHandlingEnabled !== false && Platform.OS as any !== 'kepler'
111
- );
112
- }, [scene.descriptor])
113
- );
114
-
115
- const handleOpen = () => {
116
- const { route } = scene.descriptor;
117
-
118
- onTransitionEnd({ route }, false);
119
- onOpenRoute({ route });
120
- };
121
-
122
- const handleClose = () => {
123
- const { route } = scene.descriptor;
124
-
125
- onTransitionEnd({ route }, true);
126
- onCloseRoute({ route });
127
- };
128
-
129
- const handleGestureBegin = () => {
130
- const { route } = scene.descriptor;
131
-
132
- onPageChangeStart();
133
- onGestureStart({ route });
134
- };
135
-
136
- const handleGestureCanceled = () => {
137
- const { route } = scene.descriptor;
138
-
139
- onPageChangeCancel();
140
- onGestureCancel({ route });
141
- };
142
-
143
- const handleGestureEnd = () => {
144
- const { route } = scene.descriptor;
145
-
146
- onGestureEnd({ route });
147
- };
148
-
149
- const handleTransition = ({
150
- closing,
151
- gesture,
152
- }: {
153
- closing: boolean;
154
- gesture: boolean;
155
- }) => {
156
- wrapperRef.current?.setInert(closing);
157
-
158
- const { route } = scene.descriptor;
159
-
160
- if (!gesture) {
161
- onPageChangeConfirm?.(true);
162
- } else if (active && closing) {
163
- onPageChangeConfirm?.(false);
164
- } else {
165
- onPageChangeCancel?.();
166
- }
167
-
168
- onTransitionStart?.({ route }, closing);
169
- };
170
-
171
- const insets = {
172
- top: safeAreaInsetTop,
173
- right: safeAreaInsetRight,
174
- bottom: safeAreaInsetBottom,
175
- left: safeAreaInsetLeft,
176
- };
177
-
178
- const { colors } = useTheme();
179
-
180
- React.useEffect(() => {
181
- const listener = scene.progress.next?.addListener?.(
182
- ({ value }: { value: number }) => {
183
- wrapperRef.current?.setInert(value > EPSILON);
184
- }
185
- );
186
-
187
- return () => {
188
- if (listener) {
189
- scene.progress.next?.removeListener?.(listener);
190
- }
191
- };
192
- }, [scene.progress.next]);
193
-
194
- const {
195
- presentation,
196
- animation,
197
- cardOverlay,
198
- cardOverlayEnabled,
199
- cardShadowEnabled,
200
- cardStyle,
201
- cardStyleInterpolator,
202
- gestureDirection,
203
- gestureEnabled,
204
- gestureResponseDistance,
205
- gestureVelocityImpact,
206
- headerMode,
207
- headerShown,
208
- transitionSpec,
209
- } = scene.descriptor.options;
210
-
211
- const { buildHref } = useLinkBuilder();
212
- const previousScene = getPreviousScene({ route: scene.descriptor.route });
213
-
214
- let backTitle: string | undefined;
215
- let href: string | undefined;
216
-
217
- if (previousScene) {
218
- const { options, route } = previousScene.descriptor;
219
-
220
- backTitle = getHeaderTitle(options, route.name);
221
- href = buildHref(route.name, route.params);
222
- }
223
-
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';
237
-
238
- return (
239
- <CardA11yWrapper
240
- ref={wrapperRef}
241
- focused={focused}
242
- active={active}
243
- animated={animated}
244
- isNextScreenTransparent={isNextScreenTransparent}
245
- detachCurrentScreen={detachCurrentScreen}
246
- >
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}
307
- >
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>
324
- );
325
- }
326
-
327
- export const CardContainer = React.memo(CardContainerInner);
328
-
329
- const styles = StyleSheet.create({
330
- container: {
331
- flex: 1,
332
- },
333
- header: {
334
- zIndex: 1,
335
- },
336
- scene: {
337
- flex: 1,
338
- },
339
- });
@@ -1,92 +0,0 @@
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
- });