react-native-terra-ui 0.11.11 → 0.11.13
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/CHANGELOG.md +16 -0
- package/TerraUI.podspec +16 -0
- package/ios/TerraHeaderInsetsComponentView.h +4 -0
- package/ios/TerraHeaderInsetsComponentView.mm +93 -0
- package/lib/module/components/header/hooks/use-header-color.js +16 -0
- package/lib/module/components/header/hooks/use-header-color.js.map +1 -0
- package/lib/module/components/header/hooks/use-large-title-header.js +81 -0
- package/lib/module/components/header/hooks/use-large-title-header.js.map +1 -0
- package/lib/module/components/header/parts/HeaderAccessory.js +21 -6
- package/lib/module/components/header/parts/HeaderAccessory.js.map +1 -1
- package/lib/module/components/header/parts/HeaderBar.js +140 -0
- package/lib/module/components/header/parts/HeaderBar.js.map +1 -0
- package/lib/module/components/header/parts/HeaderGradientOverlay.js +5 -3
- package/lib/module/components/header/parts/HeaderGradientOverlay.js.map +1 -1
- package/lib/module/components/header/parts/HeaderSurface.js +8 -14
- package/lib/module/components/header/parts/HeaderSurface.js.map +1 -1
- package/lib/module/components/header/parts/HeaderWindowInsets.ios.js +29 -0
- package/lib/module/components/header/parts/HeaderWindowInsets.ios.js.map +1 -0
- package/lib/module/components/header/parts/HeaderWindowInsets.js +7 -0
- package/lib/module/components/header/parts/HeaderWindowInsets.js.map +1 -0
- package/lib/module/components/header/variants/LargeTitleHeader/index.js +51 -386
- package/lib/module/components/header/variants/LargeTitleHeader/index.js.map +1 -1
- package/lib/module/components/header/variants/LargeTitleHeader/parts/LargeTitleContent.js +72 -0
- package/lib/module/components/header/variants/LargeTitleHeader/parts/LargeTitleContent.js.map +1 -0
- package/lib/module/components/header/variants/TitleHeader/index.js +32 -160
- package/lib/module/components/header/variants/TitleHeader/index.js.map +1 -1
- package/lib/module/components/surface/Surface.js +2 -0
- package/lib/module/components/surface/Surface.js.map +1 -1
- package/lib/module/specs/TerraHeaderInsetsNativeComponent.ts +12 -0
- package/lib/typescript/src/components/header/hooks/use-header-color.d.ts +4 -0
- package/lib/typescript/src/components/header/hooks/use-header-color.d.ts.map +1 -0
- package/lib/typescript/src/components/header/hooks/use-large-title-header.d.ts +36 -0
- package/lib/typescript/src/components/header/hooks/use-large-title-header.d.ts.map +1 -0
- package/lib/typescript/src/components/header/parts/HeaderAccessory.d.ts +8 -5
- package/lib/typescript/src/components/header/parts/HeaderAccessory.d.ts.map +1 -1
- package/lib/typescript/src/components/header/parts/HeaderBar.d.ts +17 -0
- package/lib/typescript/src/components/header/parts/HeaderBar.d.ts.map +1 -0
- package/lib/typescript/src/components/header/parts/HeaderGradientOverlay.d.ts +3 -1
- package/lib/typescript/src/components/header/parts/HeaderGradientOverlay.d.ts.map +1 -1
- package/lib/typescript/src/components/header/parts/HeaderSurface.d.ts +5 -9
- package/lib/typescript/src/components/header/parts/HeaderSurface.d.ts.map +1 -1
- package/lib/typescript/src/components/header/parts/HeaderWindowInsets.d.ts +9 -0
- package/lib/typescript/src/components/header/parts/HeaderWindowInsets.d.ts.map +1 -0
- package/lib/typescript/src/components/header/parts/HeaderWindowInsets.ios.d.ts +3 -0
- package/lib/typescript/src/components/header/parts/HeaderWindowInsets.ios.d.ts.map +1 -0
- package/lib/typescript/src/components/header/variants/LargeTitleHeader/index.d.ts +3 -23
- package/lib/typescript/src/components/header/variants/LargeTitleHeader/index.d.ts.map +1 -1
- package/lib/typescript/src/components/header/variants/LargeTitleHeader/parts/LargeTitleContent.d.ts +11 -0
- package/lib/typescript/src/components/header/variants/LargeTitleHeader/parts/LargeTitleContent.d.ts.map +1 -0
- package/lib/typescript/src/components/header/variants/TitleHeader/index.d.ts +3 -19
- package/lib/typescript/src/components/header/variants/TitleHeader/index.d.ts.map +1 -1
- package/lib/typescript/src/components/surface/Surface.d.ts.map +1 -1
- package/lib/typescript/src/specs/TerraHeaderInsetsNativeComponent.d.ts +10 -0
- package/lib/typescript/src/specs/TerraHeaderInsetsNativeComponent.d.ts.map +1 -0
- package/package.json +14 -1
- package/react-native.config.js +7 -0
- package/src/components/header/hooks/use-header-color.ts +14 -0
- package/src/components/header/hooks/use-large-title-header.ts +78 -0
- package/src/components/header/parts/HeaderAccessory.tsx +26 -7
- package/src/components/header/parts/HeaderBar.tsx +139 -0
- package/src/components/header/parts/HeaderGradientOverlay.tsx +9 -3
- package/src/components/header/parts/HeaderSurface.tsx +11 -17
- package/src/components/header/parts/HeaderWindowInsets.ios.tsx +24 -0
- package/src/components/header/parts/HeaderWindowInsets.tsx +8 -0
- package/src/components/header/variants/LargeTitleHeader/index.tsx +44 -369
- package/src/components/header/variants/LargeTitleHeader/parts/LargeTitleContent.tsx +88 -0
- package/src/components/header/variants/TitleHeader/index.tsx +32 -146
- package/src/components/surface/Surface.tsx +2 -1
- package/src/specs/TerraHeaderInsetsNativeComponent.ts +12 -0
|
@@ -1,19 +1,16 @@
|
|
|
1
|
-
import { type ReactNode,
|
|
2
|
-
import {
|
|
1
|
+
import { type ReactNode, useContext } from "react";
|
|
2
|
+
import { View } from "react-native";
|
|
3
3
|
|
|
4
|
-
import { StyleSheet
|
|
4
|
+
import { StyleSheet } from "react-native-unistyles";
|
|
5
5
|
|
|
6
6
|
import type { ColorToken } from "#theme/types";
|
|
7
|
-
import { resolveThemeColor } from "#utils/resolve-theme-color";
|
|
8
|
-
import { FONT_WEIGHT_VALUE } from "#utils/typography";
|
|
9
7
|
import { useHeaderBackground } from "../../../screen/parts/ScreenHeaderAppearance";
|
|
10
8
|
import { ScreenContext } from "../../../screen/ScreenContext";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
9
|
+
import type { HeaderDismissProps } from "../../header-buttons";
|
|
10
|
+
import { useHeaderColor } from "../../hooks/use-header-color";
|
|
13
11
|
import { HeaderAccessory } from "../../parts/HeaderAccessory";
|
|
14
|
-
import {
|
|
12
|
+
import { HeaderBar } from "../../parts/HeaderBar";
|
|
15
13
|
import type { HeaderAccessoryPadding } from "../../types";
|
|
16
|
-
import { isCustomTitle, isTextTitle } from "../../utils";
|
|
17
14
|
|
|
18
15
|
export interface TitleHeaderProps extends HeaderDismissProps {
|
|
19
16
|
/**
|
|
@@ -56,23 +53,7 @@ export interface TitleHeaderProps extends HeaderDismissProps {
|
|
|
56
53
|
bg?: ColorToken;
|
|
57
54
|
}
|
|
58
55
|
|
|
59
|
-
/**
|
|
60
|
-
* Compact title bar (leading slot · title · trailing slot) with a top safe-area
|
|
61
|
-
* inset outside Screen. Within Screen, the root owns safe-area clearance. The inline counterpart to `Header.LargeTitle`; use it for screens that
|
|
62
|
-
* don't need a collapsing large title.
|
|
63
|
-
*
|
|
64
|
-
* @example
|
|
65
|
-
* ```tsx
|
|
66
|
-
* <Screen.Header>
|
|
67
|
-
* <Header.Title
|
|
68
|
-
* title="Stats"
|
|
69
|
-
* trailingActions={
|
|
70
|
-
* <Toolbar.Button icon="add" accessibilityLabel="Add" onPress={add} />
|
|
71
|
-
* }
|
|
72
|
-
* />
|
|
73
|
-
* </Screen.Header>
|
|
74
|
-
* ```
|
|
75
|
-
*/
|
|
56
|
+
/** Compact header. Screen owns the safe area when present; standalone headers reserve it here. */
|
|
76
57
|
export function TitleHeader({
|
|
77
58
|
title,
|
|
78
59
|
leadingActions,
|
|
@@ -81,137 +62,42 @@ export function TitleHeader({
|
|
|
81
62
|
RightToolbar,
|
|
82
63
|
accessory,
|
|
83
64
|
accessoryPadding = "x",
|
|
84
|
-
dismissAction = "none",
|
|
85
|
-
navigation,
|
|
86
|
-
onDismiss,
|
|
87
65
|
titleAlignment = "center",
|
|
88
66
|
background,
|
|
89
67
|
bg,
|
|
68
|
+
...dismissProps
|
|
90
69
|
}: TitleHeaderProps) {
|
|
91
|
-
const { theme } = useUnistyles();
|
|
92
|
-
|
|
93
70
|
const screen = useContext(ScreenContext);
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
(colorToken ? resolveThemeColor(colorToken, theme) : screen?.background) ?? theme.color["surface.canvas"];
|
|
97
|
-
const leadingContent = leadingActions !== undefined ? leadingActions : LeftToolbar;
|
|
98
|
-
const trailingContent = trailingActions !== undefined ? trailingActions : RightToolbar;
|
|
99
|
-
const setAccessoryInset = screen?.setHeaderAccessoryHeight;
|
|
100
|
-
// Compact headers always reserve the accessory height as top padding.
|
|
101
|
-
const handleAccessoryHeightChange = useCallback(
|
|
102
|
-
(height: number) => setAccessoryInset?.(height),
|
|
103
|
-
[setAccessoryInset]
|
|
104
|
-
);
|
|
105
|
-
const isTransparent = bgColor === "transparent";
|
|
106
|
-
useHeaderBackground(bgColor);
|
|
107
|
-
styles.useVariants({ titleAlignment });
|
|
108
|
-
|
|
109
|
-
const leading =
|
|
110
|
-
dismissAction === "back" ? (
|
|
111
|
-
<>
|
|
112
|
-
<HeaderDismissButton dismissAction={dismissAction} navigation={navigation} onDismiss={onDismiss} />
|
|
113
|
-
{leadingContent}
|
|
114
|
-
</>
|
|
115
|
-
) : (
|
|
116
|
-
leadingContent
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
const trailing =
|
|
120
|
-
dismissAction === "close" ? (
|
|
121
|
-
<>
|
|
122
|
-
{trailingContent}
|
|
123
|
-
<HeaderDismissButton dismissAction={dismissAction} navigation={navigation} onDismiss={onDismiss} />
|
|
124
|
-
</>
|
|
125
|
-
) : (
|
|
126
|
-
trailingContent
|
|
127
|
-
);
|
|
71
|
+
const color = useHeaderColor(background ?? bg);
|
|
72
|
+
useHeaderBackground(color);
|
|
128
73
|
return (
|
|
129
74
|
<View style={styles.container}>
|
|
130
|
-
<View style={styles.safeArea(
|
|
131
|
-
<
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
)}
|
|
149
|
-
</View>
|
|
75
|
+
<View style={styles.safeArea(color, screen !== null)} />
|
|
76
|
+
<HeaderBar
|
|
77
|
+
{...dismissProps}
|
|
78
|
+
title={title}
|
|
79
|
+
titleAlignment={titleAlignment}
|
|
80
|
+
color={color}
|
|
81
|
+
leading={leadingActions !== undefined ? leadingActions : LeftToolbar}
|
|
82
|
+
trailing={trailingActions !== undefined ? trailingActions : RightToolbar}
|
|
83
|
+
/>
|
|
84
|
+
{accessory != null && (
|
|
85
|
+
<HeaderAccessory
|
|
86
|
+
padding={accessoryPadding}
|
|
87
|
+
color={color}
|
|
88
|
+
onHeightChange={screen?.setHeaderAccessoryHeight}
|
|
89
|
+
>
|
|
90
|
+
{accessory}
|
|
91
|
+
</HeaderAccessory>
|
|
92
|
+
)}
|
|
150
93
|
</View>
|
|
151
94
|
);
|
|
152
95
|
}
|
|
153
96
|
|
|
154
|
-
const styles = StyleSheet.create((
|
|
155
|
-
container: {
|
|
156
|
-
|
|
157
|
-
top: 0,
|
|
158
|
-
left: 0,
|
|
159
|
-
right: 0,
|
|
160
|
-
zIndex: 1000,
|
|
161
|
-
},
|
|
162
|
-
safeArea: (isTransparent: boolean, bgColor: string, withinScreen: boolean) => ({
|
|
97
|
+
const styles = StyleSheet.create((_, runtime) => ({
|
|
98
|
+
container: { position: "absolute", top: 0, left: 0, right: 0, zIndex: 1000 },
|
|
99
|
+
safeArea: (color: string, withinScreen: boolean) => ({
|
|
163
100
|
height: withinScreen ? 0 : runtime.insets.top,
|
|
164
|
-
backgroundColor:
|
|
101
|
+
backgroundColor: color,
|
|
165
102
|
}),
|
|
166
|
-
// Anchors the absolutely positioned surface over the bar and the accessory both.
|
|
167
|
-
barGroup: { position: "relative" },
|
|
168
|
-
bar: {
|
|
169
|
-
height: theme.layout.header.height,
|
|
170
|
-
flexDirection: "row",
|
|
171
|
-
alignItems: "center",
|
|
172
|
-
paddingHorizontal: theme.layout.screen.padding.x,
|
|
173
|
-
gap: theme.spacing["3"],
|
|
174
|
-
justifyContent: "space-between",
|
|
175
|
-
},
|
|
176
|
-
// A centered title is absolutely positioned, so it leaves the flex row. With
|
|
177
|
-
// no leading slot the trailing toolbar would be the only in-flow child and
|
|
178
|
-
// `space-between` would park it on the left — the auto margin pins it right.
|
|
179
|
-
trailing: {
|
|
180
|
-
justifyContent: "flex-end",
|
|
181
|
-
variants: {
|
|
182
|
-
titleAlignment: {
|
|
183
|
-
center: { marginLeft: "auto" },
|
|
184
|
-
left: {},
|
|
185
|
-
},
|
|
186
|
-
},
|
|
187
|
-
},
|
|
188
|
-
titleContainer: {
|
|
189
|
-
variants: {
|
|
190
|
-
titleAlignment: {
|
|
191
|
-
center: {
|
|
192
|
-
position: "absolute",
|
|
193
|
-
left: 0,
|
|
194
|
-
right: 0,
|
|
195
|
-
alignItems: "center",
|
|
196
|
-
},
|
|
197
|
-
left: {
|
|
198
|
-
flex: 1,
|
|
199
|
-
alignItems: "flex-start",
|
|
200
|
-
},
|
|
201
|
-
},
|
|
202
|
-
},
|
|
203
|
-
},
|
|
204
|
-
title: {
|
|
205
|
-
fontSize: theme.typography.variants["title-md"].fontSize,
|
|
206
|
-
lineHeight: theme.typography.variants["title-md"].lineHeight,
|
|
207
|
-
letterSpacing: theme.typography.variants["title-md"].letterSpacing,
|
|
208
|
-
fontWeight: FONT_WEIGHT_VALUE[theme.typography.variants["title-md"].fontWeight],
|
|
209
|
-
color: (theme.color as unknown as Record<string, string | undefined>)["text.primary"] ?? "",
|
|
210
|
-
variants: {
|
|
211
|
-
titleAlignment: {
|
|
212
|
-
center: { textAlign: "center" },
|
|
213
|
-
left: { textAlign: "left" },
|
|
214
|
-
},
|
|
215
|
-
},
|
|
216
|
-
},
|
|
217
103
|
}));
|
|
@@ -69,7 +69,7 @@ const resolveElevation = (variant: SurfaceVariant, elevation?: ElevationKey): El
|
|
|
69
69
|
* ```
|
|
70
70
|
*/
|
|
71
71
|
export const Surface = forwardRef<ComponentRef<typeof View>, SurfaceProps>(function Surface(
|
|
72
|
-
{ variant = "base", elevation, radius, borderWidth, borderColor, ...rest },
|
|
72
|
+
{ variant = "base", p = "3", elevation, radius, borderWidth, borderColor, ...rest },
|
|
73
73
|
ref
|
|
74
74
|
) {
|
|
75
75
|
const variantBorder = VARIANT_BORDER[variant];
|
|
@@ -78,6 +78,7 @@ export const Surface = forwardRef<ComponentRef<typeof View>, SurfaceProps>(funct
|
|
|
78
78
|
<Box
|
|
79
79
|
ref={ref}
|
|
80
80
|
background={VARIANT_BG[variant]}
|
|
81
|
+
p={p}
|
|
81
82
|
radius={radius ?? getDefaultRadius("surface")}
|
|
82
83
|
borderWidth={borderWidth ?? variantBorder.borderWidth}
|
|
83
84
|
borderColor={borderColor ?? variantBorder.borderColor}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CodegenTypes, ViewProps } from "react-native";
|
|
2
|
+
import { codegenNativeComponent } from "react-native";
|
|
3
|
+
|
|
4
|
+
export interface NativeProps extends ViewProps {
|
|
5
|
+
onInsetsChange?: CodegenTypes.DirectEventHandler<
|
|
6
|
+
Readonly<{ left: CodegenTypes.Double; right: CodegenTypes.Double }>
|
|
7
|
+
>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default codegenNativeComponent<NativeProps>("TerraHeaderInsets", {
|
|
11
|
+
excludedPlatforms: ["android"],
|
|
12
|
+
});
|