@react-navigation/elements 1.1.1
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.
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/lib/commonjs/Background.js +34 -0
- package/lib/commonjs/Background.js.map +1 -0
- package/lib/commonjs/Header/Header.js +250 -0
- package/lib/commonjs/Header/Header.js.map +1 -0
- package/lib/commonjs/Header/HeaderBackButton.js +222 -0
- package/lib/commonjs/Header/HeaderBackButton.js.map +1 -0
- package/lib/commonjs/Header/HeaderBackContext.js +15 -0
- package/lib/commonjs/Header/HeaderBackContext.js.map +1 -0
- package/lib/commonjs/Header/HeaderBackground.js +57 -0
- package/lib/commonjs/Header/HeaderBackground.js.map +1 -0
- package/lib/commonjs/Header/HeaderHeightContext.js +15 -0
- package/lib/commonjs/Header/HeaderHeightContext.js.map +1 -0
- package/lib/commonjs/Header/HeaderShownContext.js +15 -0
- package/lib/commonjs/Header/HeaderShownContext.js.map +1 -0
- package/lib/commonjs/Header/HeaderTitle.js +56 -0
- package/lib/commonjs/Header/HeaderTitle.js.map +1 -0
- package/lib/commonjs/Header/getDefaultHeaderHeight.js +40 -0
- package/lib/commonjs/Header/getDefaultHeaderHeight.js.map +1 -0
- package/lib/commonjs/Header/getHeaderTitle.js +11 -0
- package/lib/commonjs/Header/getHeaderTitle.js.map +1 -0
- package/lib/commonjs/Header/useHeaderHeight.js +27 -0
- package/lib/commonjs/Header/useHeaderHeight.js.map +1 -0
- package/lib/commonjs/MaskedView.android.js +16 -0
- package/lib/commonjs/MaskedView.android.js.map +1 -0
- package/lib/commonjs/MaskedView.ios.js +16 -0
- package/lib/commonjs/MaskedView.ios.js.map +1 -0
- package/lib/commonjs/MaskedView.js +16 -0
- package/lib/commonjs/MaskedView.js.map +1 -0
- package/lib/commonjs/MaskedViewNative.js +40 -0
- package/lib/commonjs/MaskedViewNative.js.map +1 -0
- package/lib/commonjs/MissingIcon.js +34 -0
- package/lib/commonjs/MissingIcon.js.map +1 -0
- package/lib/commonjs/PlatformPressable.js +77 -0
- package/lib/commonjs/PlatformPressable.js.map +1 -0
- package/lib/commonjs/ResourceSavingView.js +64 -0
- package/lib/commonjs/ResourceSavingView.js.map +1 -0
- package/lib/commonjs/SafeAreaProviderCompat.js +69 -0
- package/lib/commonjs/SafeAreaProviderCompat.js.map +1 -0
- package/lib/commonjs/Screen.js +89 -0
- package/lib/commonjs/Screen.js.map +1 -0
- package/lib/commonjs/assets/back-icon-mask.png +0 -0
- package/lib/commonjs/assets/back-icon.png +0 -0
- package/lib/commonjs/assets/back-icon@1.5x.android.png +0 -0
- package/lib/commonjs/assets/back-icon@1.5x.ios.png +0 -0
- package/lib/commonjs/assets/back-icon@1x.android.png +0 -0
- package/lib/commonjs/assets/back-icon@1x.ios.png +0 -0
- package/lib/commonjs/assets/back-icon@2x.android.png +0 -0
- package/lib/commonjs/assets/back-icon@2x.ios.png +0 -0
- package/lib/commonjs/assets/back-icon@3x.android.png +0 -0
- package/lib/commonjs/assets/back-icon@3x.ios.png +0 -0
- package/lib/commonjs/assets/back-icon@4x.android.png +0 -0
- package/lib/commonjs/assets/back-icon@4x.ios.png +0 -0
- package/lib/commonjs/getNamedContext.js +32 -0
- package/lib/commonjs/getNamedContext.js.map +1 -0
- package/lib/commonjs/index.js +175 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/Background.js +20 -0
- package/lib/module/Background.js.map +1 -0
- package/lib/module/Header/Header.js +229 -0
- package/lib/module/Header/Header.js.map +1 -0
- package/lib/module/Header/HeaderBackButton.js +203 -0
- package/lib/module/Header/HeaderBackButton.js.map +1 -0
- package/lib/module/Header/HeaderBackContext.js +4 -0
- package/lib/module/Header/HeaderBackContext.js.map +1 -0
- package/lib/module/Header/HeaderBackground.js +42 -0
- package/lib/module/Header/HeaderBackground.js.map +1 -0
- package/lib/module/Header/HeaderHeightContext.js +4 -0
- package/lib/module/Header/HeaderHeightContext.js.map +1 -0
- package/lib/module/Header/HeaderShownContext.js +4 -0
- package/lib/module/Header/HeaderShownContext.js.map +1 -0
- package/lib/module/Header/HeaderTitle.js +41 -0
- package/lib/module/Header/HeaderTitle.js.map +1 -0
- package/lib/module/Header/getDefaultHeaderHeight.js +32 -0
- package/lib/module/Header/getDefaultHeaderHeight.js.map +1 -0
- package/lib/module/Header/getHeaderTitle.js +4 -0
- package/lib/module/Header/getHeaderTitle.js.map +1 -0
- package/lib/module/Header/useHeaderHeight.js +12 -0
- package/lib/module/Header/useHeaderHeight.js.map +1 -0
- package/lib/module/MaskedView.android.js +2 -0
- package/lib/module/MaskedView.android.js.map +1 -0
- package/lib/module/MaskedView.ios.js +2 -0
- package/lib/module/MaskedView.ios.js.map +1 -0
- package/lib/module/MaskedView.js +9 -0
- package/lib/module/MaskedView.js.map +1 -0
- package/lib/module/MaskedViewNative.js +26 -0
- package/lib/module/MaskedViewNative.js.map +1 -0
- package/lib/module/MissingIcon.js +20 -0
- package/lib/module/MissingIcon.js.map +1 -0
- package/lib/module/PlatformPressable.js +62 -0
- package/lib/module/PlatformPressable.js.map +1 -0
- package/lib/module/ResourceSavingView.js +50 -0
- package/lib/module/ResourceSavingView.js.map +1 -0
- package/lib/module/SafeAreaProviderCompat.js +51 -0
- package/lib/module/SafeAreaProviderCompat.js.map +1 -0
- package/lib/module/Screen.js +67 -0
- package/lib/module/Screen.js.map +1 -0
- package/lib/module/assets/back-icon-mask.png +0 -0
- package/lib/module/assets/back-icon.png +0 -0
- package/lib/module/assets/back-icon@1.5x.android.png +0 -0
- package/lib/module/assets/back-icon@1.5x.ios.png +0 -0
- package/lib/module/assets/back-icon@1x.android.png +0 -0
- package/lib/module/assets/back-icon@1x.ios.png +0 -0
- package/lib/module/assets/back-icon@2x.android.png +0 -0
- package/lib/module/assets/back-icon@2x.ios.png +0 -0
- package/lib/module/assets/back-icon@3x.android.png +0 -0
- package/lib/module/assets/back-icon@3x.ios.png +0 -0
- package/lib/module/assets/back-icon@4x.android.png +0 -0
- package/lib/module/assets/back-icon@4x.ios.png +0 -0
- package/lib/module/getNamedContext.js +19 -0
- package/lib/module/getNamedContext.js.map +1 -0
- package/lib/module/index.js +21 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/src/Background.d.ts +7 -0
- package/lib/typescript/src/Header/Header.d.ts +18 -0
- package/lib/typescript/src/Header/HeaderBackButton.d.ts +3 -0
- package/lib/typescript/src/Header/HeaderBackContext.d.ts +5 -0
- package/lib/typescript/src/Header/HeaderBackground.d.ts +8 -0
- package/lib/typescript/src/Header/HeaderHeightContext.d.ts +3 -0
- package/lib/typescript/src/Header/HeaderShownContext.d.ts +3 -0
- package/lib/typescript/src/Header/HeaderTitle.d.ts +9 -0
- package/lib/typescript/src/Header/getDefaultHeaderHeight.d.ts +2 -0
- package/lib/typescript/src/Header/getHeaderTitle.d.ts +5 -0
- package/lib/typescript/src/Header/useHeaderHeight.d.ts +1 -0
- package/lib/typescript/src/MaskedView.android.d.ts +1 -0
- package/lib/typescript/src/MaskedView.d.ts +10 -0
- package/lib/typescript/src/MaskedView.ios.d.ts +1 -0
- package/lib/typescript/src/MaskedViewNative.d.ts +10 -0
- package/lib/typescript/src/MissingIcon.d.ts +9 -0
- package/lib/typescript/src/PlatformPressable.d.ts +12 -0
- package/lib/typescript/src/ResourceSavingView.d.ts +9 -0
- package/lib/typescript/src/SafeAreaProviderCompat.d.ts +11 -0
- package/lib/typescript/src/Screen.d.ts +17 -0
- package/lib/typescript/src/getNamedContext.d.ts +5 -0
- package/lib/typescript/src/index.d.ts +18 -0
- package/lib/typescript/src/types.d.ts +202 -0
- package/package.json +72 -0
- package/src/Background.tsx +18 -0
- package/src/Header/Header.tsx +306 -0
- package/src/Header/HeaderBackButton.tsx +240 -0
- package/src/Header/HeaderBackContext.tsx +8 -0
- package/src/Header/HeaderBackground.tsx +56 -0
- package/src/Header/HeaderHeightContext.tsx +8 -0
- package/src/Header/HeaderShownContext.tsx +5 -0
- package/src/Header/HeaderTitle.tsx +52 -0
- package/src/Header/getDefaultHeaderHeight.tsx +39 -0
- package/src/Header/getHeaderTitle.tsx +12 -0
- package/src/Header/useHeaderHeight.tsx +15 -0
- package/src/MaskedView.android.tsx +1 -0
- package/src/MaskedView.ios.tsx +1 -0
- package/src/MaskedView.tsx +13 -0
- package/src/MaskedViewNative.tsx +33 -0
- package/src/MissingIcon.tsx +18 -0
- package/src/PlatformPressable.tsx +86 -0
- package/src/ResourceSavingView.tsx +70 -0
- package/src/SafeAreaProviderCompat.tsx +61 -0
- package/src/Screen.tsx +109 -0
- package/src/assets/back-icon-mask.png +0 -0
- package/src/assets/back-icon.png +0 -0
- package/src/assets/back-icon@1.5x.android.png +0 -0
- package/src/assets/back-icon@1.5x.ios.png +0 -0
- package/src/assets/back-icon@1x.android.png +0 -0
- package/src/assets/back-icon@1x.ios.png +0 -0
- package/src/assets/back-icon@2x.android.png +0 -0
- package/src/assets/back-icon@2x.ios.png +0 -0
- package/src/assets/back-icon@3x.android.png +0 -0
- package/src/assets/back-icon@3x.ios.png +0 -0
- package/src/assets/back-icon@4x.android.png +0 -0
- package/src/assets/back-icon@4x.ios.png +0 -0
- package/src/getNamedContext.tsx +28 -0
- package/src/index.tsx +25 -0
- package/src/types.tsx +208 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Animated, Platform, StyleSheet, View } from 'react-native';
|
|
3
|
+
import { useSafeAreaFrame, useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
4
|
+
import getDefaultHeaderHeight from './getDefaultHeaderHeight';
|
|
5
|
+
import HeaderBackground from './HeaderBackground';
|
|
6
|
+
import HeaderShownContext from './HeaderShownContext';
|
|
7
|
+
import HeaderTitle from './HeaderTitle';
|
|
8
|
+
|
|
9
|
+
const warnIfHeaderStylesDefined = styles => {
|
|
10
|
+
Object.keys(styles).forEach(styleProp => {
|
|
11
|
+
const value = styles[styleProp];
|
|
12
|
+
|
|
13
|
+
if (styleProp === 'position' && value === 'absolute') {
|
|
14
|
+
console.warn("position: 'absolute' is not supported on headerStyle. If you would like to render content under the header, use the 'headerTransparent' option.");
|
|
15
|
+
} else if (value !== undefined) {
|
|
16
|
+
console.warn(`${styleProp} was given a value of ${value}, this has no effect on headerStyle.`);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export default function Header(props) {
|
|
22
|
+
const insets = useSafeAreaInsets();
|
|
23
|
+
const frame = useSafeAreaFrame();
|
|
24
|
+
const isParentHeaderShown = React.useContext(HeaderShownContext);
|
|
25
|
+
const {
|
|
26
|
+
layout = frame,
|
|
27
|
+
modal = false,
|
|
28
|
+
title,
|
|
29
|
+
headerTitle: customTitle,
|
|
30
|
+
headerTitleAlign = Platform.select({
|
|
31
|
+
ios: 'center',
|
|
32
|
+
default: 'left'
|
|
33
|
+
}),
|
|
34
|
+
headerLeft,
|
|
35
|
+
headerLeftLabelVisible,
|
|
36
|
+
headerTransparent,
|
|
37
|
+
headerTintColor,
|
|
38
|
+
headerBackground,
|
|
39
|
+
headerRight,
|
|
40
|
+
headerTitleAllowFontScaling: titleAllowFontScaling,
|
|
41
|
+
headerTitleStyle: titleStyle,
|
|
42
|
+
headerLeftContainerStyle: leftContainerStyle,
|
|
43
|
+
headerRightContainerStyle: rightContainerStyle,
|
|
44
|
+
headerTitleContainerStyle: titleContainerStyle,
|
|
45
|
+
headerBackgroundContainerStyle: backgroundContainerStyle,
|
|
46
|
+
headerStyle: customHeaderStyle,
|
|
47
|
+
headerPressColor,
|
|
48
|
+
headerPressOpacity,
|
|
49
|
+
headerStatusBarHeight = isParentHeaderShown ? 0 : insets.top
|
|
50
|
+
} = props;
|
|
51
|
+
const defaultHeight = getDefaultHeaderHeight(layout, modal, headerStatusBarHeight);
|
|
52
|
+
const {
|
|
53
|
+
height = defaultHeight,
|
|
54
|
+
minHeight,
|
|
55
|
+
maxHeight,
|
|
56
|
+
backgroundColor,
|
|
57
|
+
borderBottomColor,
|
|
58
|
+
borderBottomEndRadius,
|
|
59
|
+
borderBottomLeftRadius,
|
|
60
|
+
borderBottomRightRadius,
|
|
61
|
+
borderBottomStartRadius,
|
|
62
|
+
borderBottomWidth,
|
|
63
|
+
borderColor,
|
|
64
|
+
borderEndColor,
|
|
65
|
+
borderEndWidth,
|
|
66
|
+
borderLeftColor,
|
|
67
|
+
borderLeftWidth,
|
|
68
|
+
borderRadius,
|
|
69
|
+
borderRightColor,
|
|
70
|
+
borderRightWidth,
|
|
71
|
+
borderStartColor,
|
|
72
|
+
borderStartWidth,
|
|
73
|
+
borderStyle,
|
|
74
|
+
borderTopColor,
|
|
75
|
+
borderTopEndRadius,
|
|
76
|
+
borderTopLeftRadius,
|
|
77
|
+
borderTopRightRadius,
|
|
78
|
+
borderTopStartRadius,
|
|
79
|
+
borderTopWidth,
|
|
80
|
+
borderWidth,
|
|
81
|
+
// @ts-expect-error: web support for shadow
|
|
82
|
+
boxShadow,
|
|
83
|
+
elevation,
|
|
84
|
+
shadowColor,
|
|
85
|
+
shadowOffset,
|
|
86
|
+
shadowOpacity,
|
|
87
|
+
shadowRadius,
|
|
88
|
+
opacity,
|
|
89
|
+
transform,
|
|
90
|
+
...unsafeStyles
|
|
91
|
+
} = StyleSheet.flatten(customHeaderStyle || {});
|
|
92
|
+
|
|
93
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
94
|
+
warnIfHeaderStylesDefined(unsafeStyles);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const safeStyles = {
|
|
98
|
+
backgroundColor,
|
|
99
|
+
borderBottomColor,
|
|
100
|
+
borderBottomEndRadius,
|
|
101
|
+
borderBottomLeftRadius,
|
|
102
|
+
borderBottomRightRadius,
|
|
103
|
+
borderBottomStartRadius,
|
|
104
|
+
borderBottomWidth,
|
|
105
|
+
borderColor,
|
|
106
|
+
borderEndColor,
|
|
107
|
+
borderEndWidth,
|
|
108
|
+
borderLeftColor,
|
|
109
|
+
borderLeftWidth,
|
|
110
|
+
borderRadius,
|
|
111
|
+
borderRightColor,
|
|
112
|
+
borderRightWidth,
|
|
113
|
+
borderStartColor,
|
|
114
|
+
borderStartWidth,
|
|
115
|
+
borderStyle,
|
|
116
|
+
borderTopColor,
|
|
117
|
+
borderTopEndRadius,
|
|
118
|
+
borderTopLeftRadius,
|
|
119
|
+
borderTopRightRadius,
|
|
120
|
+
borderTopStartRadius,
|
|
121
|
+
borderTopWidth,
|
|
122
|
+
borderWidth,
|
|
123
|
+
// @ts-expect-error: boxShadow is only for Web
|
|
124
|
+
boxShadow,
|
|
125
|
+
elevation,
|
|
126
|
+
shadowColor,
|
|
127
|
+
shadowOffset,
|
|
128
|
+
shadowOpacity,
|
|
129
|
+
shadowRadius,
|
|
130
|
+
opacity,
|
|
131
|
+
transform
|
|
132
|
+
}; // Setting a property to undefined triggers default style
|
|
133
|
+
// So we need to filter them out
|
|
134
|
+
// Users can use `null` instead
|
|
135
|
+
|
|
136
|
+
for (const styleProp in safeStyles) {
|
|
137
|
+
// @ts-expect-error: typescript wrongly complains that styleProp cannot be used to index safeStyles
|
|
138
|
+
if (safeStyles[styleProp] === undefined) {
|
|
139
|
+
// @ts-expect-error
|
|
140
|
+
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
141
|
+
delete safeStyles[styleProp];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const leftButton = headerLeft ? headerLeft({
|
|
146
|
+
tintColor: headerTintColor,
|
|
147
|
+
pressColor: headerPressColor,
|
|
148
|
+
pressOpacity: headerPressOpacity,
|
|
149
|
+
labelVisible: headerLeftLabelVisible
|
|
150
|
+
}) : null;
|
|
151
|
+
const rightButton = headerRight ? headerRight({
|
|
152
|
+
tintColor: headerTintColor,
|
|
153
|
+
pressColor: headerPressColor,
|
|
154
|
+
pressOpacity: headerPressOpacity
|
|
155
|
+
}) : null;
|
|
156
|
+
const headerTitle = typeof customTitle !== 'function' ? props => /*#__PURE__*/React.createElement(HeaderTitle, props) : customTitle;
|
|
157
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Animated.View, {
|
|
158
|
+
pointerEvents: "box-none",
|
|
159
|
+
style: [StyleSheet.absoluteFill, {
|
|
160
|
+
zIndex: 0
|
|
161
|
+
}, backgroundContainerStyle]
|
|
162
|
+
}, headerBackground ? headerBackground({
|
|
163
|
+
style: safeStyles
|
|
164
|
+
}) : headerTransparent ? null : /*#__PURE__*/React.createElement(HeaderBackground, {
|
|
165
|
+
style: safeStyles
|
|
166
|
+
})), /*#__PURE__*/React.createElement(Animated.View, {
|
|
167
|
+
pointerEvents: "box-none",
|
|
168
|
+
style: [{
|
|
169
|
+
height,
|
|
170
|
+
minHeight,
|
|
171
|
+
maxHeight,
|
|
172
|
+
opacity,
|
|
173
|
+
transform
|
|
174
|
+
}]
|
|
175
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
176
|
+
pointerEvents: "none",
|
|
177
|
+
style: {
|
|
178
|
+
height: headerStatusBarHeight
|
|
179
|
+
}
|
|
180
|
+
}), /*#__PURE__*/React.createElement(View, {
|
|
181
|
+
pointerEvents: "box-none",
|
|
182
|
+
style: styles.content
|
|
183
|
+
}, /*#__PURE__*/React.createElement(Animated.View, {
|
|
184
|
+
pointerEvents: "box-none",
|
|
185
|
+
style: [styles.left, headerTitleAlign === 'center' && styles.expand, {
|
|
186
|
+
marginStart: insets.left
|
|
187
|
+
}, leftContainerStyle]
|
|
188
|
+
}, leftButton), /*#__PURE__*/React.createElement(Animated.View, {
|
|
189
|
+
pointerEvents: "box-none",
|
|
190
|
+
style: [styles.title, {
|
|
191
|
+
// Avoid the title from going offscreen or overlapping buttons
|
|
192
|
+
maxWidth: headerTitleAlign === 'center' ? layout.width - ((leftButton ? headerLeftLabelVisible !== false ? 80 : 32 : 16) + Math.max(insets.left, insets.right)) * 2 : layout.width - ((leftButton ? 72 : 16) + (rightButton ? 72 : 16) + insets.left - insets.right)
|
|
193
|
+
}, titleContainerStyle]
|
|
194
|
+
}, headerTitle({
|
|
195
|
+
children: title,
|
|
196
|
+
allowFontScaling: titleAllowFontScaling,
|
|
197
|
+
tintColor: headerTintColor,
|
|
198
|
+
style: titleStyle
|
|
199
|
+
})), /*#__PURE__*/React.createElement(Animated.View, {
|
|
200
|
+
pointerEvents: "box-none",
|
|
201
|
+
style: [styles.right, styles.expand, {
|
|
202
|
+
marginEnd: insets.right
|
|
203
|
+
}, rightContainerStyle]
|
|
204
|
+
}, rightButton))));
|
|
205
|
+
}
|
|
206
|
+
const styles = StyleSheet.create({
|
|
207
|
+
content: {
|
|
208
|
+
flex: 1,
|
|
209
|
+
flexDirection: 'row',
|
|
210
|
+
alignItems: 'stretch'
|
|
211
|
+
},
|
|
212
|
+
title: {
|
|
213
|
+
marginHorizontal: 16,
|
|
214
|
+
justifyContent: 'center'
|
|
215
|
+
},
|
|
216
|
+
left: {
|
|
217
|
+
justifyContent: 'center',
|
|
218
|
+
alignItems: 'flex-start'
|
|
219
|
+
},
|
|
220
|
+
right: {
|
|
221
|
+
justifyContent: 'center',
|
|
222
|
+
alignItems: 'flex-end'
|
|
223
|
+
},
|
|
224
|
+
expand: {
|
|
225
|
+
flexGrow: 1,
|
|
226
|
+
flexBasis: 0
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["Header.tsx"],"names":["React","Animated","Platform","StyleSheet","View","useSafeAreaFrame","useSafeAreaInsets","getDefaultHeaderHeight","HeaderBackground","HeaderShownContext","HeaderTitle","warnIfHeaderStylesDefined","styles","Object","keys","forEach","styleProp","value","console","warn","undefined","Header","props","insets","frame","isParentHeaderShown","useContext","layout","modal","title","headerTitle","customTitle","headerTitleAlign","select","ios","default","headerLeft","headerLeftLabelVisible","headerTransparent","headerTintColor","headerBackground","headerRight","headerTitleAllowFontScaling","titleAllowFontScaling","headerTitleStyle","titleStyle","headerLeftContainerStyle","leftContainerStyle","headerRightContainerStyle","rightContainerStyle","headerTitleContainerStyle","titleContainerStyle","headerBackgroundContainerStyle","backgroundContainerStyle","headerStyle","customHeaderStyle","headerPressColor","headerPressOpacity","headerStatusBarHeight","top","defaultHeight","height","minHeight","maxHeight","backgroundColor","borderBottomColor","borderBottomEndRadius","borderBottomLeftRadius","borderBottomRightRadius","borderBottomStartRadius","borderBottomWidth","borderColor","borderEndColor","borderEndWidth","borderLeftColor","borderLeftWidth","borderRadius","borderRightColor","borderRightWidth","borderStartColor","borderStartWidth","borderStyle","borderTopColor","borderTopEndRadius","borderTopLeftRadius","borderTopRightRadius","borderTopStartRadius","borderTopWidth","borderWidth","boxShadow","elevation","shadowColor","shadowOffset","shadowOpacity","shadowRadius","opacity","transform","unsafeStyles","flatten","process","env","NODE_ENV","safeStyles","leftButton","tintColor","pressColor","pressOpacity","labelVisible","rightButton","absoluteFill","zIndex","style","content","left","expand","marginStart","maxWidth","width","Math","max","right","children","allowFontScaling","marginEnd","create","flex","flexDirection","alignItems","marginHorizontal","justifyContent","flexGrow","flexBasis"],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport { Animated, Platform, StyleSheet, View, ViewStyle } from 'react-native';\nimport {\n useSafeAreaFrame,\n useSafeAreaInsets,\n} from 'react-native-safe-area-context';\n\nimport type { HeaderOptions, Layout } from '../types';\nimport getDefaultHeaderHeight from './getDefaultHeaderHeight';\nimport HeaderBackground from './HeaderBackground';\nimport HeaderShownContext from './HeaderShownContext';\nimport HeaderTitle from './HeaderTitle';\n\ntype Props = HeaderOptions & {\n /**\n * Whether the header is in a modal\n */\n modal?: boolean;\n /**\n * Layout of the screen.\n */\n layout?: Layout;\n /**\n * Title text for the header.\n */\n title: string;\n};\n\nconst warnIfHeaderStylesDefined = (styles: Record<string, any>) => {\n Object.keys(styles).forEach((styleProp) => {\n const value = styles[styleProp];\n\n if (styleProp === 'position' && value === 'absolute') {\n console.warn(\n \"position: 'absolute' is not supported on headerStyle. If you would like to render content under the header, use the 'headerTransparent' option.\"\n );\n } else if (value !== undefined) {\n console.warn(\n `${styleProp} was given a value of ${value}, this has no effect on headerStyle.`\n );\n }\n });\n};\n\nexport default function Header(props: Props) {\n const insets = useSafeAreaInsets();\n const frame = useSafeAreaFrame();\n\n const isParentHeaderShown = React.useContext(HeaderShownContext);\n\n const {\n layout = frame,\n modal = false,\n title,\n headerTitle: customTitle,\n headerTitleAlign = Platform.select({\n ios: 'center',\n default: 'left',\n }),\n headerLeft,\n headerLeftLabelVisible,\n headerTransparent,\n headerTintColor,\n headerBackground,\n headerRight,\n headerTitleAllowFontScaling: titleAllowFontScaling,\n headerTitleStyle: titleStyle,\n headerLeftContainerStyle: leftContainerStyle,\n headerRightContainerStyle: rightContainerStyle,\n headerTitleContainerStyle: titleContainerStyle,\n headerBackgroundContainerStyle: backgroundContainerStyle,\n headerStyle: customHeaderStyle,\n headerPressColor,\n headerPressOpacity,\n headerStatusBarHeight = isParentHeaderShown ? 0 : insets.top,\n } = props;\n\n const defaultHeight = getDefaultHeaderHeight(\n layout,\n modal,\n headerStatusBarHeight\n );\n\n const {\n height = defaultHeight,\n minHeight,\n maxHeight,\n backgroundColor,\n borderBottomColor,\n borderBottomEndRadius,\n borderBottomLeftRadius,\n borderBottomRightRadius,\n borderBottomStartRadius,\n borderBottomWidth,\n borderColor,\n borderEndColor,\n borderEndWidth,\n borderLeftColor,\n borderLeftWidth,\n borderRadius,\n borderRightColor,\n borderRightWidth,\n borderStartColor,\n borderStartWidth,\n borderStyle,\n borderTopColor,\n borderTopEndRadius,\n borderTopLeftRadius,\n borderTopRightRadius,\n borderTopStartRadius,\n borderTopWidth,\n borderWidth,\n // @ts-expect-error: web support for shadow\n boxShadow,\n elevation,\n shadowColor,\n shadowOffset,\n shadowOpacity,\n shadowRadius,\n opacity,\n transform,\n ...unsafeStyles\n } = StyleSheet.flatten(customHeaderStyle || {}) as ViewStyle;\n\n if (process.env.NODE_ENV !== 'production') {\n warnIfHeaderStylesDefined(unsafeStyles);\n }\n\n const safeStyles: ViewStyle = {\n backgroundColor,\n borderBottomColor,\n borderBottomEndRadius,\n borderBottomLeftRadius,\n borderBottomRightRadius,\n borderBottomStartRadius,\n borderBottomWidth,\n borderColor,\n borderEndColor,\n borderEndWidth,\n borderLeftColor,\n borderLeftWidth,\n borderRadius,\n borderRightColor,\n borderRightWidth,\n borderStartColor,\n borderStartWidth,\n borderStyle,\n borderTopColor,\n borderTopEndRadius,\n borderTopLeftRadius,\n borderTopRightRadius,\n borderTopStartRadius,\n borderTopWidth,\n borderWidth,\n // @ts-expect-error: boxShadow is only for Web\n boxShadow,\n elevation,\n shadowColor,\n shadowOffset,\n shadowOpacity,\n shadowRadius,\n opacity,\n transform,\n };\n\n // Setting a property to undefined triggers default style\n // So we need to filter them out\n // Users can use `null` instead\n for (const styleProp in safeStyles) {\n // @ts-expect-error: typescript wrongly complains that styleProp cannot be used to index safeStyles\n if (safeStyles[styleProp] === undefined) {\n // @ts-expect-error\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete safeStyles[styleProp];\n }\n }\n\n const leftButton = headerLeft\n ? headerLeft({\n tintColor: headerTintColor,\n pressColor: headerPressColor,\n pressOpacity: headerPressOpacity,\n labelVisible: headerLeftLabelVisible,\n })\n : null;\n\n const rightButton = headerRight\n ? headerRight({\n tintColor: headerTintColor,\n pressColor: headerPressColor,\n pressOpacity: headerPressOpacity,\n })\n : null;\n\n const headerTitle =\n typeof customTitle !== 'function'\n ? (props: React.ComponentProps<typeof HeaderTitle>) => (\n <HeaderTitle {...props} />\n )\n : customTitle;\n\n return (\n <React.Fragment>\n <Animated.View\n pointerEvents=\"box-none\"\n style={[\n StyleSheet.absoluteFill,\n { zIndex: 0 },\n backgroundContainerStyle,\n ]}\n >\n {headerBackground ? (\n headerBackground({ style: safeStyles })\n ) : headerTransparent ? null : (\n <HeaderBackground style={safeStyles} />\n )}\n </Animated.View>\n <Animated.View\n pointerEvents=\"box-none\"\n style={[{ height, minHeight, maxHeight, opacity, transform }]}\n >\n <View pointerEvents=\"none\" style={{ height: headerStatusBarHeight }} />\n <View pointerEvents=\"box-none\" style={styles.content}>\n <Animated.View\n pointerEvents=\"box-none\"\n style={[\n styles.left,\n headerTitleAlign === 'center' && styles.expand,\n { marginStart: insets.left },\n leftContainerStyle,\n ]}\n >\n {leftButton}\n </Animated.View>\n <Animated.View\n pointerEvents=\"box-none\"\n style={[\n styles.title,\n {\n // Avoid the title from going offscreen or overlapping buttons\n maxWidth:\n headerTitleAlign === 'center'\n ? layout.width -\n ((leftButton\n ? headerLeftLabelVisible !== false\n ? 80\n : 32\n : 16) +\n Math.max(insets.left, insets.right)) *\n 2\n : layout.width -\n ((leftButton ? 72 : 16) +\n (rightButton ? 72 : 16) +\n insets.left -\n insets.right),\n },\n titleContainerStyle,\n ]}\n >\n {headerTitle({\n children: title,\n allowFontScaling: titleAllowFontScaling,\n tintColor: headerTintColor,\n style: titleStyle,\n })}\n </Animated.View>\n <Animated.View\n pointerEvents=\"box-none\"\n style={[\n styles.right,\n styles.expand,\n { marginEnd: insets.right },\n rightContainerStyle,\n ]}\n >\n {rightButton}\n </Animated.View>\n </View>\n </Animated.View>\n </React.Fragment>\n );\n}\n\nconst styles = StyleSheet.create({\n content: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'stretch',\n },\n title: {\n marginHorizontal: 16,\n justifyContent: 'center',\n },\n left: {\n justifyContent: 'center',\n alignItems: 'flex-start',\n },\n right: {\n justifyContent: 'center',\n alignItems: 'flex-end',\n },\n expand: {\n flexGrow: 1,\n flexBasis: 0,\n },\n});\n"]}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { useTheme } from '@react-navigation/native';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Animated, I18nManager, Image, Platform, StyleSheet, View } from 'react-native';
|
|
4
|
+
import MaskedView from '../MaskedView';
|
|
5
|
+
import PlatformPressable from '../PlatformPressable';
|
|
6
|
+
export default function HeaderBackButton({
|
|
7
|
+
disabled,
|
|
8
|
+
allowFontScaling,
|
|
9
|
+
backImage,
|
|
10
|
+
label,
|
|
11
|
+
labelStyle,
|
|
12
|
+
labelVisible,
|
|
13
|
+
onLabelLayout,
|
|
14
|
+
onPress,
|
|
15
|
+
pressColor,
|
|
16
|
+
pressOpacity,
|
|
17
|
+
screenLayout,
|
|
18
|
+
tintColor: customTintColor,
|
|
19
|
+
titleLayout,
|
|
20
|
+
truncatedLabel = 'Back',
|
|
21
|
+
accessibilityLabel = label && label !== 'Back' ? `${label}, back` : 'Go back',
|
|
22
|
+
testID,
|
|
23
|
+
style
|
|
24
|
+
}) {
|
|
25
|
+
const {
|
|
26
|
+
colors
|
|
27
|
+
} = useTheme();
|
|
28
|
+
const [initialLabelWidth, setInitialLabelWidth] = React.useState(undefined);
|
|
29
|
+
const tintColor = customTintColor !== undefined ? customTintColor : Platform.select({
|
|
30
|
+
ios: colors.primary,
|
|
31
|
+
default: colors.text
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const handleLabelLayout = e => {
|
|
35
|
+
onLabelLayout === null || onLabelLayout === void 0 ? void 0 : onLabelLayout(e);
|
|
36
|
+
setInitialLabelWidth(e.nativeEvent.layout.x + e.nativeEvent.layout.width);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const shouldTruncateLabel = () => {
|
|
40
|
+
return !label || initialLabelWidth && titleLayout && screenLayout && (screenLayout.width - titleLayout.width) / 2 < initialLabelWidth + 26;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const renderBackImage = () => {
|
|
44
|
+
if (backImage) {
|
|
45
|
+
return backImage({
|
|
46
|
+
tintColor
|
|
47
|
+
});
|
|
48
|
+
} else {
|
|
49
|
+
return /*#__PURE__*/React.createElement(Image, {
|
|
50
|
+
style: [styles.icon, Boolean(labelVisible) && styles.iconWithLabel, Boolean(tintColor) && {
|
|
51
|
+
tintColor
|
|
52
|
+
}],
|
|
53
|
+
source: require('../assets/back-icon.png'),
|
|
54
|
+
fadeDuration: 0
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const renderLabel = () => {
|
|
60
|
+
const leftLabelText = shouldTruncateLabel() ? truncatedLabel : label;
|
|
61
|
+
|
|
62
|
+
if (!labelVisible || leftLabelText === undefined) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const labelElement = /*#__PURE__*/React.createElement(View, {
|
|
67
|
+
style: screenLayout ? // We make the button extend till the middle of the screen
|
|
68
|
+
// Otherwise it appears to cut off when translating
|
|
69
|
+
[styles.labelWrapper, {
|
|
70
|
+
minWidth: screenLayout.width / 2 - 27
|
|
71
|
+
}] : null
|
|
72
|
+
}, /*#__PURE__*/React.createElement(Animated.Text, {
|
|
73
|
+
accessible: false,
|
|
74
|
+
onLayout: // This measurement is used to determine if we should truncate the label when it doesn't fit
|
|
75
|
+
// Only measure it when label is not truncated because we want the measurement of full label
|
|
76
|
+
leftLabelText === label ? handleLabelLayout : undefined,
|
|
77
|
+
style: [styles.label, tintColor ? {
|
|
78
|
+
color: tintColor
|
|
79
|
+
} : null, labelStyle],
|
|
80
|
+
numberOfLines: 1,
|
|
81
|
+
allowFontScaling: !!allowFontScaling
|
|
82
|
+
}, leftLabelText));
|
|
83
|
+
|
|
84
|
+
if (backImage || Platform.OS !== 'ios') {
|
|
85
|
+
// When a custom backimage is specified, we can't mask the label
|
|
86
|
+
// Otherwise there might be weird effect due to our mask not being the same as the image
|
|
87
|
+
return labelElement;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return /*#__PURE__*/React.createElement(MaskedView, {
|
|
91
|
+
maskElement: /*#__PURE__*/React.createElement(View, {
|
|
92
|
+
style: styles.iconMaskContainer
|
|
93
|
+
}, /*#__PURE__*/React.createElement(Image, {
|
|
94
|
+
source: require('../assets/back-icon-mask.png'),
|
|
95
|
+
style: styles.iconMask
|
|
96
|
+
}), /*#__PURE__*/React.createElement(View, {
|
|
97
|
+
style: styles.iconMaskFillerRect
|
|
98
|
+
}))
|
|
99
|
+
}, labelElement);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const handlePress = () => onPress && requestAnimationFrame(onPress);
|
|
103
|
+
|
|
104
|
+
return /*#__PURE__*/React.createElement(PlatformPressable, {
|
|
105
|
+
disabled: disabled,
|
|
106
|
+
accessible: true,
|
|
107
|
+
accessibilityRole: "button",
|
|
108
|
+
accessibilityLabel: accessibilityLabel,
|
|
109
|
+
testID: testID,
|
|
110
|
+
onPress: disabled ? undefined : handlePress,
|
|
111
|
+
pressColor: pressColor,
|
|
112
|
+
pressOpacity: pressOpacity,
|
|
113
|
+
android_ripple: {
|
|
114
|
+
borderless: true
|
|
115
|
+
},
|
|
116
|
+
style: [styles.container, disabled && styles.disabled, style],
|
|
117
|
+
hitSlop: Platform.select({
|
|
118
|
+
ios: undefined,
|
|
119
|
+
default: {
|
|
120
|
+
top: 16,
|
|
121
|
+
right: 16,
|
|
122
|
+
bottom: 16,
|
|
123
|
+
left: 16
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
}, /*#__PURE__*/React.createElement(React.Fragment, null, renderBackImage(), renderLabel()));
|
|
127
|
+
}
|
|
128
|
+
const styles = StyleSheet.create({
|
|
129
|
+
container: {
|
|
130
|
+
alignItems: 'center',
|
|
131
|
+
flexDirection: 'row',
|
|
132
|
+
minWidth: StyleSheet.hairlineWidth,
|
|
133
|
+
// Avoid collapsing when title is long
|
|
134
|
+
...Platform.select({
|
|
135
|
+
ios: null,
|
|
136
|
+
default: {
|
|
137
|
+
marginVertical: 3,
|
|
138
|
+
marginHorizontal: 11
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
},
|
|
142
|
+
disabled: {
|
|
143
|
+
opacity: 0.5
|
|
144
|
+
},
|
|
145
|
+
label: {
|
|
146
|
+
fontSize: 17,
|
|
147
|
+
// Title and back label are a bit different width due to title being bold
|
|
148
|
+
// Adjusting the letterSpacing makes them coincide better
|
|
149
|
+
letterSpacing: 0.35
|
|
150
|
+
},
|
|
151
|
+
labelWrapper: {
|
|
152
|
+
// These styles will make sure that the label doesn't fill the available space
|
|
153
|
+
// Otherwise it messes with the measurement of the label
|
|
154
|
+
flexDirection: 'row',
|
|
155
|
+
alignItems: 'flex-start'
|
|
156
|
+
},
|
|
157
|
+
icon: Platform.select({
|
|
158
|
+
ios: {
|
|
159
|
+
height: 21,
|
|
160
|
+
width: 13,
|
|
161
|
+
marginLeft: 8,
|
|
162
|
+
marginRight: 22,
|
|
163
|
+
marginVertical: 12,
|
|
164
|
+
resizeMode: 'contain',
|
|
165
|
+
transform: [{
|
|
166
|
+
scaleX: I18nManager.isRTL ? -1 : 1
|
|
167
|
+
}]
|
|
168
|
+
},
|
|
169
|
+
default: {
|
|
170
|
+
height: 24,
|
|
171
|
+
width: 24,
|
|
172
|
+
margin: 3,
|
|
173
|
+
resizeMode: 'contain',
|
|
174
|
+
transform: [{
|
|
175
|
+
scaleX: I18nManager.isRTL ? -1 : 1
|
|
176
|
+
}]
|
|
177
|
+
}
|
|
178
|
+
}),
|
|
179
|
+
iconWithLabel: Platform.OS === 'ios' ? {
|
|
180
|
+
marginRight: 6
|
|
181
|
+
} : {},
|
|
182
|
+
iconMaskContainer: {
|
|
183
|
+
flex: 1,
|
|
184
|
+
flexDirection: 'row',
|
|
185
|
+
justifyContent: 'center'
|
|
186
|
+
},
|
|
187
|
+
iconMaskFillerRect: {
|
|
188
|
+
flex: 1,
|
|
189
|
+
backgroundColor: '#000'
|
|
190
|
+
},
|
|
191
|
+
iconMask: {
|
|
192
|
+
height: 21,
|
|
193
|
+
width: 13,
|
|
194
|
+
marginLeft: -14.5,
|
|
195
|
+
marginVertical: 12,
|
|
196
|
+
alignSelf: 'center',
|
|
197
|
+
resizeMode: 'contain',
|
|
198
|
+
transform: [{
|
|
199
|
+
scaleX: I18nManager.isRTL ? -1 : 1
|
|
200
|
+
}]
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=HeaderBackButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["HeaderBackButton.tsx"],"names":["useTheme","React","Animated","I18nManager","Image","Platform","StyleSheet","View","MaskedView","PlatformPressable","HeaderBackButton","disabled","allowFontScaling","backImage","label","labelStyle","labelVisible","onLabelLayout","onPress","pressColor","pressOpacity","screenLayout","tintColor","customTintColor","titleLayout","truncatedLabel","accessibilityLabel","testID","style","colors","initialLabelWidth","setInitialLabelWidth","useState","undefined","select","ios","primary","default","text","handleLabelLayout","e","nativeEvent","layout","x","width","shouldTruncateLabel","renderBackImage","styles","icon","Boolean","iconWithLabel","require","renderLabel","leftLabelText","labelElement","labelWrapper","minWidth","color","OS","iconMaskContainer","iconMask","iconMaskFillerRect","handlePress","requestAnimationFrame","borderless","container","top","right","bottom","left","create","alignItems","flexDirection","hairlineWidth","marginVertical","marginHorizontal","opacity","fontSize","letterSpacing","height","marginLeft","marginRight","resizeMode","transform","scaleX","isRTL","margin","flex","justifyContent","backgroundColor","alignSelf"],"mappings":"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","sourcesContent":["import { useTheme } from '@react-navigation/native';\nimport * as React from 'react';\nimport {\n Animated,\n I18nManager,\n Image,\n LayoutChangeEvent,\n Platform,\n StyleSheet,\n View,\n} from 'react-native';\n\nimport MaskedView from '../MaskedView';\nimport PlatformPressable from '../PlatformPressable';\nimport type { HeaderBackButtonProps } from '../types';\n\nexport default function HeaderBackButton({\n disabled,\n allowFontScaling,\n backImage,\n label,\n labelStyle,\n labelVisible,\n onLabelLayout,\n onPress,\n pressColor,\n pressOpacity,\n screenLayout,\n tintColor: customTintColor,\n titleLayout,\n truncatedLabel = 'Back',\n accessibilityLabel = label && label !== 'Back' ? `${label}, back` : 'Go back',\n testID,\n style,\n}: HeaderBackButtonProps) {\n const { colors } = useTheme();\n\n const [initialLabelWidth, setInitialLabelWidth] =\n React.useState<undefined | number>(undefined);\n\n const tintColor =\n customTintColor !== undefined\n ? customTintColor\n : Platform.select({\n ios: colors.primary,\n default: colors.text,\n });\n\n const handleLabelLayout = (e: LayoutChangeEvent) => {\n onLabelLayout?.(e);\n\n setInitialLabelWidth(e.nativeEvent.layout.x + e.nativeEvent.layout.width);\n };\n\n const shouldTruncateLabel = () => {\n return (\n !label ||\n (initialLabelWidth &&\n titleLayout &&\n screenLayout &&\n (screenLayout.width - titleLayout.width) / 2 < initialLabelWidth + 26)\n );\n };\n\n const renderBackImage = () => {\n if (backImage) {\n return backImage({ tintColor });\n } else {\n return (\n <Image\n style={[\n styles.icon,\n Boolean(labelVisible) && styles.iconWithLabel,\n Boolean(tintColor) && { tintColor },\n ]}\n source={require('../assets/back-icon.png')}\n fadeDuration={0}\n />\n );\n }\n };\n\n const renderLabel = () => {\n const leftLabelText = shouldTruncateLabel() ? truncatedLabel : label;\n\n if (!labelVisible || leftLabelText === undefined) {\n return null;\n }\n\n const labelElement = (\n <View\n style={\n screenLayout\n ? // We make the button extend till the middle of the screen\n // Otherwise it appears to cut off when translating\n [styles.labelWrapper, { minWidth: screenLayout.width / 2 - 27 }]\n : null\n }\n >\n <Animated.Text\n accessible={false}\n onLayout={\n // This measurement is used to determine if we should truncate the label when it doesn't fit\n // Only measure it when label is not truncated because we want the measurement of full label\n leftLabelText === label ? handleLabelLayout : undefined\n }\n style={[\n styles.label,\n tintColor ? { color: tintColor } : null,\n labelStyle,\n ]}\n numberOfLines={1}\n allowFontScaling={!!allowFontScaling}\n >\n {leftLabelText}\n </Animated.Text>\n </View>\n );\n\n if (backImage || Platform.OS !== 'ios') {\n // When a custom backimage is specified, we can't mask the label\n // Otherwise there might be weird effect due to our mask not being the same as the image\n return labelElement;\n }\n\n return (\n <MaskedView\n maskElement={\n <View style={styles.iconMaskContainer}>\n <Image\n source={require('../assets/back-icon-mask.png')}\n style={styles.iconMask}\n />\n <View style={styles.iconMaskFillerRect} />\n </View>\n }\n >\n {labelElement}\n </MaskedView>\n );\n };\n\n const handlePress = () => onPress && requestAnimationFrame(onPress);\n\n return (\n <PlatformPressable\n disabled={disabled}\n accessible\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n testID={testID}\n onPress={disabled ? undefined : handlePress}\n pressColor={pressColor}\n pressOpacity={pressOpacity}\n android_ripple={{ borderless: true }}\n style={[styles.container, disabled && styles.disabled, style]}\n hitSlop={Platform.select({\n ios: undefined,\n default: { top: 16, right: 16, bottom: 16, left: 16 },\n })}\n >\n <React.Fragment>\n {renderBackImage()}\n {renderLabel()}\n </React.Fragment>\n </PlatformPressable>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n flexDirection: 'row',\n minWidth: StyleSheet.hairlineWidth, // Avoid collapsing when title is long\n ...Platform.select({\n ios: null,\n default: {\n marginVertical: 3,\n marginHorizontal: 11,\n },\n }),\n },\n disabled: {\n opacity: 0.5,\n },\n label: {\n fontSize: 17,\n // Title and back label are a bit different width due to title being bold\n // Adjusting the letterSpacing makes them coincide better\n letterSpacing: 0.35,\n },\n labelWrapper: {\n // These styles will make sure that the label doesn't fill the available space\n // Otherwise it messes with the measurement of the label\n flexDirection: 'row',\n alignItems: 'flex-start',\n },\n icon: Platform.select({\n ios: {\n height: 21,\n width: 13,\n marginLeft: 8,\n marginRight: 22,\n marginVertical: 12,\n resizeMode: 'contain',\n transform: [{ scaleX: I18nManager.isRTL ? -1 : 1 }],\n },\n default: {\n height: 24,\n width: 24,\n margin: 3,\n resizeMode: 'contain',\n transform: [{ scaleX: I18nManager.isRTL ? -1 : 1 }],\n },\n }),\n iconWithLabel:\n Platform.OS === 'ios'\n ? {\n marginRight: 6,\n }\n : {},\n iconMaskContainer: {\n flex: 1,\n flexDirection: 'row',\n justifyContent: 'center',\n },\n iconMaskFillerRect: {\n flex: 1,\n backgroundColor: '#000',\n },\n iconMask: {\n height: 21,\n width: 13,\n marginLeft: -14.5,\n marginVertical: 12,\n alignSelf: 'center',\n resizeMode: 'contain',\n transform: [{ scaleX: I18nManager.isRTL ? -1 : 1 }],\n },\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["HeaderBackContext.tsx"],"names":["getNamedContext","HeaderBackContext","undefined"],"mappings":"AAAA,OAAOA,eAAP,MAA4B,oBAA5B;AAEA,MAAMC,iBAAiB,GAAGD,eAAe,CACvC,mBADuC,EAEvCE,SAFuC,CAAzC;AAKA,eAAeD,iBAAf","sourcesContent":["import getNamedContext from '../getNamedContext';\n\nconst HeaderBackContext = getNamedContext<{ title: string } | undefined>(\n 'HeaderBackContext',\n undefined\n);\n\nexport default HeaderBackContext;\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
+
|
|
3
|
+
import { useTheme } from '@react-navigation/native';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { Animated, Platform, StyleSheet } from 'react-native';
|
|
6
|
+
export default function HeaderBackground({
|
|
7
|
+
style,
|
|
8
|
+
...rest
|
|
9
|
+
}) {
|
|
10
|
+
const {
|
|
11
|
+
colors
|
|
12
|
+
} = useTheme();
|
|
13
|
+
return /*#__PURE__*/React.createElement(Animated.View, _extends({
|
|
14
|
+
style: [styles.container, {
|
|
15
|
+
backgroundColor: colors.card,
|
|
16
|
+
borderBottomColor: colors.border,
|
|
17
|
+
shadowColor: colors.border
|
|
18
|
+
}, style]
|
|
19
|
+
}, rest));
|
|
20
|
+
}
|
|
21
|
+
const styles = StyleSheet.create({
|
|
22
|
+
container: {
|
|
23
|
+
flex: 1,
|
|
24
|
+
...Platform.select({
|
|
25
|
+
android: {
|
|
26
|
+
elevation: 4
|
|
27
|
+
},
|
|
28
|
+
ios: {
|
|
29
|
+
shadowOpacity: 0.85,
|
|
30
|
+
shadowRadius: 0,
|
|
31
|
+
shadowOffset: {
|
|
32
|
+
width: 0,
|
|
33
|
+
height: StyleSheet.hairlineWidth
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
default: {
|
|
37
|
+
borderBottomWidth: StyleSheet.hairlineWidth
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=HeaderBackground.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["HeaderBackground.tsx"],"names":["useTheme","React","Animated","Platform","StyleSheet","HeaderBackground","style","rest","colors","styles","container","backgroundColor","card","borderBottomColor","border","shadowColor","create","flex","select","android","elevation","ios","shadowOpacity","shadowRadius","shadowOffset","width","height","hairlineWidth","default","borderBottomWidth"],"mappings":";;AAAA,SAASA,QAAT,QAAyB,0BAAzB;AACA,OAAO,KAAKC,KAAZ,MAAuB,OAAvB;AACA,SACEC,QADF,EAEEC,QAFF,EAIEC,UAJF,QAOO,cAPP;AAcA,eAAe,SAASC,gBAAT,CAA0B;AAAEC,EAAAA,KAAF;AAAS,KAAGC;AAAZ,CAA1B,EAAqD;AAClE,QAAM;AAAEC,IAAAA;AAAF,MAAaR,QAAQ,EAA3B;AAEA,sBACE,oBAAC,QAAD,CAAU,IAAV;AACE,IAAA,KAAK,EAAE,CACLS,MAAM,CAACC,SADF,EAEL;AACEC,MAAAA,eAAe,EAAEH,MAAM,CAACI,IAD1B;AAEEC,MAAAA,iBAAiB,EAAEL,MAAM,CAACM,MAF5B;AAGEC,MAAAA,WAAW,EAAEP,MAAM,CAACM;AAHtB,KAFK,EAOLR,KAPK;AADT,KAUMC,IAVN,EADF;AAcD;AAED,MAAME,MAAM,GAAGL,UAAU,CAACY,MAAX,CAAkB;AAC/BN,EAAAA,SAAS,EAAE;AACTO,IAAAA,IAAI,EAAE,CADG;AAET,OAAGd,QAAQ,CAACe,MAAT,CAAgB;AACjBC,MAAAA,OAAO,EAAE;AACPC,QAAAA,SAAS,EAAE;AADJ,OADQ;AAIjBC,MAAAA,GAAG,EAAE;AACHC,QAAAA,aAAa,EAAE,IADZ;AAEHC,QAAAA,YAAY,EAAE,CAFX;AAGHC,QAAAA,YAAY,EAAE;AACZC,UAAAA,KAAK,EAAE,CADK;AAEZC,UAAAA,MAAM,EAAEtB,UAAU,CAACuB;AAFP;AAHX,OAJY;AAYjBC,MAAAA,OAAO,EAAE;AACPC,QAAAA,iBAAiB,EAAEzB,UAAU,CAACuB;AADvB;AAZQ,KAAhB;AAFM;AADoB,CAAlB,CAAf","sourcesContent":["import { useTheme } from '@react-navigation/native';\nimport * as React from 'react';\nimport {\n Animated,\n Platform,\n StyleProp,\n StyleSheet,\n ViewProps,\n ViewStyle,\n} from 'react-native';\n\ntype Props = ViewProps & {\n style?: Animated.WithAnimatedValue<StyleProp<ViewStyle>>;\n children?: React.ReactNode;\n};\n\nexport default function HeaderBackground({ style, ...rest }: Props) {\n const { colors } = useTheme();\n\n return (\n <Animated.View\n style={[\n styles.container,\n {\n backgroundColor: colors.card,\n borderBottomColor: colors.border,\n shadowColor: colors.border,\n },\n style,\n ]}\n {...rest}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n ...Platform.select({\n android: {\n elevation: 4,\n },\n ios: {\n shadowOpacity: 0.85,\n shadowRadius: 0,\n shadowOffset: {\n width: 0,\n height: StyleSheet.hairlineWidth,\n },\n },\n default: {\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n }),\n },\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["HeaderHeightContext.tsx"],"names":["getNamedContext","HeaderHeightContext","undefined"],"mappings":"AAAA,OAAOA,eAAP,MAA4B,oBAA5B;AAEA,MAAMC,mBAAmB,GAAGD,eAAe,CACzC,qBADyC,EAEzCE,SAFyC,CAA3C;AAKA,eAAeD,mBAAf","sourcesContent":["import getNamedContext from '../getNamedContext';\n\nconst HeaderHeightContext = getNamedContext<number | undefined>(\n 'HeaderHeightContext',\n undefined\n);\n\nexport default HeaderHeightContext;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["HeaderShownContext.tsx"],"names":["getNamedContext","HeaderShownContext"],"mappings":"AAAA,OAAOA,eAAP,MAA4B,oBAA5B;AAEA,MAAMC,kBAAkB,GAAGD,eAAe,CAAC,oBAAD,EAAuB,KAAvB,CAA1C;AAEA,eAAeC,kBAAf","sourcesContent":["import getNamedContext from '../getNamedContext';\n\nconst HeaderShownContext = getNamedContext('HeaderShownContext', false);\n\nexport default HeaderShownContext;\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
+
|
|
3
|
+
import { useTheme } from '@react-navigation/native';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { Animated, Platform, StyleSheet } from 'react-native';
|
|
6
|
+
export default function HeaderTitle({
|
|
7
|
+
tintColor,
|
|
8
|
+
style,
|
|
9
|
+
...rest
|
|
10
|
+
}) {
|
|
11
|
+
const {
|
|
12
|
+
colors
|
|
13
|
+
} = useTheme();
|
|
14
|
+
return /*#__PURE__*/React.createElement(Animated.Text, _extends({
|
|
15
|
+
accessibilityRole: "header",
|
|
16
|
+
"aria-level": "1",
|
|
17
|
+
numberOfLines: 1
|
|
18
|
+
}, rest, {
|
|
19
|
+
style: [styles.title, {
|
|
20
|
+
color: tintColor === undefined ? colors.text : tintColor
|
|
21
|
+
}, style]
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
const styles = StyleSheet.create({
|
|
25
|
+
title: Platform.select({
|
|
26
|
+
ios: {
|
|
27
|
+
fontSize: 17,
|
|
28
|
+
fontWeight: '600'
|
|
29
|
+
},
|
|
30
|
+
android: {
|
|
31
|
+
fontSize: 20,
|
|
32
|
+
fontFamily: 'sans-serif-medium',
|
|
33
|
+
fontWeight: 'normal'
|
|
34
|
+
},
|
|
35
|
+
default: {
|
|
36
|
+
fontSize: 18,
|
|
37
|
+
fontWeight: '500'
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=HeaderTitle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["HeaderTitle.tsx"],"names":["useTheme","React","Animated","Platform","StyleSheet","HeaderTitle","tintColor","style","rest","colors","styles","title","color","undefined","text","create","select","ios","fontSize","fontWeight","android","fontFamily","default"],"mappings":";;AAAA,SAASA,QAAT,QAAyB,0BAAzB;AACA,OAAO,KAAKC,KAAZ,MAAuB,OAAvB;AACA,SACEC,QADF,EAEEC,QAFF,EAIEC,UAJF,QAOO,cAPP;AAeA,eAAe,SAASC,WAAT,CAAqB;AAAEC,EAAAA,SAAF;AAAaC,EAAAA,KAAb;AAAoB,KAAGC;AAAvB,CAArB,EAA2D;AACxE,QAAM;AAAEC,IAAAA;AAAF,MAAaT,QAAQ,EAA3B;AAEA,sBACE,oBAAC,QAAD,CAAU,IAAV;AACE,IAAA,iBAAiB,EAAC,QADpB;AAEE,kBAAW,GAFb;AAGE,IAAA,aAAa,EAAE;AAHjB,KAIMQ,IAJN;AAKE,IAAA,KAAK,EAAE,CACLE,MAAM,CAACC,KADF,EAEL;AAAEC,MAAAA,KAAK,EAAEN,SAAS,KAAKO,SAAd,GAA0BJ,MAAM,CAACK,IAAjC,GAAwCR;AAAjD,KAFK,EAGLC,KAHK;AALT,KADF;AAaD;AAED,MAAMG,MAAM,GAAGN,UAAU,CAACW,MAAX,CAAkB;AAC/BJ,EAAAA,KAAK,EAAER,QAAQ,CAACa,MAAT,CAAgB;AACrBC,IAAAA,GAAG,EAAE;AACHC,MAAAA,QAAQ,EAAE,EADP;AAEHC,MAAAA,UAAU,EAAE;AAFT,KADgB;AAKrBC,IAAAA,OAAO,EAAE;AACPF,MAAAA,QAAQ,EAAE,EADH;AAEPG,MAAAA,UAAU,EAAE,mBAFL;AAGPF,MAAAA,UAAU,EAAE;AAHL,KALY;AAUrBG,IAAAA,OAAO,EAAE;AACPJ,MAAAA,QAAQ,EAAE,EADH;AAEPC,MAAAA,UAAU,EAAE;AAFL;AAVY,GAAhB;AADwB,CAAlB,CAAf","sourcesContent":["import { useTheme } from '@react-navigation/native';\nimport * as React from 'react';\nimport {\n Animated,\n Platform,\n StyleProp,\n StyleSheet,\n TextProps,\n TextStyle,\n} from 'react-native';\n\ntype Props = Omit<TextProps, 'style'> & {\n tintColor?: string;\n children?: string;\n style?: Animated.WithAnimatedValue<StyleProp<TextStyle>>;\n};\n\nexport default function HeaderTitle({ tintColor, style, ...rest }: Props) {\n const { colors } = useTheme();\n\n return (\n <Animated.Text\n accessibilityRole=\"header\"\n aria-level=\"1\"\n numberOfLines={1}\n {...rest}\n style={[\n styles.title,\n { color: tintColor === undefined ? colors.text : tintColor },\n style,\n ]}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n title: Platform.select({\n ios: {\n fontSize: 17,\n fontWeight: '600',\n },\n android: {\n fontSize: 20,\n fontFamily: 'sans-serif-medium',\n fontWeight: 'normal',\n },\n default: {\n fontSize: 18,\n fontWeight: '500',\n },\n }),\n});\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Platform } from 'react-native';
|
|
2
|
+
export default function getDefaultHeaderHeight(layout, modalPresentation, statusBarHeight) {
|
|
3
|
+
let headerHeight;
|
|
4
|
+
const isLandscape = layout.width > layout.height;
|
|
5
|
+
|
|
6
|
+
if (Platform.OS === 'ios') {
|
|
7
|
+
if (Platform.isPad) {
|
|
8
|
+
if (modalPresentation) {
|
|
9
|
+
headerHeight = 56;
|
|
10
|
+
} else {
|
|
11
|
+
headerHeight = 50;
|
|
12
|
+
}
|
|
13
|
+
} else {
|
|
14
|
+
if (isLandscape) {
|
|
15
|
+
headerHeight = 32;
|
|
16
|
+
} else {
|
|
17
|
+
if (modalPresentation) {
|
|
18
|
+
headerHeight = 56;
|
|
19
|
+
} else {
|
|
20
|
+
headerHeight = 44;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
} else if (Platform.OS === 'android') {
|
|
25
|
+
headerHeight = 56;
|
|
26
|
+
} else {
|
|
27
|
+
headerHeight = 64;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return headerHeight + statusBarHeight;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=getDefaultHeaderHeight.js.map
|