@react-navigation/native-stack 7.0.0-alpha.0 → 7.0.0-alpha.10

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 (84) hide show
  1. package/lib/commonjs/index.js +11 -5
  2. package/lib/commonjs/index.js.map +1 -1
  3. package/lib/commonjs/navigators/createNativeStackNavigator.js +27 -28
  4. package/lib/commonjs/navigators/createNativeStackNavigator.js.map +1 -1
  5. package/lib/commonjs/types.js.map +1 -1
  6. package/lib/commonjs/utils/useAnimatedHeaderHeight.js +19 -0
  7. package/lib/commonjs/utils/useAnimatedHeaderHeight.js.map +1 -0
  8. package/lib/commonjs/utils/useDismissedRouteError.js +5 -6
  9. package/lib/commonjs/utils/useDismissedRouteError.js.map +1 -1
  10. package/lib/commonjs/utils/useInvalidPreventRemoveError.js +5 -6
  11. package/lib/commonjs/utils/useInvalidPreventRemoveError.js.map +1 -1
  12. package/lib/commonjs/views/DebugContainer.js +4 -4
  13. package/lib/commonjs/views/DebugContainer.js.map +1 -1
  14. package/lib/commonjs/views/DebugContainer.native.js +22 -12
  15. package/lib/commonjs/views/DebugContainer.native.js.map +1 -1
  16. package/lib/commonjs/views/FontProcessor.js.map +1 -1
  17. package/lib/commonjs/views/FontProcessor.native.js +2 -4
  18. package/lib/commonjs/views/FontProcessor.native.js.map +1 -1
  19. package/lib/commonjs/views/HeaderConfig.js +36 -36
  20. package/lib/commonjs/views/HeaderConfig.js.map +1 -1
  21. package/lib/commonjs/views/NativeStackView.js +24 -12
  22. package/lib/commonjs/views/NativeStackView.js.map +1 -1
  23. package/lib/commonjs/views/NativeStackView.native.js +128 -50
  24. package/lib/commonjs/views/NativeStackView.native.js.map +1 -1
  25. package/lib/module/index.js +7 -2
  26. package/lib/module/index.js.map +1 -1
  27. package/lib/module/navigators/createNativeStackNavigator.js +23 -22
  28. package/lib/module/navigators/createNativeStackNavigator.js.map +1 -1
  29. package/lib/module/types.js.map +1 -1
  30. package/lib/module/utils/useAnimatedHeaderHeight.js +10 -0
  31. package/lib/module/utils/useAnimatedHeaderHeight.js.map +1 -0
  32. package/lib/module/utils/useDismissedRouteError.js +2 -3
  33. package/lib/module/utils/useDismissedRouteError.js.map +1 -1
  34. package/lib/module/utils/useInvalidPreventRemoveError.js +3 -4
  35. package/lib/module/utils/useInvalidPreventRemoveError.js.map +1 -1
  36. package/lib/module/views/DebugContainer.js +1 -1
  37. package/lib/module/views/DebugContainer.js.map +1 -1
  38. package/lib/module/views/DebugContainer.native.js +19 -7
  39. package/lib/module/views/DebugContainer.native.js.map +1 -1
  40. package/lib/module/views/FontProcessor.js.map +1 -1
  41. package/lib/module/views/FontProcessor.native.js +2 -4
  42. package/lib/module/views/FontProcessor.native.js.map +1 -1
  43. package/lib/module/views/HeaderConfig.js +36 -36
  44. package/lib/module/views/HeaderConfig.js.map +1 -1
  45. package/lib/module/views/NativeStackView.js +22 -10
  46. package/lib/module/views/NativeStackView.js.map +1 -1
  47. package/lib/module/views/NativeStackView.native.js +124 -46
  48. package/lib/module/views/NativeStackView.native.js.map +1 -1
  49. package/lib/typescript/src/index.d.ts +6 -2
  50. package/lib/typescript/src/index.d.ts.map +1 -1
  51. package/lib/typescript/src/navigators/createNativeStackNavigator.d.ts +6 -6
  52. package/lib/typescript/src/navigators/createNativeStackNavigator.d.ts.map +1 -1
  53. package/lib/typescript/src/types.d.ts +88 -10
  54. package/lib/typescript/src/types.d.ts.map +1 -1
  55. package/lib/typescript/src/utils/useAnimatedHeaderHeight.d.ts +5 -0
  56. package/lib/typescript/src/utils/useAnimatedHeaderHeight.d.ts.map +1 -0
  57. package/lib/typescript/src/utils/useDismissedRouteError.d.ts +1 -1
  58. package/lib/typescript/src/utils/useDismissedRouteError.d.ts.map +1 -1
  59. package/lib/typescript/src/utils/useInvalidPreventRemoveError.d.ts +1 -1
  60. package/lib/typescript/src/utils/useInvalidPreventRemoveError.d.ts.map +1 -1
  61. package/lib/typescript/src/views/DebugContainer.d.ts +2 -2
  62. package/lib/typescript/src/views/DebugContainer.d.ts.map +1 -1
  63. package/lib/typescript/src/views/DebugContainer.native.d.ts +8 -3
  64. package/lib/typescript/src/views/DebugContainer.native.d.ts.map +1 -1
  65. package/lib/typescript/src/views/FontProcessor.native.d.ts.map +1 -1
  66. package/lib/typescript/src/views/HeaderConfig.d.ts +2 -3
  67. package/lib/typescript/src/views/HeaderConfig.d.ts.map +1 -1
  68. package/lib/typescript/src/views/NativeStackView.d.ts +3 -3
  69. package/lib/typescript/src/views/NativeStackView.d.ts.map +1 -1
  70. package/lib/typescript/src/views/NativeStackView.native.d.ts +3 -3
  71. package/lib/typescript/src/views/NativeStackView.native.d.ts.map +1 -1
  72. package/package.json +16 -17
  73. package/src/index.tsx +7 -2
  74. package/src/navigators/createNativeStackNavigator.tsx +11 -7
  75. package/src/types.tsx +88 -11
  76. package/src/utils/useAnimatedHeaderHeight.tsx +18 -0
  77. package/src/utils/useDismissedRouteError.tsx +1 -1
  78. package/src/utils/useInvalidPreventRemoveError.tsx +1 -1
  79. package/src/views/DebugContainer.native.tsx +13 -10
  80. package/src/views/DebugContainer.tsx +2 -2
  81. package/src/views/FontProcessor.native.tsx +1 -2
  82. package/src/views/HeaderConfig.tsx +142 -143
  83. package/src/views/NativeStackView.native.tsx +203 -97
  84. package/src/views/NativeStackView.tsx +41 -27
