@react-navigation/stack 8.0.0-alpha.5 → 8.0.0-alpha.51

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 (133) hide show
  1. package/lib/module/TransitionConfigs/CardStyleInterpolators.js +36 -0
  2. package/lib/module/TransitionConfigs/CardStyleInterpolators.js.map +1 -1
  3. package/lib/module/index.js +2 -2
  4. package/lib/module/index.js.map +1 -1
  5. package/lib/module/navigators/createStackNavigator.js +3 -7
  6. package/lib/module/navigators/createStackNavigator.js.map +1 -1
  7. package/lib/module/utils/GestureHandlerContext.js +5 -0
  8. package/lib/module/utils/GestureHandlerContext.js.map +1 -0
  9. package/lib/module/utils/gestureActivationCriteria.js +10 -8
  10. package/lib/module/utils/gestureActivationCriteria.js.map +1 -1
  11. package/lib/module/utils/useCardAnimation.js +1 -1
  12. package/lib/module/utils/useCardAnimation.js.map +1 -1
  13. package/lib/module/utils/useGestureHandler.js +9 -0
  14. package/lib/module/utils/useGestureHandler.js.map +1 -0
  15. package/lib/module/utils/useKeyboardManager.js +71 -26
  16. package/lib/module/utils/useKeyboardManager.js.map +1 -1
  17. package/lib/module/views/GestureHandler.js +15 -14
  18. package/lib/module/views/GestureHandler.js.map +1 -1
  19. package/lib/module/views/GestureHandlerNative.js +16 -10
  20. package/lib/module/views/GestureHandlerNative.js.map +1 -1
  21. package/lib/module/views/Header/Header.js +2 -2
  22. package/lib/module/views/Header/Header.js.map +1 -1
  23. package/lib/module/views/Header/HeaderContainer.js +52 -18
  24. package/lib/module/views/Header/HeaderContainer.js.map +1 -1
  25. package/lib/module/views/Header/HeaderSegment.js +3 -3
  26. package/lib/module/views/Header/HeaderSegment.js.map +1 -1
  27. package/lib/module/views/Stack/Card.js +108 -93
  28. package/lib/module/views/Stack/Card.js.map +1 -1
  29. package/lib/module/views/Stack/CardContainer.js +72 -98
  30. package/lib/module/views/Stack/CardContainer.js.map +1 -1
  31. package/lib/module/views/Stack/CardContent.js +2 -0
  32. package/lib/module/views/Stack/CardContent.js.map +1 -1
  33. package/lib/module/views/Stack/CardStack.js +183 -132
  34. package/lib/module/views/Stack/CardStack.js.map +1 -1
  35. package/lib/module/views/Stack/StackView.js +103 -54
  36. package/lib/module/views/Stack/StackView.js.map +1 -1
  37. package/lib/typescript/src/TransitionConfigs/CardStyleInterpolators.d.ts +1 -1
  38. package/lib/typescript/src/TransitionConfigs/CardStyleInterpolators.d.ts.map +1 -1
  39. package/lib/typescript/src/TransitionConfigs/HeaderStyleInterpolators.d.ts +1 -1
  40. package/lib/typescript/src/TransitionConfigs/HeaderStyleInterpolators.d.ts.map +1 -1
  41. package/lib/typescript/src/TransitionConfigs/TransitionPresets.d.ts +1 -1
  42. package/lib/typescript/src/TransitionConfigs/TransitionPresets.d.ts.map +1 -1
  43. package/lib/typescript/src/TransitionConfigs/TransitionSpecs.d.ts +1 -1
  44. package/lib/typescript/src/TransitionConfigs/TransitionSpecs.d.ts.map +1 -1
  45. package/lib/typescript/src/index.d.ts +12 -12
  46. package/lib/typescript/src/index.d.ts.map +1 -1
  47. package/lib/typescript/src/navigators/createStackNavigator.d.ts +10 -15
  48. package/lib/typescript/src/navigators/createStackNavigator.d.ts.map +1 -1
  49. package/lib/typescript/src/types.d.ts +52 -55
  50. package/lib/typescript/src/types.d.ts.map +1 -1
  51. package/lib/typescript/src/utils/CardAnimationContext.d.ts +1 -1
  52. package/lib/typescript/src/utils/CardAnimationContext.d.ts.map +1 -1
  53. package/lib/typescript/src/utils/GestureHandlerContext.d.ts +3 -0
  54. package/lib/typescript/src/utils/GestureHandlerContext.d.ts.map +1 -0
  55. package/lib/typescript/src/utils/gestureActivationCriteria.d.ts +4 -51
  56. package/lib/typescript/src/utils/gestureActivationCriteria.d.ts.map +1 -1
  57. package/lib/typescript/src/utils/getDistanceForDirection.d.ts +1 -1
  58. package/lib/typescript/src/utils/getDistanceForDirection.d.ts.map +1 -1
  59. package/lib/typescript/src/utils/getInvertedMultiplier.d.ts +1 -1
  60. package/lib/typescript/src/utils/getInvertedMultiplier.d.ts.map +1 -1
  61. package/lib/typescript/src/utils/getModalRoutesKeys.d.ts +1 -1
  62. package/lib/typescript/src/utils/getModalRoutesKeys.d.ts.map +1 -1
  63. package/lib/typescript/src/utils/getShadowStyle.d.ts +5 -5
  64. package/lib/typescript/src/utils/useCardAnimation.d.ts +1 -1
  65. package/lib/typescript/src/utils/useCardAnimation.d.ts.map +1 -1
  66. package/lib/typescript/src/utils/useGestureHandler.d.ts +2 -0
  67. package/lib/typescript/src/utils/useGestureHandler.d.ts.map +1 -0
  68. package/lib/typescript/src/utils/useKeyboardManager.d.ts +12 -2
  69. package/lib/typescript/src/utils/useKeyboardManager.d.ts.map +1 -1
  70. package/lib/typescript/src/views/GestureHandler.android.d.ts +1 -1
  71. package/lib/typescript/src/views/GestureHandler.android.d.ts.map +1 -1
  72. package/lib/typescript/src/views/GestureHandler.d.ts +7 -11
  73. package/lib/typescript/src/views/GestureHandler.d.ts.map +1 -1
  74. package/lib/typescript/src/views/GestureHandler.ios.d.ts +1 -1
  75. package/lib/typescript/src/views/GestureHandler.ios.d.ts.map +1 -1
  76. package/lib/typescript/src/views/GestureHandlerNative.d.ts +9 -4
  77. package/lib/typescript/src/views/GestureHandlerNative.d.ts.map +1 -1
  78. package/lib/typescript/src/views/Header/Header.d.ts +2 -2
  79. package/lib/typescript/src/views/Header/Header.d.ts.map +1 -1
  80. package/lib/typescript/src/views/Header/HeaderContainer.d.ts +9 -3
  81. package/lib/typescript/src/views/Header/HeaderContainer.d.ts.map +1 -1
  82. package/lib/typescript/src/views/Header/HeaderSegment.d.ts +5 -4
  83. package/lib/typescript/src/views/Header/HeaderSegment.d.ts.map +1 -1
  84. package/lib/typescript/src/views/Stack/Card.d.ts +5 -5
  85. package/lib/typescript/src/views/Stack/Card.d.ts.map +1 -1
  86. package/lib/typescript/src/views/Stack/CardContainer.d.ts +5 -7
  87. package/lib/typescript/src/views/Stack/CardContainer.d.ts.map +1 -1
  88. package/lib/typescript/src/views/Stack/CardContent.d.ts +1 -1
  89. package/lib/typescript/src/views/Stack/CardContent.d.ts.map +1 -1
  90. package/lib/typescript/src/views/Stack/CardStack.d.ts +9 -6
  91. package/lib/typescript/src/views/Stack/CardStack.d.ts.map +1 -1
  92. package/lib/typescript/src/views/Stack/StackView.d.ts +14 -17
  93. package/lib/typescript/src/views/Stack/StackView.d.ts.map +1 -1
  94. package/package.json +23 -24
  95. package/src/TransitionConfigs/CardStyleInterpolators.tsx +44 -0
  96. package/src/index.tsx +3 -2
  97. package/src/navigators/createStackNavigator.tsx +9 -40
  98. package/src/types.tsx +79 -75
  99. package/src/utils/GestureHandlerContext.tsx +5 -0
  100. package/src/utils/gestureActivationCriteria.tsx +14 -10
  101. package/src/utils/useCardAnimation.tsx +1 -1
  102. package/src/utils/useGestureHandler.tsx +9 -0
  103. package/src/utils/useKeyboardManager.tsx +96 -33
  104. package/src/views/GestureHandler.tsx +27 -16
  105. package/src/views/GestureHandlerNative.tsx +26 -12
  106. package/src/views/Header/Header.tsx +2 -2
  107. package/src/views/Header/HeaderContainer.tsx +69 -33
  108. package/src/views/Header/HeaderSegment.tsx +6 -7
  109. package/src/views/Stack/Card.tsx +154 -119
  110. package/src/views/Stack/CardContainer.tsx +86 -127
  111. package/src/views/Stack/CardContent.tsx +1 -0
  112. package/src/views/Stack/CardStack.tsx +409 -330
  113. package/src/views/Stack/StackView.tsx +176 -79
  114. package/lib/module/utils/GestureHandlerRefContext.js +0 -5
  115. package/lib/module/utils/GestureHandlerRefContext.js.map +0 -1
  116. package/lib/module/utils/findLastIndex.js +0 -11
  117. package/lib/module/utils/findLastIndex.js.map +0 -1
  118. package/lib/module/utils/useGestureHandlerRef.js +0 -12
  119. package/lib/module/utils/useGestureHandlerRef.js.map +0 -1
  120. package/lib/module/views/Stack/CardA11yWrapper.js +0 -43
  121. package/lib/module/views/Stack/CardA11yWrapper.js.map +0 -1
  122. package/lib/typescript/src/utils/GestureHandlerRefContext.d.ts +0 -3
  123. package/lib/typescript/src/utils/GestureHandlerRefContext.d.ts.map +0 -1
  124. package/lib/typescript/src/utils/findLastIndex.d.ts +0 -2
  125. package/lib/typescript/src/utils/findLastIndex.d.ts.map +0 -1
  126. package/lib/typescript/src/utils/useGestureHandlerRef.d.ts +0 -3
  127. package/lib/typescript/src/utils/useGestureHandlerRef.d.ts.map +0 -1
  128. package/lib/typescript/src/views/Stack/CardA11yWrapper.d.ts +0 -15
  129. package/lib/typescript/src/views/Stack/CardA11yWrapper.d.ts.map +0 -1
  130. package/src/utils/GestureHandlerRefContext.tsx +0 -5
  131. package/src/utils/findLastIndex.tsx +0 -9
  132. package/src/utils/useGestureHandlerRef.tsx +0 -15
  133. package/src/views/Stack/CardA11yWrapper.tsx +0 -67
