create-expo-stack 2.3.15 → 2.4.0-next.1fb5698
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/README.md +7 -1
- package/build/commands/create-expo-stack.js +14 -1
- package/build/templates/base/App.tsx.ejs +12 -0
- package/build/templates/base/package.json.ejs +5 -0
- package/build/templates/packages/expo-router/drawer/app/(drawer)/index.tsx.ejs +10 -1
- package/build/templates/packages/expo-router/drawer/app/(drawer)/news.tsx.ejs +10 -1
- package/build/templates/packages/expo-router/drawer/app/[...unmatched].tsx.ejs +25 -0
- package/build/templates/packages/expo-router/drawer/app/_layout.tsx.ejs +10 -2
- package/build/templates/packages/expo-router/stack/app/[...unmatched].tsx.ejs +25 -0
- package/build/templates/packages/expo-router/stack/app/_layout.tsx.ejs +9 -3
- package/build/templates/packages/expo-router/stack/app/details.tsx.ejs +26 -0
- package/build/templates/packages/expo-router/stack/app/index.tsx.ejs +51 -2
- package/build/templates/packages/expo-router/tabs/app/(tabs)/index.tsx.ejs +10 -0
- package/build/templates/packages/expo-router/tabs/app/(tabs)/two.tsx.ejs +10 -0
- package/build/templates/packages/expo-router/tabs/app/[...unmatched].tsx.ejs +25 -0
- package/build/templates/packages/expo-router/tabs/app/_layout.tsx.ejs +8 -0
- package/build/templates/packages/expo-router/tabs/app/modal.tsx.ejs +12 -0
- package/build/templates/packages/expo-router/tabs/components/edit-screen-info.tsx.ejs +16 -1
- package/build/templates/packages/react-navigation/App.tsx.ejs +11 -1
- package/build/templates/packages/react-navigation/components/edit-screen-info.tsx.ejs +23 -1
- package/build/templates/packages/react-navigation/navigation/index.tsx.ejs +19 -3
- package/build/templates/packages/react-navigation/navigation/tab-navigator.tsx.ejs +6 -2
- package/build/templates/packages/react-navigation/screens/details.tsx.ejs +13 -0
- package/build/templates/packages/react-navigation/screens/modal.tsx.ejs +25 -1
- package/build/templates/packages/react-navigation/screens/one.tsx.ejs +22 -0
- package/build/templates/packages/react-navigation/screens/overview.tsx.ejs +43 -0
- package/build/templates/packages/react-navigation/screens/two.tsx.ejs +23 -1
- package/build/templates/packages/restyle/theme/Box.tsx.ejs +6 -0
- package/build/templates/packages/restyle/theme/Text.tsx.ejs +6 -0
- package/build/templates/packages/restyle/theme/index.ts.ejs +6 -0
- package/build/templates/packages/restyle/theme/theme.ts.ejs +67 -0
- package/build/types/types.d.ts +1 -1
- package/build/types.js +3 -2
- package/build/utilities/configureProjectFiles.js +12 -1
- package/build/utilities/generateProjectFiles.js +4 -1
- package/build/utilities/runCLI.js +6 -2
- package/build/utilities/showHelp.js +2 -1
- package/package.json +66 -66
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import React from "react";
|
|
2
1
|
<% if (props.stylingPackage?.name === "nativewind") { %>
|
|
3
2
|
import { Text, View } from "react-native";
|
|
4
3
|
<% } else if (props.stylingPackage?.name === "tamagui") { %>
|
|
5
4
|
import { YStack, H4, Paragraph } from "tamagui"
|
|
5
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
6
|
+
import { Box, Text } from 'theme';
|
|
6
7
|
<% } else { %>
|
|
7
8
|
import { StyleSheet, Text, View } from "react-native";
|
|
8
9
|
<% } %>
|
|
@@ -40,6 +41,20 @@ export default function EditScreenInfo({ path }: { path: string }) {
|
|
|
40
41
|
</YStack>
|
|
41
42
|
</YStack>
|
|
42
43
|
);
|
|
44
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
45
|
+
return (
|
|
46
|
+
<Box alignItems="center" marginHorizontal="xl_64">
|
|
47
|
+
<Text variant="body" lineHeight={24} textAlign="center">
|
|
48
|
+
Open up the code for this screen:
|
|
49
|
+
</Text>
|
|
50
|
+
<Box borderRadius="s_3" paddingHorizontal="xs_4" marginVertical="s_8">
|
|
51
|
+
<Text>{path}</Text>
|
|
52
|
+
</Box>
|
|
53
|
+
<Text variant="body" lineHeight={24} textAlign="center">
|
|
54
|
+
Change any of the text, save the file, and your app will automatically update.
|
|
55
|
+
</Text>
|
|
56
|
+
</Box>
|
|
57
|
+
);
|
|
43
58
|
<% } else { %>
|
|
44
59
|
return (
|
|
45
60
|
<View>
|
|
@@ -8,7 +8,11 @@ import "react-native-gesture-handler";
|
|
|
8
8
|
import config from './tamagui.config'
|
|
9
9
|
|
|
10
10
|
SplashScreen.preventAutoHideAsync();
|
|
11
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
12
|
+
import { ThemeProvider } from '@shopify/restyle';
|
|
13
|
+
import { theme } from 'theme';
|
|
11
14
|
<% } %>
|
|
15
|
+
|
|
12
16
|
import RootStack from "./src/navigation";
|
|
13
17
|
|
|
14
18
|
export default function App() {
|
|
@@ -33,7 +37,13 @@ export default function App() {
|
|
|
33
37
|
<RootStack />
|
|
34
38
|
</TamaguiProvider>
|
|
35
39
|
);
|
|
36
|
-
<% } else { %>
|
|
40
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
41
|
+
return (
|
|
42
|
+
<ThemeProvider theme={theme}>
|
|
43
|
+
<RootStack />
|
|
44
|
+
</ThemeProvider>
|
|
45
|
+
);
|
|
46
|
+
<% } else { %>
|
|
37
47
|
return <RootStack />;
|
|
38
48
|
<% } %>
|
|
39
49
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
<% if (props.stylingPackage?.name === "nativewind") { %>
|
|
3
3
|
import { Text, View } from "react-native";
|
|
4
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
5
|
+
import { Box, Text } from 'theme';
|
|
4
6
|
<% } else { %>
|
|
5
7
|
import { StyleSheet, Text, View } from "react-native";
|
|
6
8
|
<% } %>
|
|
@@ -30,6 +32,26 @@ import React from "react";
|
|
|
30
32
|
</View>
|
|
31
33
|
);
|
|
32
34
|
}
|
|
35
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
36
|
+
export default function EditScreenInfo({ path }: { path: string }) {
|
|
37
|
+
return (
|
|
38
|
+
<Box>
|
|
39
|
+
<Box alignItems="center" marginHorizontal="xl_64">
|
|
40
|
+
<Text variant="body" lineHeight={24} textAlign="center">
|
|
41
|
+
Open up the code for this screen:
|
|
42
|
+
</Text>
|
|
43
|
+
|
|
44
|
+
<Box borderRadius="s_3" paddingHorizontal="xs_4" marginVertical="s_8">
|
|
45
|
+
<Text>{path}</Text>
|
|
46
|
+
</Box>
|
|
47
|
+
|
|
48
|
+
<Text variant="body" lineHeight={24} textAlign="center">
|
|
49
|
+
Change any of the text, save the file, and your app will automatically update.
|
|
50
|
+
</Text>
|
|
51
|
+
</Box>
|
|
52
|
+
</Box>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
33
55
|
<% } else { %>
|
|
34
56
|
export default function EditScreenInfo({ path }: { path: string }) {
|
|
35
57
|
return (
|
|
@@ -66,7 +88,7 @@ import React from "react";
|
|
|
66
88
|
helpLink: "py-4",
|
|
67
89
|
helpLinkText: "text-center"
|
|
68
90
|
};
|
|
69
|
-
<% } else { %>
|
|
91
|
+
<% } else if (props.stylingPackage?.name !== "restyle") { %>
|
|
70
92
|
const styles = StyleSheet.create({
|
|
71
93
|
codeHighlightContainer: {
|
|
72
94
|
borderRadius: 3,
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
import { Text, View } from "react-native";
|
|
7
7
|
<% } else if (props.stylingPackage?.name === "tamagui") { %>
|
|
8
8
|
import { Button, Text } from "tamagui";
|
|
9
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
10
|
+
import { Box, Text, useTheme } from 'theme';
|
|
9
11
|
<% } else { %>
|
|
10
12
|
import { Text, View, StyleSheet } from "react-native";
|
|
11
13
|
<% } %>
|
|
@@ -21,6 +23,9 @@
|
|
|
21
23
|
const Stack = createStackNavigator<RootStackParamList>();
|
|
22
24
|
|
|
23
25
|
export default function RootStack() {
|
|
26
|
+
<% if (props.stylingPackage?.name === "restyle") { %>
|
|
27
|
+
const { colors } = useTheme();
|
|
28
|
+
<% } %>
|
|
24
29
|
return (
|
|
25
30
|
<NavigationContainer>
|
|
26
31
|
<Stack.Navigator initialRouteName="Overview">
|
|
@@ -53,6 +58,17 @@
|
|
|
53
58
|
</Button>
|
|
54
59
|
),
|
|
55
60
|
})}
|
|
61
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
62
|
+
options={({ navigation }) => ({
|
|
63
|
+
headerLeft: () => (
|
|
64
|
+
<Box flexDirection="row" paddingLeft="m_16">
|
|
65
|
+
<Feather name="chevron-left" size={16} color={colors.blue} />
|
|
66
|
+
<Text marginLeft="xs_4" color="blue" onPress={navigation.goBack}>
|
|
67
|
+
Back
|
|
68
|
+
</Text>
|
|
69
|
+
</Box>
|
|
70
|
+
),
|
|
71
|
+
})}
|
|
56
72
|
<% } else { %>
|
|
57
73
|
options={({ navigation }) => ({
|
|
58
74
|
headerLeft: () => (
|
|
@@ -112,13 +128,13 @@
|
|
|
112
128
|
<Stack.Screen
|
|
113
129
|
name="Modal"
|
|
114
130
|
component={Modal}
|
|
115
|
-
options={{ presentation: "modal", headerLeft: null }}
|
|
131
|
+
options={{ presentation: "modal", headerLeft: () => null }}
|
|
116
132
|
/>
|
|
117
133
|
</Stack.Navigator>
|
|
118
134
|
</NavigationContainer>
|
|
119
135
|
);
|
|
120
136
|
}
|
|
121
|
-
|
|
137
|
+
<% } else if (props.navigationPackage?.options.type === 'drawer') { %>
|
|
122
138
|
import { NavigationContainer } from "@react-navigation/native";
|
|
123
139
|
import { createStackNavigator } from '@react-navigation/stack';
|
|
124
140
|
|
|
@@ -150,4 +166,4 @@
|
|
|
150
166
|
</NavigationContainer>
|
|
151
167
|
);
|
|
152
168
|
}
|
|
153
|
-
|
|
169
|
+
<% } %>
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import FontAwesome from "@expo/vector-icons/FontAwesome";
|
|
2
|
-
import { createBottomTabNavigator } from
|
|
2
|
+
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
|
3
|
+
import { StackScreenProps } from '@react-navigation/stack';
|
|
3
4
|
import { Pressable, StyleSheet } from "react-native";
|
|
4
5
|
|
|
6
|
+
import { RootStackParamList } from '.';
|
|
5
7
|
import One from "../screens/one";
|
|
6
8
|
import Two from "../screens/two";
|
|
7
9
|
|
|
@@ -14,7 +16,9 @@ function TabBarIcon(props: {
|
|
|
14
16
|
return <FontAwesome size={28} style={styles.tabBarIcon} {...props} />;
|
|
15
17
|
}
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
type Props = StackScreenProps<RootStackParamList, 'TabNavigator'>;
|
|
20
|
+
|
|
21
|
+
export default function TabLayout({ navigation }: Props) {
|
|
18
22
|
return (
|
|
19
23
|
<Tab.Navigator
|
|
20
24
|
screenOptions={{
|
|
@@ -4,6 +4,8 @@ import { RouteProp, useRoute } from "@react-navigation/native";
|
|
|
4
4
|
<% } else if (props.stylingPackage?.name === "tamagui") { %>
|
|
5
5
|
import { YStack } from "tamagui";
|
|
6
6
|
import { Container, Main, Subtitle, Title } from "../../tamagui.config";
|
|
7
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
8
|
+
import { Box, Text } from 'theme';
|
|
7
9
|
<% } else { %>
|
|
8
10
|
import { View, StyleSheet, Text } from "react-native";
|
|
9
11
|
<% } %>
|
|
@@ -33,6 +35,17 @@ export default function Details() {
|
|
|
33
35
|
</Main>
|
|
34
36
|
</Container>
|
|
35
37
|
);
|
|
38
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
39
|
+
return (
|
|
40
|
+
<Box flex={1} padding="ml_24">
|
|
41
|
+
<Box flex={1} maxWidth={960}>
|
|
42
|
+
<Text variant="extra_large">Details</Text>
|
|
43
|
+
<Text variant="large" color="darkGray">
|
|
44
|
+
Showing details for user {router.params.name}.
|
|
45
|
+
</Text>
|
|
46
|
+
</Box>
|
|
47
|
+
</Box>
|
|
48
|
+
);
|
|
36
49
|
<% } else { %>
|
|
37
50
|
return (
|
|
38
51
|
<View style={styles.container}>
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
<% } else if (props.stylingPackage?.name === "tamagui") { %>
|
|
4
4
|
import { YStack, Paragraph, Separator, Theme } from "tamagui";
|
|
5
5
|
import { Platform } from 'react-native'
|
|
6
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
7
|
+
import { Platform } from 'react-native';
|
|
8
|
+
import { Box, Text, makeStyles } from 'theme';
|
|
6
9
|
<% } else { %>
|
|
7
10
|
import { Platform, StyleSheet, Text, View } from "react-native";
|
|
8
11
|
<% } %>
|
|
@@ -20,7 +23,7 @@ export default function Modal() {
|
|
|
20
23
|
<EditScreenInfo path="src/screens/modal.tsx" />
|
|
21
24
|
</View>
|
|
22
25
|
)
|
|
23
|
-
|
|
26
|
+
<% } else if (props.stylingPackage?.name === "tamagui") { %>
|
|
24
27
|
return (
|
|
25
28
|
<Theme name="light">
|
|
26
29
|
<YStack flex={1} alignItems="center" justifyContent="center">
|
|
@@ -31,6 +34,17 @@ export default function Modal() {
|
|
|
31
34
|
</YStack>
|
|
32
35
|
</Theme>
|
|
33
36
|
);
|
|
37
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
38
|
+
const styles = useStyles();
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<Box flex={1} alignItems="center" justifyContent="center">
|
|
42
|
+
<StatusBar style={Platform.OS === 'ios' ? 'light' : 'auto'} />
|
|
43
|
+
<Text variant="title">Modal</Text>
|
|
44
|
+
<Box style={styles.separator} />
|
|
45
|
+
<EditScreenInfo path="src/screens/modal.tsx" />
|
|
46
|
+
</Box>
|
|
47
|
+
);
|
|
34
48
|
<% } else { %>
|
|
35
49
|
return (
|
|
36
50
|
<View style={styles.container}>
|
|
@@ -49,6 +63,16 @@ export default function Modal() {
|
|
|
49
63
|
separator: "h-[1px] my-7 w-4/5 bg-gray-200",
|
|
50
64
|
title: "text-xl font-bold"
|
|
51
65
|
};
|
|
66
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
67
|
+
const useStyles = makeStyles((theme) => ({
|
|
68
|
+
separator: {
|
|
69
|
+
backgroundColor: theme.colors.gray,
|
|
70
|
+
height: 1,
|
|
71
|
+
marginVertical: theme.spacing.l_32,
|
|
72
|
+
opacity: 0.25,
|
|
73
|
+
width: '80%',
|
|
74
|
+
},
|
|
75
|
+
}));
|
|
52
76
|
<% } else if (props.stylingPackage?.name === "stylesheet") { %>
|
|
53
77
|
const styles = StyleSheet.create({
|
|
54
78
|
container: {
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { Text, View } from "react-native";
|
|
3
3
|
<% } else if (props.stylingPackage?.name === "tamagui") { %>
|
|
4
4
|
import { YStack, H2, Separator, Theme } from "tamagui";
|
|
5
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
6
|
+
import { Box, Text, makeStyles } from 'theme';
|
|
5
7
|
<% } else { %>
|
|
6
8
|
import { StyleSheet, Text, View } from "react-native";
|
|
7
9
|
<% } %>
|
|
@@ -27,6 +29,16 @@ export default function TabOneScreen() {
|
|
|
27
29
|
</YStack>
|
|
28
30
|
</Theme>
|
|
29
31
|
);
|
|
32
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
33
|
+
const styles = useStyles();
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<Box flex={1} alignItems="center" justifyContent="center">
|
|
37
|
+
<Text variant="title">Tab One</Text>
|
|
38
|
+
<Box style={styles.separator} />
|
|
39
|
+
<EditScreenInfo path="src/screens/one.tsx" />
|
|
40
|
+
</Box>
|
|
41
|
+
);
|
|
30
42
|
<% } else { %>
|
|
31
43
|
return (
|
|
32
44
|
<View style={styles.container}>
|
|
@@ -44,6 +56,16 @@ export default function TabOneScreen() {
|
|
|
44
56
|
separator: "h-[1px] my-7 w-4/5 bg-gray-200",
|
|
45
57
|
title: "text-xl font-bold"
|
|
46
58
|
};
|
|
59
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
60
|
+
const useStyles = makeStyles((theme) => ({
|
|
61
|
+
separator: {
|
|
62
|
+
backgroundColor: theme.colors.gray,
|
|
63
|
+
height: 1,
|
|
64
|
+
marginVertical: theme.spacing.l_32,
|
|
65
|
+
opacity: 0.25,
|
|
66
|
+
width: '80%',
|
|
67
|
+
},
|
|
68
|
+
}));
|
|
47
69
|
<% } else if (props.stylingPackage?.name === "stylesheet") { %>
|
|
48
70
|
const styles = StyleSheet.create({
|
|
49
71
|
container: {
|
|
@@ -5,6 +5,9 @@ import { StackNavigationProp } from "@react-navigation/stack";
|
|
|
5
5
|
<% } else if (props.stylingPackage?.name === "tamagui") { %>
|
|
6
6
|
import { YStack } from "tamagui";
|
|
7
7
|
import { Container, Main, Title, Subtitle, Button, ButtonText } from '../../tamagui.config';
|
|
8
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
9
|
+
import { TouchableOpacity } from 'react-native';
|
|
10
|
+
import { Box, Text, makeStyles } from 'theme';
|
|
8
11
|
<% } else { %>
|
|
9
12
|
import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
|
|
10
13
|
<% } %>
|
|
@@ -13,6 +16,7 @@ import { RootStackParamList } from "../navigation";
|
|
|
13
16
|
type OverviewScreenNavigationProps = StackNavigationProp<RootStackParamList, "Overview">;
|
|
14
17
|
|
|
15
18
|
export default function Overview() {
|
|
19
|
+
const styles = useStyles();
|
|
16
20
|
const navigation = useNavigation<OverviewScreenNavigationProps>();
|
|
17
21
|
<% if (props.stylingPackage?.name === "nativewind") { %>
|
|
18
22
|
return (
|
|
@@ -42,6 +46,26 @@ export default function Overview() {
|
|
|
42
46
|
</Main>
|
|
43
47
|
</Container>
|
|
44
48
|
);
|
|
49
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
50
|
+
return (
|
|
51
|
+
<Box flex={1} padding="ml_24">
|
|
52
|
+
<Box flex={1} maxWidth={960} justifyContent="space-between">
|
|
53
|
+
<Box>
|
|
54
|
+
<Text variant="extra_large">Hello World</Text>
|
|
55
|
+
<Text variant="large" color="darkGray">
|
|
56
|
+
This is the first page of your app.
|
|
57
|
+
</Text>
|
|
58
|
+
</Box>
|
|
59
|
+
<TouchableOpacity
|
|
60
|
+
style={styles.button}
|
|
61
|
+
onPress={() => navigation.navigate('Details', { name: 'Dan' })}>
|
|
62
|
+
<Text variant="body" textAlign="center" color="white" fontWeight="600">
|
|
63
|
+
Show Details
|
|
64
|
+
</Text>
|
|
65
|
+
</TouchableOpacity>
|
|
66
|
+
</Box>
|
|
67
|
+
</Box>
|
|
68
|
+
);
|
|
45
69
|
<% } else { %>
|
|
46
70
|
return (
|
|
47
71
|
<View style={styles.container}>
|
|
@@ -68,6 +92,25 @@ export default function Overview() {
|
|
|
68
92
|
title: "text-[64px] font-bold",
|
|
69
93
|
subtitle: "text-4xl text-gray-700",
|
|
70
94
|
};
|
|
95
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
96
|
+
const useStyles = makeStyles((theme) => ({
|
|
97
|
+
button: {
|
|
98
|
+
alignItems: 'center',
|
|
99
|
+
backgroundColor: theme.colors.purple,
|
|
100
|
+
borderRadius: theme.borderRadii.xl_24,
|
|
101
|
+
elevation: 5,
|
|
102
|
+
flexDirection: 'row',
|
|
103
|
+
justifyContent: 'center',
|
|
104
|
+
padding: theme.spacing.m_16,
|
|
105
|
+
shadowColor: theme.colors.black,
|
|
106
|
+
shadowOffset: {
|
|
107
|
+
height: 2,
|
|
108
|
+
width: 0,
|
|
109
|
+
},
|
|
110
|
+
shadowOpacity: 0.25,
|
|
111
|
+
shadowRadius: 3.84,
|
|
112
|
+
},
|
|
113
|
+
}));
|
|
71
114
|
<% } else if (props.stylingPackage?.name === "stylesheet") { %>
|
|
72
115
|
const styles = StyleSheet.create({
|
|
73
116
|
button: {
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { Text, View } from "react-native";
|
|
3
3
|
<% } else if (props.stylingPackage?.name === "tamagui") { %>
|
|
4
4
|
import { YStack, H2, Separator, Theme } from "tamagui";
|
|
5
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
6
|
+
import { Box, Text, makeStyles } from 'theme';
|
|
5
7
|
<% } else { %>
|
|
6
8
|
import { StyleSheet, Text, View } from "react-native";
|
|
7
9
|
<% } %>
|
|
@@ -26,7 +28,17 @@ export default function TabTwoScreen() {
|
|
|
26
28
|
<EditScreenInfo path="src/screens/two.tsx" />
|
|
27
29
|
</YStack>
|
|
28
30
|
</Theme>
|
|
29
|
-
);
|
|
31
|
+
);
|
|
32
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
33
|
+
const styles = useStyles();
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<Box flex={1} alignItems="center" justifyContent="center">
|
|
37
|
+
<Text variant="title">Tab Two</Text>
|
|
38
|
+
<Box style={styles.separator} />
|
|
39
|
+
<EditScreenInfo path="src/screens/two.tsx" />
|
|
40
|
+
</Box>
|
|
41
|
+
);
|
|
30
42
|
<% } else { %>
|
|
31
43
|
return (
|
|
32
44
|
<View style={styles.container}>
|
|
@@ -44,6 +56,16 @@ export default function TabTwoScreen() {
|
|
|
44
56
|
separator: "h-[1px] my-7 w-4/5 bg-gray-200",
|
|
45
57
|
title: "text-xl font-bold"
|
|
46
58
|
};
|
|
59
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
60
|
+
const useStyles = makeStyles((theme) => ({
|
|
61
|
+
separator: {
|
|
62
|
+
backgroundColor: theme.colors.gray,
|
|
63
|
+
height: 1,
|
|
64
|
+
marginVertical: theme.spacing.l_32,
|
|
65
|
+
opacity: 0.25,
|
|
66
|
+
width: '80%',
|
|
67
|
+
},
|
|
68
|
+
}));
|
|
47
69
|
<% } else if (props.stylingPackage?.name === "stylesheet") { %>
|
|
48
70
|
const styles = StyleSheet.create({
|
|
49
71
|
container: {
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { createTheme, useTheme as useRestyleTheme } from '@shopify/restyle';
|
|
2
|
+
import { ImageStyle, TextStyle, ViewStyle } from 'react-native';
|
|
3
|
+
|
|
4
|
+
type NamedStyles<T> = {
|
|
5
|
+
[P in keyof T]: ViewStyle | TextStyle | ImageStyle;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
const palette = {
|
|
9
|
+
gray: '#808080',
|
|
10
|
+
blue: '#007AFF',
|
|
11
|
+
darkGray: '#38434D',
|
|
12
|
+
white: '#FFFFFF',
|
|
13
|
+
black: '#000000',
|
|
14
|
+
purple: '#6366F1',
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const theme = createTheme({
|
|
18
|
+
colors: {
|
|
19
|
+
...palette
|
|
20
|
+
},
|
|
21
|
+
spacing: {
|
|
22
|
+
xs_4: 4,
|
|
23
|
+
s_8: 8,
|
|
24
|
+
sm_12: 12,
|
|
25
|
+
m_16: 16,
|
|
26
|
+
ml_24: 24,
|
|
27
|
+
l_32: 32,
|
|
28
|
+
xl_64: 64,
|
|
29
|
+
},
|
|
30
|
+
borderRadii: {
|
|
31
|
+
s_3: 3,
|
|
32
|
+
m_6: 6,
|
|
33
|
+
l_12: 12,
|
|
34
|
+
xl_24: 24,
|
|
35
|
+
},
|
|
36
|
+
textVariants: {
|
|
37
|
+
body: {
|
|
38
|
+
fontSize: 16,
|
|
39
|
+
},
|
|
40
|
+
title: { fontSize: 20, fontWeight: 'bold' },
|
|
41
|
+
large: {
|
|
42
|
+
fontSize: 36,
|
|
43
|
+
},
|
|
44
|
+
extra_large: {
|
|
45
|
+
fontSize: 64,
|
|
46
|
+
fontWeight: 'bold',
|
|
47
|
+
},
|
|
48
|
+
defaults: {
|
|
49
|
+
// We can define a default text variant here.
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
export const useTheme = () => {
|
|
55
|
+
return useRestyleTheme<Theme>();
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const makeStyles = <T extends NamedStyles<T> | NamedStyles<unknown>>(
|
|
59
|
+
styles: (theme: Theme) => T,
|
|
60
|
+
) => {
|
|
61
|
+
return () => {
|
|
62
|
+
return styles(theme);
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export type Theme = typeof theme;
|
|
67
|
+
export default theme;
|
package/build/types/types.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export interface CliFlags {
|
|
|
5
5
|
importAlias: string | boolean;
|
|
6
6
|
packageManager: PackageManager;
|
|
7
7
|
}
|
|
8
|
-
export declare const availablePackages: readonly ["@react-navigation/drawer", "expo-router", "expoRouter", "firebase", "nativewind", "react-navigation", "reactNavigation", "react-native-gesture-handler", "react-native-reanimated", "reactnavigation", "stylesheet", "supabase", "tamagui"];
|
|
8
|
+
export declare const availablePackages: readonly ["@react-navigation/drawer", "expo-router", "expoRouter", "firebase", "nativewind", "react-navigation", "reactNavigation", "react-native-gesture-handler", "react-native-reanimated", "reactnavigation", "stylesheet", "supabase", "tamagui", "restyle"];
|
|
9
9
|
export type NavigationTypes = 'stack' | 'tabs' | 'drawer' | undefined;
|
|
10
10
|
export type PackageManager = 'yarn' | 'npm' | 'pnpm' | 'bun';
|
|
11
11
|
export type AvailablePackages = {
|
package/build/types.js
CHANGED
|
@@ -14,6 +14,7 @@ exports.availablePackages = [
|
|
|
14
14
|
'reactnavigation',
|
|
15
15
|
'stylesheet',
|
|
16
16
|
'supabase',
|
|
17
|
-
'tamagui'
|
|
17
|
+
'tamagui',
|
|
18
|
+
'restyle'
|
|
18
19
|
];
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU2EsUUFBQSxpQkFBaUIsR0FBRztJQUMvQiwwQkFBMEI7SUFDMUIsYUFBYTtJQUNiLFlBQVk7SUFDWixVQUFVO0lBQ1YsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsOEJBQThCO0lBQzlCLHlCQUF5QjtJQUN6QixpQkFBaUI7SUFDakIsWUFBWTtJQUNaLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztDQUNELENBQUMifQ==
|
|
@@ -41,6 +41,17 @@ function configureProjectFiles(authenticationPackage, files, navigationPackage,
|
|
|
41
41
|
var tamaguiFiles = ['packages/tamagui/tamagui.config.ts.ejs'];
|
|
42
42
|
files = __spreadArray(__spreadArray([], files, true), tamaguiFiles, true);
|
|
43
43
|
}
|
|
44
|
+
// add restyle files if needed
|
|
45
|
+
// modify base files with restyle specifications
|
|
46
|
+
if ((stylingPackage === null || stylingPackage === void 0 ? void 0 : stylingPackage.name) === 'restyle') {
|
|
47
|
+
var restyleFiles = [
|
|
48
|
+
'packages/restyle/theme/theme.ts.ejs',
|
|
49
|
+
'packages/restyle/theme/Box.tsx.ejs',
|
|
50
|
+
'packages/restyle/theme/Text.tsx.ejs',
|
|
51
|
+
'packages/restyle/theme/index.ts.ejs'
|
|
52
|
+
];
|
|
53
|
+
files = __spreadArray(__spreadArray([], files, true), restyleFiles, true);
|
|
54
|
+
}
|
|
44
55
|
// add react navigation files if needed
|
|
45
56
|
// modify base files with react navigation specifications
|
|
46
57
|
if ((navigationPackage === null || navigationPackage === void 0 ? void 0 : navigationPackage.name) === 'react-navigation') {
|
|
@@ -142,4 +153,4 @@ function configureProjectFiles(authenticationPackage, files, navigationPackage,
|
|
|
142
153
|
return files;
|
|
143
154
|
}
|
|
144
155
|
exports.configureProjectFiles = configureProjectFiles;
|
|
145
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlUHJvamVjdEZpbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxpdGllcy9jb25maWd1cmVQcm9qZWN0RmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRUEseURBQXdEO0FBRXhELFNBQWdCLHFCQUFxQixDQUNuQyxxQkFBb0QsRUFDcEQsS0FBZSxFQUNmLGlCQUFnRCxFQUNoRCxjQUE2QyxFQUM3QyxPQUFnQixFQUNoQixVQUFzQjs7SUFFdEIsMkRBQTJEO0lBQzNELElBQU0sU0FBUyxHQUFHO1FBQ2hCLHdCQUF3QjtRQUN4QixtQkFBbUI7UUFDbkIsa0JBQWtCO1FBQ2xCLDBCQUEwQjtRQUMxQix1QkFBdUI7UUFDdkIscUJBQXFCO1FBQ3JCLGtCQUFrQjtLQUNuQixDQUFDO0lBRUYsSUFBTSxjQUFjLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUQsdURBQXVEO0lBQ3ZELElBQUksY0FBYyxLQUFLLE1BQU0sSUFBSSxDQUFBLGlCQUFpQixhQUFqQixpQkFBaUIsdUJBQWpCLGlCQUFpQixDQUFFLElBQUksTUFBSyxhQUFhLEVBQUUsQ0FBQztRQUMzRSxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUsscUJBQU8sU0FBUyxPQUFDLENBQUM7SUFFdkIsaUNBQWlDO0lBQ2pDLG1EQUFtRDtJQUNuRCxJQUFJLENBQUEsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLElBQUksTUFBSyxZQUFZLEVBQUUsQ0FBQztRQUMxQyxJQUFNLGVBQWUsR0FBRyxDQUFDLDRDQUE0QyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7UUFFM0csS0FBSyxtQ0FBTyxLQUFLLFNBQUssZUFBZSxPQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixnREFBZ0Q7SUFDaEQsSUFBSSxD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
|
|
@@ -20,6 +20,9 @@ function generateProjectFiles(authenticationPackage, cliResults, files, formatte
|
|
|
20
20
|
else if ((stylingPackage === null || stylingPackage === void 0 ? void 0 : stylingPackage.name) === 'nativewind') {
|
|
21
21
|
target = target.replace('packages/nativewind/', '');
|
|
22
22
|
}
|
|
23
|
+
else if ((stylingPackage === null || stylingPackage === void 0 ? void 0 : stylingPackage.name) === 'restyle') {
|
|
24
|
+
target = target.replace('packages/restyle/', '');
|
|
25
|
+
}
|
|
23
26
|
if ((navigationPackage === null || navigationPackage === void 0 ? void 0 : navigationPackage.name) === 'react-navigation') {
|
|
24
27
|
target = target.replace('packages/react-navigation/App.tsx', 'App.tsx');
|
|
25
28
|
target = target.replace('packages/react-navigation/', 'src/');
|
|
@@ -53,4 +56,4 @@ function generateProjectFiles(authenticationPackage, cliResults, files, formatte
|
|
|
53
56
|
}, formattedFiles);
|
|
54
57
|
}
|
|
55
58
|
exports.generateProjectFiles = generateProjectFiles;
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVQcm9qZWN0RmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbGl0aWVzL2dlbmVyYXRlUHJvamVjdEZpbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLFNBQWdCLG9CQUFvQixDQUNsQyxxQkFBb0QsRUFDcEQsVUFBc0IsRUFDdEIsS0FBZSxFQUNmLGNBQXFCLEVBQ3JCLGlCQUFnRCxFQUNoRCxjQUE4QixFQUM5QixjQUE2QyxFQUM3QyxPQUFnQjtJQUVSLElBQUEsV0FBVyxHQUFzQixVQUFVLFlBQWhDLEVBQUUsUUFBUSxHQUFZLFVBQVUsU0FBdEIsRUFBRSxLQUFLLEdBQUssVUFBVSxNQUFmLENBQWdCO0lBRXBELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFDLElBQUksRUFBRSxJQUFJOztRQUM3QixJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFdEMsSUFBSSxDQUFBLHFCQUFxQixhQUFyQixxQkFBcUIsdUJBQXJCLHFCQUFxQixDQUFFLElBQUksTUFBSyxVQUFVLEVBQUUsQ0FBQztZQUMvQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBRUQsSUFBSSxDQUFBLHFCQUFxQixhQUFyQixxQkFBcUIsdUJBQXJCLHFCQUFxQixDQUFFLElBQUksTUFBSyxVQUFVLEVBQUUsQ0FBQztZQUMvQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBRUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXJDLElBQUksQ0FBQSxjQUFjLGFBQWQsY0FBYyx1QkFB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
|