@@ -1,13 +1,7 @@
1
1
  import { getHeaderTitle, HeaderTitle } from '@react-navigation/elements';
2
- import { Route, useTheme } from '@react-navigation/native';
2
+ import { type Route, useLocale, useTheme } from '@react-navigation/native';
3
3
  import * as React from 'react';
4
- import {
5
- I18nManager,
6
- Platform,
7
- StyleSheet,
8
- TextStyle,
9
- View,
10
- } from 'react-native';
4
+ import { Platform, StyleSheet, type TextStyle, View } from 'react-native';
11
5
  import {
12
6
  isSearchBarAvailableForCurrentPlatform,
13
7
  ScreenStackHeaderBackButtonImage,
@@ -29,8 +23,7 @@ type Props = NativeStackNavigationOptions & {
29
23
  canGoBack: boolean;
30
24
  };
31
25
 
32
- export default function HeaderConfig({
33
- headerHeight,
26
+ export function HeaderConfig({
34
27
  headerBackImageSource,
35
28
  headerBackButtonMenuEnabled,
36
29
  headerBackTitle,
@@ -59,15 +52,23 @@ export default function HeaderConfig({
59
52
  title,
60
53
  canGoBack,
61
54
  }: Props): JSX.Element {
62
- const { colors } = useTheme();
55
+ const { direction } = useLocale();
56
+ const { colors, fonts } = useTheme();
63
57
  const tintColor =
64
58
  headerTintColor ?? (Platform.OS === 'ios' ? colors.primary : colors.text);
65
59
 
66
60
  const headerBackTitleStyleFlattened =
67
- StyleSheet.flatten(headerBackTitleStyle) || {};
61
+ StyleSheet.flatten([headerBackTitleStyle, fonts.regular]) || {};
68
62
  const headerLargeTitleStyleFlattened =
69
- StyleSheet.flatten(headerLargeTitleStyle) || {};
70
- const headerTitleStyleFlattened = StyleSheet.flatten(headerTitleStyle) || {};
63
+ StyleSheet.flatten([
64
+ headerLargeTitleStyle,
65
+ Platform.select({ ios: fonts.heavy, default: fonts.medium }),
66
+ ]) || {};
67
+ const headerTitleStyleFlattened =
68
+ StyleSheet.flatten([
69
+ headerTitleStyle,
70
+ Platform.select({ ios: fonts.bold, default: fonts.medium }),
71
+ ]) || {};
71
72
  const headerStyleFlattened = StyleSheet.flatten(headerStyle) || {};
72
73
  const headerLargeStyleFlattened = StyleSheet.flatten(headerLargeStyle) || {};
73
74
 
@@ -78,12 +79,33 @@ export default function HeaderConfig({
78
79
  headerTitleStyleFlattened.fontFamily,
79
80
  ]);
80
81
 
82
+ const backTitleFontSize =
83
+ 'fontSize' in headerBackTitleStyleFlattened
84
+ ? headerBackTitleStyleFlattened.fontSize
85
+ : undefined;
86
+
81
87
  const titleText = getHeaderTitle({ title, headerTitle }, route.name);
82
88
  const titleColor =
83
- headerTitleStyleFlattened.color ?? headerTintColor ?? colors.text;
84
- const titleFontSize = headerTitleStyleFlattened.fontSize;
89
+ 'color' in headerTitleStyleFlattened
90
+ ? headerTitleStyleFlattened.color
91
+ : headerTintColor ?? colors.text;
92
+ const titleFontSize =
93
+ 'fontSize' in headerTitleStyleFlattened
94
+ ? headerTitleStyleFlattened.fontSize
95
+ : undefined;
85
96
  const titleFontWeight = headerTitleStyleFlattened.fontWeight;
86
97
 
98
+ const largeTitleBackgroundColor = headerLargeStyleFlattened.backgroundColor;
99
+ const largeTitleColor =
100
+ 'color' in headerLargeTitleStyleFlattened
101
+ ? headerLargeTitleStyleFlattened.color
102
+ : undefined;
103
+ const largeTitleFontSize =
104
+ 'fontSize' in headerLargeTitleStyleFlattened
105
+ ? headerLargeTitleStyleFlattened.fontSize
106
+ : undefined;
107
+ const largeTitleFontWeight = headerLargeTitleStyleFlattened.fontWeight;
108
+
87
109
  const headerTitleStyleSupported: TextStyle = { color: titleColor };
88
110
 
89
111
  if (headerTitleStyleFlattened.fontFamily != null) {
@@ -98,6 +120,12 @@ export default function HeaderConfig({
98
120
  headerTitleStyleSupported.fontWeight = titleFontWeight;
99
121
  }
100
122
 
123
+ const headerBackgroundColor =
124
+ headerStyleFlattened.backgroundColor ??
125
+ (headerBackground != null || headerTransparent
126
+ ? 'transparent'
127
+ : colors.card);
128
+
101
129
  const headerLeftElement = headerLeft?.({
102
130
  tintColor,
103
131
  canGoBack,
@@ -148,123 +176,105 @@ export default function HeaderConfig({
148
176
  headerTransparent !== false);
149
177
 
150
178
  return (
151
- <>
152
- {headerBackground != null ? (
153
- <View
154
- style={[
155
- styles.background,
156
- headerTransparent ? styles.translucent : null,
157
- { height: headerHeight },
158
- ]}
159
- >
160
- {headerBackground()}
161
- </View>
162
- ) : null}
163
- <ScreenStackHeaderConfig
164
- backButtonInCustomView={backButtonInCustomView}
165
- backgroundColor={
166
- headerStyleFlattened.backgroundColor ??
167
- (headerBackground != null || headerTransparent
168
- ? 'transparent'
169
- : colors.card)
170
- }
171
- backTitle={headerBackTitleVisible ? headerBackTitle : ' '}
172
- backTitleFontFamily={backTitleFontFamily}
173
- backTitleFontSize={headerBackTitleStyleFlattened.fontSize}
174
- blurEffect={headerBlurEffect}
175
- color={tintColor}
176
- direction={I18nManager.getConstants().isRTL ? 'rtl' : 'ltr'}
177
- disableBackButtonMenu={headerBackButtonMenuEnabled === false}
178
- hidden={headerShown === false}
179
- hideBackButton={headerBackVisible === false}
180
- hideShadow={
181
- headerShadowVisible === false ||
182
- headerBackground != null ||
183
- (headerTransparent && headerShadowVisible !== true)
184
- }
185
- largeTitle={headerLargeTitle}
186
- largeTitleBackgroundColor={headerLargeStyleFlattened.backgroundColor}
187
- largeTitleColor={headerLargeTitleStyleFlattened.color}
188
- largeTitleFontFamily={largeTitleFontFamily}
189
- largeTitleFontSize={headerLargeTitleStyleFlattened.fontSize}
190
- largeTitleFontWeight={headerLargeTitleStyleFlattened.fontWeight}
191
- largeTitleHideShadow={headerLargeTitleShadowVisible === false}
192
- title={titleText}
193
- titleColor={titleColor}
194
- titleFontFamily={titleFontFamily}
195
- titleFontSize={titleFontSize}
196
- titleFontWeight={titleFontWeight}
197
- topInsetEnabled={headerTopInsetEnabled}
198
- translucent={
199
- // This defaults to `true`, so we can't pass `undefined`
200
- translucent === true
201
- }
202
- >
203
- {Platform.OS === 'ios' ? (
204
- <>
205
- {headerLeftElement != null ? (
206
- <ScreenStackHeaderLeftView>
179
+ <ScreenStackHeaderConfig
180
+ backButtonInCustomView={backButtonInCustomView}
181
+ backgroundColor={headerBackgroundColor}
182
+ backTitle={headerBackTitleVisible ? headerBackTitle : ' '}
183
+ backTitleFontFamily={backTitleFontFamily}
184
+ backTitleFontSize={backTitleFontSize}
185
+ blurEffect={headerBlurEffect}
186
+ color={tintColor}
187
+ direction={direction}
188
+ disableBackButtonMenu={headerBackButtonMenuEnabled === false}
189
+ hidden={headerShown === false}
190
+ hideBackButton={headerBackVisible === false}
191
+ hideShadow={
192
+ headerShadowVisible === false ||
193
+ headerBackground != null ||
194
+ (headerTransparent && headerShadowVisible !== true)
195
+ }
196
+ largeTitle={headerLargeTitle}
197
+ largeTitleBackgroundColor={largeTitleBackgroundColor}
198
+ largeTitleColor={largeTitleColor}
199
+ largeTitleFontFamily={largeTitleFontFamily}
200
+ largeTitleFontSize={largeTitleFontSize}
201
+ largeTitleFontWeight={largeTitleFontWeight}
202
+ largeTitleHideShadow={headerLargeTitleShadowVisible === false}
203
+ title={titleText}
204
+ titleColor={titleColor}
205
+ titleFontFamily={titleFontFamily}
206
+ titleFontSize={titleFontSize}
207
+ titleFontWeight={titleFontWeight}
208
+ topInsetEnabled={headerTopInsetEnabled}
209
+ translucent={
210
+ // This defaults to `true`, so we can't pass `undefined`
211
+ translucent === true
212
+ }
213
+ >
214
+ {Platform.OS === 'ios' ? (
215
+ <>
216
+ {headerLeftElement != null ? (
217
+ <ScreenStackHeaderLeftView>
218
+ {headerLeftElement}
219
+ </ScreenStackHeaderLeftView>
220
+ ) : null}
221
+ {headerTitleElement != null ? (
222
+ <ScreenStackHeaderCenterView>
223
+ {headerTitleElement}
224
+ </ScreenStackHeaderCenterView>
225
+ ) : null}
226
+ </>
227
+ ) : (
228
+ <>
229
+ {headerLeftElement != null || typeof headerTitle === 'function' ? (
230
+ <ScreenStackHeaderLeftView>
231
+ <View style={styles.row}>
207
232
  {headerLeftElement}
208
- </ScreenStackHeaderLeftView>
209
- ) : null}
210
- {headerTitleElement != null ? (
211
- <ScreenStackHeaderCenterView>
212
- {headerTitleElement}
213
- </ScreenStackHeaderCenterView>
214
- ) : null}
215
- </>
216
- ) : (
217
- <>
218
- {headerLeftElement != null || typeof headerTitle === 'function' ? (
219
- <ScreenStackHeaderLeftView>
220
- <View style={styles.row}>
221
- {headerLeftElement}
222
- {headerTitleAlign !== 'center' ? (
223
- typeof headerTitle === 'function' ? (
224
- headerTitleElement
225
- ) : (
226
- <HeaderTitle
227
- tintColor={tintColor}
228
- style={headerTitleStyleSupported}
229
- >
230
- {titleText}
231
- </HeaderTitle>
232
- )
233
- ) : null}
234
- </View>
235
- </ScreenStackHeaderLeftView>
236
- ) : null}
237
- {headerTitleAlign === 'center' ? (
238
- <ScreenStackHeaderCenterView>
239
- {typeof headerTitle === 'function' ? (
240
- headerTitleElement
241
- ) : (
242
- <HeaderTitle
243
- tintColor={tintColor}
244
- style={headerTitleStyleSupported}
245
- >
246
- {titleText}
247
- </HeaderTitle>
248
- )}
249
- </ScreenStackHeaderCenterView>
250
- ) : null}
251
- </>
252
- )}
253
- {headerBackImageSource !== undefined ? (
254
- <ScreenStackHeaderBackButtonImage source={headerBackImageSource} />
255
- ) : null}
256
- {headerRightElement != null ? (
257
- <ScreenStackHeaderRightView>
258
- {headerRightElement}
259
- </ScreenStackHeaderRightView>
260
- ) : null}
261
- {hasHeaderSearchBar ? (
262
- <ScreenStackHeaderSearchBarView>
263
- <SearchBar {...headerSearchBarOptions} />
264
- </ScreenStackHeaderSearchBarView>
265
- ) : null}
266
- </ScreenStackHeaderConfig>
267
- </>
233
+ {headerTitleAlign !== 'center' ? (
234
+ typeof headerTitle === 'function' ? (
235
+ headerTitleElement
236
+ ) : (
237
+ <HeaderTitle
238
+ tintColor={tintColor}
239
+ style={headerTitleStyleSupported}
240
+ >
241
+ {titleText}
242
+ </HeaderTitle>
243
+ )
244
+ ) : null}
245
+ </View>
246
+ </ScreenStackHeaderLeftView>
247
+ ) : null}
248
+ {headerTitleAlign === 'center' ? (
249
+ <ScreenStackHeaderCenterView>
250
+ {typeof headerTitle === 'function' ? (
251
+ headerTitleElement
252
+ ) : (
253
+ <HeaderTitle
254
+ tintColor={tintColor}
255
+ style={headerTitleStyleSupported}
256
+ >
257
+ {titleText}
258
+ </HeaderTitle>
259
+ )}
260
+ </ScreenStackHeaderCenterView>
261
+ ) : null}
262
+ </>
263
+ )}
264
+ {headerBackImageSource !== undefined ? (
265
+ <ScreenStackHeaderBackButtonImage source={headerBackImageSource} />
266
+ ) : null}
267
+ {headerRightElement != null ? (
268
+ <ScreenStackHeaderRightView>
269
+ {headerRightElement}
270
+ </ScreenStackHeaderRightView>
271
+ ) : null}
272
+ {hasHeaderSearchBar ? (
273
+ <ScreenStackHeaderSearchBarView>
274
+ <SearchBar {...headerSearchBarOptions} />
275
+ </ScreenStackHeaderSearchBarView>
276
+ ) : null}
277
+ </ScreenStackHeaderConfig>
268
278
  );
269
279
  }
270
280
 
@@ -273,15 +283,4 @@ const styles = StyleSheet.create({
273
283
  flexDirection: 'row',
274
284
  alignItems: 'center',
275
285
  },
276
- translucent: {
277
- position: 'absolute',
278
- top: 0,
279
- left: 0,
280
- right: 0,
281
- zIndex: 1,
282
- elevation: 1,
283
- },
284
- background: {
285
- overflow: 'hidden',
286
- },
287
286
  });