@amazon-devices/react-navigation__stack 8.0.9000000001 → 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 (76) hide show
  1. package/kepler-compatibility.json +2 -1
  2. package/lib/module/index.js +0 -34
  3. package/lib/module/views/Stack/CardStack.js.map +1 -1
  4. package/lib/typescript/src/views/Stack/CardStack.d.ts.map +1 -1
  5. package/package.json +1 -1
  6. package/src/index.tsx +0 -56
  7. package/lib/module/TransitionConfigs/CardStyleInterpolators.js +0 -394
  8. package/lib/module/TransitionConfigs/HeaderStyleInterpolators.js +0 -262
  9. package/lib/module/TransitionConfigs/TransitionPresets.js +0 -156
  10. package/lib/module/TransitionConfigs/TransitionSpecs.js +0 -124
  11. package/lib/module/navigators/createStackNavigator.js +0 -71
  12. package/lib/module/types.js +0 -4
  13. package/lib/module/utils/CardAnimationContext.js +0 -5
  14. package/lib/module/utils/GestureHandlerRefContext.js +0 -5
  15. package/lib/module/utils/ModalPresentationContext.js +0 -5
  16. package/lib/module/utils/conditional.js +0 -28
  17. package/lib/module/utils/findLastIndex.js +0 -11
  18. package/lib/module/utils/gestureActivationCriteria.js +0 -60
  19. package/lib/module/utils/getDistanceForDirection.js +0 -15
  20. package/lib/module/utils/getInvertedMultiplier.js +0 -15
  21. package/lib/module/utils/getModalRoutesKeys.js +0 -12
  22. package/lib/module/utils/getShadowStyle.js +0 -24
  23. package/lib/module/utils/throttle.js +0 -14
  24. package/lib/module/utils/useCardAnimation.js +0 -12
  25. package/lib/module/utils/useGestureHandlerRef.js +0 -12
  26. package/lib/module/utils/useKeyboardManager.js +0 -90
  27. package/lib/module/views/GestureHandler.android.js +0 -4
  28. package/lib/module/views/GestureHandler.ios.js +0 -4
  29. package/lib/module/views/GestureHandler.js +0 -21
  30. package/lib/module/views/GestureHandler.kepler.js +0 -4
  31. package/lib/module/views/GestureHandlerNative.js +0 -18
  32. package/lib/module/views/Header/Header.js +0 -56
  33. package/lib/module/views/Header/HeaderContainer.js +0 -128
  34. package/lib/module/views/Header/HeaderSegment.js +0 -142
  35. package/lib/module/views/Screens.js +0 -42
  36. package/lib/module/views/Stack/Card.js +0 -433
  37. package/lib/module/views/Stack/CardA11yWrapper.js +0 -43
  38. package/lib/module/views/Stack/CardContainer.js +0 -276
  39. package/lib/module/views/Stack/CardContent.js +0 -74
  40. package/lib/module/views/Stack/CardStack.js +0 -498
  41. package/lib/module/views/Stack/StackView.js +0 -339
  42. package/src/TransitionConfigs/CardStyleInterpolators.tsx +0 -460
  43. package/src/TransitionConfigs/HeaderStyleInterpolators.tsx +0 -286
  44. package/src/TransitionConfigs/TransitionPresets.tsx +0 -182
  45. package/src/TransitionConfigs/TransitionSpecs.tsx +0 -124
  46. package/src/navigators/createStackNavigator.tsx +0 -120
  47. package/src/types.tsx +0 -639
  48. package/src/utils/CardAnimationContext.tsx +0 -7
  49. package/src/utils/GestureHandlerRefContext.tsx +0 -5
  50. package/src/utils/ModalPresentationContext.tsx +0 -3
  51. package/src/utils/conditional.tsx +0 -33
  52. package/src/utils/findLastIndex.tsx +0 -9
  53. package/src/utils/gestureActivationCriteria.tsx +0 -70
  54. package/src/utils/getDistanceForDirection.tsx +0 -19
  55. package/src/utils/getInvertedMultiplier.tsx +0 -17
  56. package/src/utils/getModalRoutesKeys.ts +0 -21
  57. package/src/utils/getShadowStyle.tsx +0 -37
  58. package/src/utils/throttle.tsx +0 -16
  59. package/src/utils/useCardAnimation.tsx +0 -15
  60. package/src/utils/useGestureHandlerRef.tsx +0 -15
  61. package/src/utils/useKeyboardManager.tsx +0 -103
  62. package/src/views/GestureHandler.android.tsx +0 -1
  63. package/src/views/GestureHandler.ios.tsx +0 -1
  64. package/src/views/GestureHandler.kepler.tsx +0 -1
  65. package/src/views/GestureHandler.tsx +0 -23
  66. package/src/views/GestureHandlerNative.tsx +0 -23
  67. package/src/views/Header/Header.tsx +0 -73
  68. package/src/views/Header/HeaderContainer.tsx +0 -191
  69. package/src/views/Header/HeaderSegment.tsx +0 -203
  70. package/src/views/Screens.tsx +0 -45
  71. package/src/views/Stack/Card.tsx +0 -646
  72. package/src/views/Stack/CardA11yWrapper.tsx +0 -67
  73. package/src/views/Stack/CardContainer.tsx +0 -339
  74. package/src/views/Stack/CardContent.tsx +0 -92
  75. package/src/views/Stack/CardStack.tsx +0 -849
  76. 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
- });