@@ -16,9 +16,11 @@ import { Animated, StyleSheet, View } from 'react-native';
16
16
  import type { Layout, Scene } from '../../types';
17
17
  import { ModalPresentationContext } from '../../utils/ModalPresentationContext';
18
18
  import { useKeyboardManager } from '../../utils/useKeyboardManager';
19
- import type { Props as HeaderContainerProps } from '../Header/HeaderContainer';
19
+ import type {
20
+ HeaderHeight,
21
+ Props as HeaderContainerProps,
22
+ } from '../Header/HeaderContainer';
20
23
  import { Card } from './Card';
21
- import { CardA11yWrapper, type CardA11yWrapperRef } from './CardA11yWrapper';
22
24
 
23
25
  type Props = {
24
26
  interpolationIndex: number;
@@ -49,19 +51,15 @@ type Props = {
49
51
  onGestureStart: (props: { route: Route<string> }) => void;
50
52
  onGestureEnd: (props: { route: Route<string> }) => void;
51
53
  onGestureCancel: (props: { route: Route<string> }) => void;
52
- hasAbsoluteFloatHeader: boolean;
53
- headerHeight: number;
54
+ headerHeight: HeaderHeight | undefined;
54
55
  onHeaderHeightChange: (props: {
55
56
  route: Route<string>;
56
57
  height: number;
57
58
  }) => void;
58
59
  isParentHeaderShown: boolean;
59
- isNextScreenTransparent: boolean;
60
- detachCurrentScreen: boolean;
60
+ children: React.ReactNode;
61
61
  };
62
62
 
63
- const EPSILON = 0.1;
64
-
65
63
  function CardContainerInner({
66
64
  interpolationIndex,
67
65
  index,
@@ -73,12 +71,9 @@ function CardContainerInner({
73
71
  modal,
74
72
  getPreviousScene,
75
73
  getFocusedRoute,
76
- hasAbsoluteFloatHeader,
77
74
  headerHeight,
78
75
  onHeaderHeightChange,
79
76
  isParentHeaderShown,
80
- isNextScreenTransparent,
81
- detachCurrentScreen,
82
77
  layout,
83
78
  onCloseRoute,
84
79
  onOpenRoute,
@@ -94,23 +89,22 @@ function CardContainerInner({
94
89
  safeAreaInsetRight,
95
90
  safeAreaInsetTop,
96
91
  scene,
92
+ children,
97
93
  }: Props) {
98
- const wrapperRef = React.useRef<CardA11yWrapperRef>(null);
99
-
100
94
  const { direction } = useLocale();
101
95
 
102
- const parentHeaderHeight = React.useContext(HeaderHeightContext);
96
+ const parentHeaderHeight = React.use(HeaderHeightContext);
103
97
 
104
- const { onPageChangeStart, onPageChangeCancel, onPageChangeConfirm } =
105
- useKeyboardManager(
106
- React.useCallback(() => {
107
- const { options, navigation } = scene.descriptor;
98
+ const { options } = scene.descriptor;
99
+ const enabled = options.keyboardHandlingEnabled !== false;
100
+ const contentRef = React.useRef<React.ComponentRef<typeof View>>(null);
108
101
 
109
- return (
110
- navigation.isFocused() && options.keyboardHandlingEnabled !== false
111
- );
112
- }, [scene.descriptor])
113
- );
102
+ const { onPageChangeStart, onPageChangeCancel, onPageChangeConfirm } =
103
+ useKeyboardManager({
104
+ enabled,
105
+ focused,
106
+ contentRef,
107
+ });
114
108
 
115
109
  const handleOpen = () => {
116
110
  const { route } = scene.descriptor;
@@ -153,17 +147,9 @@ function CardContainerInner({
153
147
  closing: boolean;
154
148
  gesture: boolean;
155
149
  }) => {
156
- wrapperRef.current?.setInert(closing);
157
-
158
150
  const { route } = scene.descriptor;
159
151
 
160
- if (!gesture) {
161
- onPageChangeConfirm?.(true);
162
- } else if (active && closing) {
163
- onPageChangeConfirm?.(false);
164
- } else {
165
- onPageChangeCancel?.();
166
- }
152
+ onPageChangeConfirm?.({ gesture, active, closing });
167
153
 
168
154
  onTransitionStart?.({ route }, closing);
169
155
  };
@@ -177,20 +163,6 @@ function CardContainerInner({
177
163
 
178
164
  const { colors } = useTheme();
179
165
 
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
166
  const {
195
167
  presentation,
196
168
  animation,
@@ -236,90 +208,77 @@ function CardContainerInner({
236
208
  const animated = animation !== 'none';
237
209
 
238
210
  return (
239
- <CardA11yWrapper
240
- ref={wrapperRef}
241
- focused={focused}
242
- active={active}
211
+ <Card
243
212
  animated={animated}
244
- isNextScreenTransparent={isNextScreenTransparent}
245
- detachCurrentScreen={detachCurrentScreen}
213
+ interpolationIndex={interpolationIndex}
214
+ gestureDirection={gestureDirection}
215
+ layout={layout}
216
+ insets={insets}
217
+ direction={direction}
218
+ gesture={gesture}
219
+ current={scene.progress.current}
220
+ next={scene.progress.next}
221
+ opening={opening}
222
+ closing={closing}
223
+ onOpen={handleOpen}
224
+ onClose={handleClose}
225
+ overlay={cardOverlay}
226
+ overlayEnabled={cardOverlayEnabled}
227
+ shadowEnabled={cardShadowEnabled}
228
+ onTransition={handleTransition}
229
+ onGestureBegin={handleGestureBegin}
230
+ onGestureCanceled={handleGestureCanceled}
231
+ onGestureEnd={handleGestureEnd}
232
+ gestureEnabled={index === 0 ? false : gestureEnabled}
233
+ gestureResponseDistance={gestureResponseDistance}
234
+ gestureVelocityImpact={gestureVelocityImpact}
235
+ transitionSpec={transitionSpec}
236
+ styleInterpolator={cardStyleInterpolator}
237
+ pageOverflowEnabled={headerMode !== 'float' && presentation !== 'modal'}
238
+ preloaded={preloaded}
239
+ contentStyle={[
240
+ {
241
+ backgroundColor:
242
+ presentation === 'transparentModal'
243
+ ? 'transparent'
244
+ : colors.background,
245
+ },
246
+ cardStyle,
247
+ ]}
246
248
  >
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
- scenes: [previousScene, scene],
296
- getPreviousScene,
297
- getFocusedRoute,
298
- onContentHeightChange: onHeaderHeightChange,
299
- style: styles.header,
300
- })
301
- : null}
302
- <View style={styles.scene}>
303
- <HeaderBackContext.Provider value={headerBack}>
304
- <HeaderShownContext.Provider
305
- value={isParentHeaderShown || headerShown !== false}
249
+ <View ref={contentRef} style={styles.container}>
250
+ <ModalPresentationContext.Provider value={modal}>
251
+ {headerMode !== 'float'
252
+ ? renderHeader({
253
+ mode: 'screen',
254
+ scenes: [previousScene, scene],
255
+ getPreviousScene,
256
+ getFocusedRoute,
257
+ contentHeight: headerHeight,
258
+ onContentHeightChange: onHeaderHeightChange,
259
+ style: styles.header,
260
+ })
261
+ : null}
262
+ <View style={styles.scene}>
263
+ <HeaderBackContext.Provider value={headerBack}>
264
+ <HeaderShownContext.Provider
265
+ value={isParentHeaderShown || headerShown !== false}
266
+ >
267
+ <HeaderHeightContext.Provider
268
+ value={
269
+ headerShown !== false
270
+ ? (headerHeight?.value ?? 0)
271
+ : (parentHeaderHeight ?? 0)
272
+ }
306
273
  >
307
- <HeaderHeightContext.Provider
308
- value={
309
- headerShown !== false
310
- ? headerHeight
311
- : (parentHeaderHeight ?? 0)
312
- }
313
- >
314
- {scene.descriptor.render()}
315
- </HeaderHeightContext.Provider>
316
- </HeaderShownContext.Provider>
317
- </HeaderBackContext.Provider>
318
- </View>
319
- </ModalPresentationContext.Provider>
320
- </View>
321
- </Card>
322
- </CardA11yWrapper>
274
+ {children}
275
+ </HeaderHeightContext.Provider>
276
+ </HeaderShownContext.Provider>
277
+ </HeaderBackContext.Provider>
278
+ </View>
279
+ </ModalPresentationContext.Provider>
280
+ </View>
281
+ </Card>
323
282
  );
324
283
  }
325
284
 
@@ -55,6 +55,7 @@ export function CardContent({ enabled, layout, style, ...rest }: Props) {
55
55
  document.head.appendChild(style);
56
56
  }
57
57
 
58
+ // eslint-disable-next-line @eslint-react/web-api/no-leaked-event-listener
58
59
  window.addEventListener('resize', updateStyle);
59
60
 
60
61
  unsubscribe = () => {