create-expo-stack 2.4.0-next.1fb5698 → 2.4.0-next.824bd0e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +1 -0
  2. package/build/commands/create-expo-stack.js +10 -2
  3. package/build/templates/base/App.tsx.ejs +22 -0
  4. package/build/templates/base/package.json.ejs +4 -0
  5. package/build/templates/packages/expo-router/drawer/app/(drawer)/index.tsx.ejs +13 -1
  6. package/build/templates/packages/expo-router/drawer/app/(drawer)/news.tsx.ejs +13 -1
  7. package/build/templates/packages/expo-router/drawer/app/[...unmatched].tsx.ejs +26 -0
  8. package/build/templates/packages/expo-router/drawer/app/_layout.tsx.ejs +4 -0
  9. package/build/templates/packages/expo-router/stack/app/[...unmatched].tsx.ejs +28 -0
  10. package/build/templates/packages/expo-router/stack/app/_layout.tsx.ejs +4 -0
  11. package/build/templates/packages/expo-router/stack/app/details.tsx.ejs +43 -1
  12. package/build/templates/packages/expo-router/stack/app/index.tsx.ejs +36 -0
  13. package/build/templates/packages/expo-router/tabs/app/(tabs)/_layout.tsx.ejs +30 -8
  14. package/build/templates/packages/expo-router/tabs/app/(tabs)/index.tsx.ejs +15 -2
  15. package/build/templates/packages/expo-router/tabs/app/(tabs)/two.tsx.ejs +15 -2
  16. package/build/templates/packages/expo-router/tabs/app/[...unmatched].tsx.ejs +28 -0
  17. package/build/templates/packages/expo-router/tabs/app/_layout.tsx.ejs +4 -0
  18. package/build/templates/packages/expo-router/tabs/app/modal.tsx.ejs +15 -1
  19. package/build/templates/packages/expo-router/tabs/components/edit-screen-info.tsx.ejs +36 -0
  20. package/build/templates/packages/react-navigation/App.tsx.ejs +3 -0
  21. package/build/templates/packages/react-navigation/components/edit-screen-info.tsx.ejs +59 -0
  22. package/build/templates/packages/react-navigation/navigation/index.tsx.ejs +28 -0
  23. package/build/templates/packages/react-navigation/navigation/tab-navigator.tsx.ejs +24 -1
  24. package/build/templates/packages/react-navigation/screens/details.tsx.ejs +25 -0
  25. package/build/templates/packages/react-navigation/screens/modal.tsx.ejs +13 -0
  26. package/build/templates/packages/react-navigation/screens/one.tsx.ejs +12 -0
  27. package/build/templates/packages/react-navigation/screens/overview.tsx.ejs +33 -2
  28. package/build/templates/packages/react-navigation/screens/two.tsx.ejs +12 -0
  29. package/build/templates/packages/unistyles/breakpoints.ts.ejs +9 -0
  30. package/build/templates/packages/unistyles/theme.ts.ejs +76 -0
  31. package/build/templates/packages/unistyles/unistyles.ts.ejs +27 -0
  32. package/build/types/types.d.ts +1 -1
  33. package/build/types/utilities/printOutput.d.ts +2 -2
  34. package/build/types.js +3 -2
  35. package/build/utilities/configureProjectFiles.js +11 -1
  36. package/build/utilities/generateProjectFiles.js +4 -1
  37. package/build/utilities/printOutput.js +14 -2
  38. package/build/utilities/runCLI.js +6 -2
  39. package/build/utilities/showHelp.js +2 -1
  40. package/package.json +1 -1
@@ -6,6 +6,9 @@
6
6
  <% } else if (props.stylingPackage?.name === "restyle") { %>
7
7
  import { Platform } from 'react-native';
8
8
  import { Box, Text } from 'theme';
9
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
10
+ import { useStyles } from 'react-native-unistyles'
11
+ import { Platform, Text, View } from 'react-native';
9
12
  <% } else { %>
10
13
  import { Platform, StyleSheet, Text, View } from "react-native";
11
14
  <% } %>
@@ -14,7 +17,18 @@ import { StatusBar } from "expo-status-bar";
14
17
  import EditScreenInfo from "../components/edit-screen-info";
15
18
 
16
19
  export default function ModalScreen() {
17
- <% if (props.stylingPackage?.name === "nativewind") { %>
20
+ <% if (props.stylingPackage?.name === "unistyles") { %>
21
+ const { theme } = useStyles()
22
+
23
+ return (
24
+ <View style={theme.components.container}>
25
+ <StatusBar style={Platform.OS === 'ios' ? 'light' : 'auto'} />
26
+ <Text style={theme.components.title}>Modal</Text>
27
+ <View style={theme.components.separator} />
28
+ <EditScreenInfo path='app/modal.tsx' />
29
+ </View>
30
+ );
31
+ <% } else if (props.stylingPackage?.name === "nativewind") { %>
18
32
  return (
19
33
  <View className={styles.container}>
20
34
  <StatusBar style={Platform.OS === "ios" ? "light" : "auto"} />
@@ -4,11 +4,17 @@
4
4
  import { YStack, H4, Paragraph } from "tamagui"
5
5
  <% } else if (props.stylingPackage?.name === "restyle") { %>
6
6
  import { Box, Text } from 'theme';
7
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
8
+ import { createStyleSheet, useStyles } from 'react-native-unistyles'
9
+ import { Text, View } from 'react-native';
7
10
  <% } else { %>
8
11
  import { StyleSheet, Text, View } from "react-native";
9
12
  <% } %>
10
13
 
11
14
  export default function EditScreenInfo({ path }: { path: string }) {
15
+ <% if (props.stylingPackage?.name === "unistyles") { %>
16
+ const { styles } = useStyles(stylesheet);
17
+ <% } %>
12
18
  <% if (props.stylingPackage?.name === "nativewind") { %>
13
19
  return (
14
20
  <View>
@@ -84,6 +90,36 @@ export default function EditScreenInfo({ path }: { path: string }) {
84
90
  helpLinkText: `text-center`,
85
91
  homeScreenFilename: `my-2`,
86
92
  };
93
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
94
+ const stylesheet = createStyleSheet({
95
+ codeHighlightContainer: {
96
+ borderRadius: 3,
97
+ paddingHorizontal: 4
98
+ },
99
+ getStartedContainer: {
100
+ alignItems: 'center',
101
+ marginHorizontal: 50
102
+ },
103
+ getStartedText: {
104
+ fontSize: 17,
105
+ lineHeight: 24,
106
+ textAlign: 'center'
107
+ },
108
+ helpContainer: {
109
+ alignItems: 'center',
110
+ marginHorizontal: 20,
111
+ marginTop: 15
112
+ },
113
+ helpLink: {
114
+ paddingVertical: 15
115
+ },
116
+ helpLinkText: {
117
+ textAlign: 'center'
118
+ },
119
+ homeScreenFilename: {
120
+ marginVertical: 7
121
+ }
122
+ });
87
123
  <% } else if (props.stylingPackage?.name === "stylesheet") { %>
88
124
  const styles = StyleSheet.create({
89
125
  codeHighlightContainer: {
@@ -1,3 +1,6 @@
1
+ <% if (props.stylingPackage?.name === "unistyles") { %>
2
+ import './unistyles';
3
+ <% } %>
1
4
  import "react-native-gesture-handler";
2
5
  <% if (props.stylingPackage?.name === "tamagui") { %>
3
6
  import React, { useEffect } from "react";
@@ -3,6 +3,9 @@ import React from "react";
3
3
  import { Text, View } from "react-native";
4
4
  <% } else if (props.stylingPackage?.name === "restyle") { %>
5
5
  import { Box, Text } from 'theme';
6
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
7
+ import { createStyleSheet, useStyles } from 'react-native-unistyles'
8
+ import { Text, View } from 'react-native';
6
9
  <% } else { %>
7
10
  import { StyleSheet, Text, View } from "react-native";
8
11
  <% } %>
@@ -52,6 +55,32 @@ import React from "react";
52
55
  </Box>
53
56
  );
54
57
  }
58
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
59
+ export default function EditScreenInfo({ path }: { path: string }) {
60
+ const { styles } = useStyles(stylesheet)
61
+ return (
62
+ <View>
63
+ <View style={styles.getStartedContainer}>
64
+ <Text
65
+ style={styles.getStartedText}>
66
+ Open up the code for this screen:
67
+ </Text>
68
+
69
+ <View
70
+ style={[styles.codeHighlightContainer, styles.homeScreenFilename]}
71
+ >
72
+ <Text>{path}</Text>
73
+ </View>
74
+
75
+ <Text
76
+ style={styles.getStartedText}
77
+ >
78
+ Change any of the text, save the file, and your app will automatically update.
79
+ </Text>
80
+ </View>
81
+ </View>
82
+ );
83
+ }
55
84
  <% } else { %>
56
85
  export default function EditScreenInfo({ path }: { path: string }) {
57
86
  return (
@@ -88,6 +117,36 @@ import React from "react";
88
117
  helpLink: "py-4",
89
118
  helpLinkText: "text-center"
90
119
  };
120
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
121
+ const stylesheet = createStyleSheet({
122
+ codeHighlightContainer: {
123
+ borderRadius: 3,
124
+ paddingHorizontal: 4
125
+ },
126
+ getStartedContainer: {
127
+ alignItems: 'center',
128
+ marginHorizontal: 50
129
+ },
130
+ getStartedText: {
131
+ fontSize: 17,
132
+ lineHeight: 24,
133
+ textAlign: 'center'
134
+ },
135
+ helpContainer: {
136
+ alignItems: 'center',
137
+ marginHorizontal: 20,
138
+ marginTop: 15
139
+ },
140
+ helpLink: {
141
+ paddingVertical: 15
142
+ },
143
+ helpLinkText: {
144
+ textAlign: 'center'
145
+ },
146
+ homeScreenFilename: {
147
+ marginVertical: 7
148
+ }
149
+ });
91
150
  <% } else if (props.stylingPackage?.name !== "restyle") { %>
92
151
  const styles = StyleSheet.create({
93
152
  codeHighlightContainer: {
@@ -8,6 +8,9 @@
8
8
  import { Button, Text } from "tamagui";
9
9
  <% } else if (props.stylingPackage?.name === "restyle") { %>
10
10
  import { Box, Text, useTheme } from 'theme';
11
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
12
+ import { createStyleSheet, useStyles } from 'react-native-unistyles'
13
+ import { Text, View } from 'react-native';
11
14
  <% } else { %>
12
15
  import { Text, View, StyleSheet } from "react-native";
13
16
  <% } %>
@@ -26,6 +29,11 @@
26
29
  <% if (props.stylingPackage?.name === "restyle") { %>
27
30
  const { colors } = useTheme();
28
31
  <% } %>
32
+
33
+ <% if (props.stylingPackage?.name === "unistyles") { %>
34
+ const { styles, theme } = useStyles(stylesheet);
35
+ <% } %>
36
+
29
37
  return (
30
38
  <NavigationContainer>
31
39
  <Stack.Navigator initialRouteName="Overview">
@@ -69,6 +77,15 @@
69
77
  </Box>
70
78
  ),
71
79
  })}
80
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
81
+ options={({ navigation }) => ({
82
+ headerLeft: () => (
83
+ <View style={styles.backButton}>
84
+ <Feather name="chevron-left" size={16} color={theme.colors.azureRadiance} />
85
+ <Text style={styles.backButtonText} onPress={navigation.goBack}>Back</Text>
86
+ </View>
87
+ )
88
+ })}
72
89
  <% } else { %>
73
90
  options={({ navigation }) => ({
74
91
  headerLeft: () => (
@@ -90,6 +107,17 @@
90
107
  backButton: "flex-row",
91
108
  backButtonText: "text-blue-500 ml-1"
92
109
  };
110
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
111
+ const stylesheet = createStyleSheet((theme) => ({
112
+ backButton: {
113
+ flexDirection: 'row',
114
+ paddingLeft: 20,
115
+ },
116
+ backButtonText: {
117
+ color: theme.colors.azureRadiance,
118
+ marginLeft: 4,
119
+ },
120
+ }));
93
121
  <% } else if (props.stylingPackage?.name === "stylesheet") { %>
94
122
  const styles = StyleSheet.create({
95
123
  backButton: {
@@ -1,7 +1,12 @@
1
1
  import FontAwesome from "@expo/vector-icons/FontAwesome";
2
2
  import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
3
3
  import { StackScreenProps } from '@react-navigation/stack';
4
+ <% if (props.stylingPackage?.name === "unistyles") {%>
5
+ import { createStyleSheet, useStyles } from 'react-native-unistyles'
6
+ import { Pressable } from 'react-native';
7
+ <% } else { %>
4
8
  import { Pressable, StyleSheet } from "react-native";
9
+ <% } %>
5
10
 
6
11
  import { RootStackParamList } from '.';
7
12
  import One from "../screens/one";
@@ -13,12 +18,19 @@ function TabBarIcon(props: {
13
18
  name: React.ComponentProps<typeof FontAwesome>["name"];
14
19
  color: string;
15
20
  }) {
21
+ <% if (props.stylingPackage?.name === "unistyles") {%>
22
+ const { styles } = useStyles(stylesheet)
23
+ <% } %>
16
24
  return <FontAwesome size={28} style={styles.tabBarIcon} {...props} />;
17
25
  }
18
26
 
19
27
  type Props = StackScreenProps<RootStackParamList, 'TabNavigator'>;
20
28
 
21
29
  export default function TabLayout({ navigation }: Props) {
30
+ <% if (props.stylingPackage?.name === "unistyles") {%>
31
+ const { styles } = useStyles(stylesheet)
32
+ <% } %>
33
+
22
34
  return (
23
35
  <Tab.Navigator
24
36
  screenOptions={{
@@ -56,6 +68,16 @@ export default function TabLayout({ navigation }: Props) {
56
68
  );
57
69
  }
58
70
 
71
+ <% if (props.stylingPackage?.name === "unistyles") {%>
72
+ const stylesheet = createStyleSheet({
73
+ headerRight: {
74
+ marginRight: 15
75
+ },
76
+ tabBarIcon: {
77
+ marginBottom: -3
78
+ }
79
+ });
80
+ <% } else { %>
59
81
  const styles = StyleSheet.create({
60
82
  headerRight: {
61
83
  marginRight: 15
@@ -63,4 +85,5 @@ const styles = StyleSheet.create({
63
85
  tabBarIcon: {
64
86
  marginBottom: -3
65
87
  }
66
- });
88
+ });
89
+ <% } %>
@@ -6,6 +6,9 @@ import { RouteProp, useRoute } from "@react-navigation/native";
6
6
  import { Container, Main, Subtitle, Title } from "../../tamagui.config";
7
7
  <% } else if (props.stylingPackage?.name === "restyle") { %>
8
8
  import { Box, Text } from 'theme';
9
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
10
+ import { createStyleSheet, useStyles } from 'react-native-unistyles'
11
+ import { View, Text } from 'react-native';
9
12
  <% } else { %>
10
13
  import { View, StyleSheet, Text } from "react-native";
11
14
  <% } %>
@@ -45,6 +48,16 @@ export default function Details() {
45
48
  </Text>
46
49
  </Box>
47
50
  </Box>
51
+ );
52
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
53
+ const { styles, theme } = useStyles(stylesheet)
54
+ return (
55
+ <View style={styles.container}>
56
+ <View style={styles.main}>
57
+ <Text style={theme.components.title}>Details</Text>
58
+ <Text style={theme.components.subtitle}>Showing details for user {router.params.name}.</Text>
59
+ </View>
60
+ </View>
48
61
  );
49
62
  <% } else { %>
50
63
  return (
@@ -65,6 +78,18 @@ export default function Details() {
65
78
  title: "text-[64px] font-bold",
66
79
  subtitle: "text-4xl text-gray-700",
67
80
  };
81
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
82
+ const stylesheet = createStyleSheet({
83
+ container: {
84
+ flex: 1,
85
+ padding: 24,
86
+ },
87
+ main: {
88
+ flex: 1,
89
+ maxWidth: 960,
90
+ marginHorizontal: 'auto',
91
+ },
92
+ });
68
93
  <% } else if (props.stylingPackage?.name === "stylesheet") { %>
69
94
  const styles = StyleSheet.create({
70
95
  container: {
@@ -6,6 +6,9 @@
6
6
  <% } else if (props.stylingPackage?.name === "restyle") { %>
7
7
  import { Platform } from 'react-native';
8
8
  import { Box, Text, makeStyles } from 'theme';
9
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
10
+ import { useStyles } from 'react-native-unistyles'
11
+ import { Platform, Text, View } from 'react-native';
9
12
  <% } else { %>
10
13
  import { Platform, StyleSheet, Text, View } from "react-native";
11
14
  <% } %>
@@ -45,6 +48,16 @@ export default function Modal() {
45
48
  <EditScreenInfo path="src/screens/modal.tsx" />
46
49
  </Box>
47
50
  );
51
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
52
+ const { theme } = useStyles()
53
+ return (
54
+ <View style={theme.components.container}>
55
+ <StatusBar style={Platform.OS === 'ios' ? 'light' : 'auto'} />
56
+ <Text style={theme.components.title}>Modal</Text>
57
+ <View style={theme.components.separator} />
58
+ <EditScreenInfo path='src/screens/modal.tsx' />
59
+ </View>
60
+ );
48
61
  <% } else { %>
49
62
  return (
50
63
  <View style={styles.container}>
@@ -4,6 +4,9 @@
4
4
  import { YStack, H2, Separator, Theme } from "tamagui";
5
5
  <% } else if (props.stylingPackage?.name === "restyle") { %>
6
6
  import { Box, Text, makeStyles } from 'theme';
7
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
8
+ import { useStyles } from 'react-native-unistyles'
9
+ import { Text, View } from 'react-native';
7
10
  <% } else { %>
8
11
  import { StyleSheet, Text, View } from "react-native";
9
12
  <% } %>
@@ -39,6 +42,15 @@ export default function TabOneScreen() {
39
42
  <EditScreenInfo path="src/screens/one.tsx" />
40
43
  </Box>
41
44
  );
45
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
46
+ const { theme } = useStyles()
47
+ return (
48
+ <View style={theme.components.container}>
49
+ <Text style={theme.components.title}>Tab One</Text>
50
+ <View style={theme.components.separator} />
51
+ <EditScreenInfo path='src/screens/one.tsx' />
52
+ </View>
53
+ );
42
54
  <% } else { %>
43
55
  return (
44
56
  <View style={styles.container}>
@@ -8,6 +8,9 @@ import { StackNavigationProp } from "@react-navigation/stack";
8
8
  <% } else if (props.stylingPackage?.name === "restyle") { %>
9
9
  import { TouchableOpacity } from 'react-native';
10
10
  import { Box, Text, makeStyles } from 'theme';
11
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
12
+ import { createStyleSheet, useStyles } from 'react-native-unistyles'
13
+ import { Text, TouchableOpacity, View } from 'react-native';
11
14
  <% } else { %>
12
15
  import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
13
16
  <% } %>
@@ -16,7 +19,6 @@ import { RootStackParamList } from "../navigation";
16
19
  type OverviewScreenNavigationProps = StackNavigationProp<RootStackParamList, "Overview">;
17
20
 
18
21
  export default function Overview() {
19
- const styles = useStyles();
20
22
  const navigation = useNavigation<OverviewScreenNavigationProps>();
21
23
  <% if (props.stylingPackage?.name === "nativewind") { %>
22
24
  return (
@@ -47,6 +49,7 @@ export default function Overview() {
47
49
  </Container>
48
50
  );
49
51
  <% } else if (props.stylingPackage?.name === "restyle") { %>
52
+ const styles = useStyles();
50
53
  return (
51
54
  <Box flex={1} padding="ml_24">
52
55
  <Box flex={1} maxWidth={960} justifyContent="space-between">
@@ -66,7 +69,22 @@ export default function Overview() {
66
69
  </Box>
67
70
  </Box>
68
71
  );
69
- <% } else { %>
72
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
73
+ const { styles, theme } = useStyles(stylesheet)
74
+ return (
75
+ <View style={styles.container}>
76
+ <View style={styles.main}>
77
+ <View>
78
+ <Text style={theme.components.title}>Hello World</Text>
79
+ <Text style={theme.components.subtitle}>This is the first page of your app.</Text>
80
+ </View>
81
+ <TouchableOpacity style={theme.components.button} onPress={() => navigation.navigate('Details', { name: 'Dan' })}>
82
+ <Text style={theme.components.buttonText}>Show Details</Text>
83
+ </TouchableOpacity>
84
+ </View>
85
+ </View>
86
+ );
87
+ <% } else { %>
70
88
  return (
71
89
  <View style={styles.container}>
72
90
  <View style={styles.main}>
@@ -111,6 +129,19 @@ export default function Overview() {
111
129
  shadowRadius: 3.84,
112
130
  },
113
131
  }));
132
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
133
+ const stylesheet = createStyleSheet({
134
+ container: {
135
+ flex: 1,
136
+ padding: 24,
137
+ },
138
+ main: {
139
+ flex: 1,
140
+ maxWidth: 960,
141
+ marginHorizontal: 'auto',
142
+ justifyContent: 'space-between',
143
+ },
144
+ });
114
145
  <% } else if (props.stylingPackage?.name === "stylesheet") { %>
115
146
  const styles = StyleSheet.create({
116
147
  button: {
@@ -4,6 +4,9 @@
4
4
  import { YStack, H2, Separator, Theme } from "tamagui";
5
5
  <% } else if (props.stylingPackage?.name === "restyle") { %>
6
6
  import { Box, Text, makeStyles } from 'theme';
7
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
8
+ import { useStyles } from 'react-native-unistyles'
9
+ import { Text, View } from 'react-native';
7
10
  <% } else { %>
8
11
  import { StyleSheet, Text, View } from "react-native";
9
12
  <% } %>
@@ -29,6 +32,15 @@ export default function TabTwoScreen() {
29
32
  </YStack>
30
33
  </Theme>
31
34
  );
35
+ <% } else if (props.stylingPackage?.name === "unistyles") { %>
36
+ const { theme } = useStyles()
37
+ return (
38
+ <View style={theme.components.container}>
39
+ <Text style={theme.components.title}>Tab Two</Text>
40
+ <View style={theme.components.separator} />
41
+ <EditScreenInfo path='src/screens/two.tsx' />
42
+ </View>
43
+ );
32
44
  <% } else if (props.stylingPackage?.name === "restyle") { %>
33
45
  const styles = useStyles();
34
46
 
@@ -0,0 +1,9 @@
1
+ export const breakpoints = {
2
+ xs: 0,
3
+ sm: 576,
4
+ md: 768,
5
+ lg: 992,
6
+ xl: 1200,
7
+ superLarge: 2000,
8
+ tvLike: 4000
9
+ } as const;
@@ -0,0 +1,76 @@
1
+ const colors = {
2
+ white: '#ffffff',
3
+ azureRadiance: '#007AFF',
4
+ limedSpruce: '#38434D',
5
+ cornflowerBlue: '#6366F1',
6
+ astral: '#2E78B7'
7
+ } as const;
8
+
9
+ export const lightTheme = {
10
+ colors,
11
+ components: {
12
+ <% if (props.navigationPackage?.options.type === 'tabs' || props.navigationPackage?.options.type === 'drawer') {%>
13
+ container: {
14
+ alignItems: 'center',
15
+ flex: 1,
16
+ justifyContent: 'center'
17
+ },
18
+ title: {
19
+ fontSize: 20,
20
+ fontWeight: 'bold',
21
+ },
22
+ <% if (props.navigationPackage?.name === 'expo-router') { %>
23
+ separator: {
24
+ height: 1,
25
+ marginVertical: 30,
26
+ width: '80%',
27
+ },
28
+ <% } else { %>
29
+ separator: {
30
+ backgroundColor: 'gray',
31
+ height: 1,
32
+ marginVertical: 30,
33
+ opacity: 0.25,
34
+ width: '80%',
35
+ },
36
+ <% } %>
37
+ <% } else { %>
38
+ button: {
39
+ alignItems: 'center',
40
+ backgroundColor: colors.cornflowerBlue,
41
+ borderRadius: 24,
42
+ elevation: 5,
43
+ flexDirection: 'row',
44
+ justifyContent: 'center',
45
+ padding: 16,
46
+ shadowColor: '#000',
47
+ shadowOffset: {
48
+ height: 2,
49
+ width: 0,
50
+ },
51
+ shadowOpacity: 0.25,
52
+ shadowRadius: 3.84,
53
+ },
54
+ buttonText: {
55
+ color: colors.white,
56
+ fontSize: 16,
57
+ fontWeight: '600',
58
+ textAlign: 'center',
59
+ },
60
+ title: {
61
+ fontSize: 64,
62
+ fontWeight: 'bold',
63
+ },
64
+ subtitle: {
65
+ color: colors.limedSpruce,
66
+ fontSize: 36,
67
+ },
68
+ <% } %>
69
+ },
70
+ margins: {
71
+ sm: 2,
72
+ md: 4,
73
+ lg: 8,
74
+ xl: 12,
75
+ },
76
+ } as const;
@@ -0,0 +1,27 @@
1
+ import { UnistylesRegistry } from 'react-native-unistyles';
2
+
3
+ import { breakpoints } from './breakpoints';
4
+ import { lightTheme } from './theme';
5
+
6
+ type AppBreakpoints = typeof breakpoints;
7
+
8
+ // if you defined themes
9
+ type AppThemes = {
10
+ light: typeof lightTheme;
11
+ };
12
+
13
+ // override library types
14
+ declare module 'react-native-unistyles' {
15
+ export interface UnistylesBreakpoints extends AppBreakpoints {}
16
+ export interface UnistylesThemes extends AppThemes {}
17
+ }
18
+
19
+ UnistylesRegistry.addBreakpoints(breakpoints)
20
+ .addThemes({
21
+ light: lightTheme,
22
+ // register other themes with unique names
23
+ })
24
+ .addConfig({
25
+ // you can pass here optional config described below
26
+ adaptiveThemes: true,
27
+ });
@@ -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", "restyle"];
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", "unistyles"];
9
9
  export type NavigationTypes = 'stack' | 'tabs' | 'drawer' | undefined;
10
10
  export type PackageManager = 'yarn' | 'npm' | 'pnpm' | 'bun';
11
11
  export type AvailablePackages = {
@@ -1,3 +1,3 @@
1
1
  import { Toolbox } from 'gluegun/build/types/domain/toolbox';
2
- import { CliResults } from '../types';
3
- export declare function printOutput(cliResults: CliResults, formattedFiles: any[], toolbox: Toolbox): Promise<void>;
2
+ import { AvailablePackages, CliResults } from '../types';
3
+ export declare function printOutput(cliResults: CliResults, formattedFiles: any[], toolbox: Toolbox, stylingPackage: AvailablePackages): Promise<void>;
package/build/types.js CHANGED
@@ -15,6 +15,7 @@ exports.availablePackages = [
15
15
  'stylesheet',
16
16
  'supabase',
17
17
  'tamagui',
18
- 'restyle'
18
+ 'restyle',
19
+ 'unistyles'
19
20
  ];
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU2EsUUFBQSxpQkFBaUIsR0FBRztJQUMvQiwwQkFBMEI7SUFDMUIsYUFBYTtJQUNiLFlBQVk7SUFDWixVQUFVO0lBQ1YsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsOEJBQThCO0lBQzlCLHlCQUF5QjtJQUN6QixpQkFBaUI7SUFDakIsWUFBWTtJQUNaLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztDQUNELENBQUMifQ==
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU2EsUUFBQSxpQkFBaUIsR0FBRztJQUMvQiwwQkFBMEI7SUFDMUIsYUFBYTtJQUNiLFlBQVk7SUFDWixVQUFVO0lBQ1YsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsOEJBQThCO0lBQzlCLHlCQUF5QjtJQUN6QixpQkFBaUI7SUFDakIsWUFBWTtJQUNaLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7Q0FDSCxDQUFDIn0=
@@ -52,6 +52,16 @@ function configureProjectFiles(authenticationPackage, files, navigationPackage,
52
52
  ];
53
53
  files = __spreadArray(__spreadArray([], files, true), restyleFiles, true);
54
54
  }
55
+ // add unistyles files if needed
56
+ // modify base files with unis specifications
57
+ if ((stylingPackage === null || stylingPackage === void 0 ? void 0 : stylingPackage.name) === 'unistyles') {
58
+ var unistylesFiles = [
59
+ 'packages/unistyles/breakpoints.ts.ejs',
60
+ 'packages/unistyles/theme.ts.ejs',
61
+ 'packages/unistyles/unistyles.ts.ejs'
62
+ ];
63
+ files = __spreadArray(__spreadArray([], files, true), unistylesFiles, true);
64
+ }
55
65
  // add react navigation files if needed
56
66
  // modify base files with react navigation specifications
57
67
  if ((navigationPackage === null || navigationPackage === void 0 ? void 0 : navigationPackage.name) === 'react-navigation') {
@@ -153,4 +163,4 @@ function configureProjectFiles(authenticationPackage, files, navigationPackage,
153
163
  return files;
154
164
  }
155
165
  exports.configureProjectFiles = configureProjectFiles;
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlUHJvamVjdEZpbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxpdGllcy9jb25maWd1cmVQcm9qZWN0RmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRUEseURBQXdEO0FBRXhELFNBQWdCLHFCQUFxQixDQUNuQyxxQkFBb0QsRUFDcEQsS0FBZSxFQUNmLGlCQUFnRCxFQUNoRCxjQUE2QyxFQUM3QyxPQUFnQixFQUNoQixVQUFzQjs7SUFFdEIsMkRBQTJEO0lBQzNELElBQU0sU0FBUyxHQUFHO1FBQ2hCLHdCQUF3QjtRQUN4QixtQkFBbUI7UUFDbkIsa0JBQWtCO1FBQ2xCLDBCQUEwQjtRQUMxQix1QkFBdUI7UUFDdkIscUJBQXFCO1FBQ3JCLGtCQUFrQjtLQUNuQixDQUFDO0lBRUYsSUFBTSxjQUFjLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUQsdURBQXVEO0lBQ3ZELElBQUksY0FBYyxLQUFLLE1BQU0sSUFBSSxDQUFBLGlCQUFpQixhQUFqQixpQkFBaUIsdUJBQWpCLGlCQUFpQixDQUFFLElBQUksTUFBSyxhQUFhLEVBQUUsQ0FBQztRQUMzRSxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUsscUJBQU8sU0FBUyxPQUFDLENBQUM7SUFFdkIsaUNBQWlDO0lBQ2pDLG1EQUFtRDtJQUNuRCxJQUFJLENBQUEsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLElBQUksTUFBSyxZQUFZLEVBQUUsQ0FBQztRQUMxQyxJQUFNLGVBQWUsR0FBRyxDQUFDLDRDQUE0QyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7UUFFM0csS0FBSyxtQ0FBTyxLQUFLLFNBQUssZUFBZSxPQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixnREFBZ0Q7SUFDaEQsSUFBSSxDQUFBLGNBQWMsYUFBZCxjQUFjLHVCQUFkLGNBQWMsQ0FBRSxJQUFJLE1BQUssU0FBUyxFQUFFLENBQUM7UUFDdkMsSUFBTSxZQUFZLEdBQUcsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBRWhFLEtBQUssbUNBQU8sS0FBSyxTQUFLLFlBQVksT0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCw4QkFBOEI7SUFDOUIsZ0RBQWdEO0lBQ2hELElBQUksQ0FBQSxjQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUUsSUFBSSxNQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLElBQU0sWUFBWSxHQUFHO1lBQ25CLHFDQUFxQztZQUNyQyxvQ0FBb0M7WUFDcEMscUNBQXFDO1lBQ3JDLHFDQUFxQztTQUN0QyxDQUFDO1FBRUYsS0FBSyxtQ0FBTyxLQUFLLFNBQUssWUFBWSxPQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELHVDQUF1QztJQUN2Qyx5REFBeUQ7SUFDekQsSUFBSSxDQUFBLGlCQUFpQixhQUFqQixpQkFBaUIsdUJBQWpCLGlCQUFpQixDQUFFLElBQUksTUFBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQ25ELElBQUksb0JBQW9CLEdBQUc7WUFDekIsdUNBQXVDO1lBQ3ZDLG9EQUFvRDtTQUNyRCxDQUFDO1FBQ0YsMENBQTBDO1FBRTFDLElBQUksQ0FBQSxNQUFBLGlCQUFpQixhQUFqQixpQkFBaUIsdUJBQWpCLGlCQUFpQixDQUFFLE9BQU8sMENBQUUsSUFBSSxNQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ2pELG9CQUFvQixtQ0FDZixvQkFBb0I7Z0JBQ3ZCLG1EQUFtRDtnQkFDbkQsb0RBQW9EO3FCQUNyRCxDQUFDO1FBQ0osQ0FBQzthQUFNLElBQUksQ0FBQSxNQUFBLGlCQUFpQixhQUFqQixpQkFBaUIsdUJBQWpCLGlCQUFpQixDQUFFLE9BQU8sMENBQUUsSUFBSSxNQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3ZELHVCQUF1QjtZQUN2QixvQkFBb0IsbUNBQ2Ysb0JBQW9CO2dCQUN2QiwrREFBK0Q7Z0JBQy9ELDREQUE0RDtnQkFDNUQsaURBQWlEO2dCQUNqRCwrQ0FBK0M7Z0JBQy9DLCtDQUErQztxQkFDaEQsQ0FBQztRQUNKLENBQUM7YUFBTSxJQUFJLENBQUEsTUFBQSxpQkFBaUIsYUFBakIsaUJBQWlCLHVCQUFqQixpQkFBaUIsQ0FBRSxPQUFPLDBDQUFFLElBQUksTUFBSyxRQUFRLEVBQUUsQ0FBQztZQUN6RCwwQkFBMEI7WUFDMUIsb0JBQW9CLG1DQUNmLG9CQUFvQjtnQkFDdkIsK0RBQStEO2dCQUMvRCwrREFBK0Q7Z0JBQy9ELGlEQUFpRDtnQkFDakQsK0NBQStDO2dCQUMvQywrQ0FBK0M7cUJBQ2hELENBQUM7UUFDSixDQUFDO1FBRUQsc0ZBQXNGO1FBQ3RGLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUMsSUFBSSxJQUFLLE9BQUEsSUFBSSxLQUFLLGtCQUFrQixFQUEzQixDQUEyQixDQUFDLENBQUM7UUFFNUQsS0FBSyxtQ0FBTyxLQUFLLFNBQUssb0JBQW9CLE9BQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLG9EQUFvRDtJQUNwRCxJQUFJLENBQUEsaUJBQWlCLGFBQWpCLGlCQUFpQix1QkFBakIsaUJBQWlCLENBQUUsSUFBSSxNQUFLLGFBQWEsRUFBRSxDQUFDO1FBQzlDLElBQUksZUFBZSxHQUFHO1lBQ3BCLG9DQUFvQztZQUNwQyxzQ0FBc0M7WUFDdEMsK0JBQStCO1NBQ2hDLENBQUM7UUFDRiwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFBLE1BQUEsaUJBQWlCLGFBQWpCLGlCQUFpQix1QkFBakIsaUJBQWlCLENBQUUsT0FBTywwQ0FBRSxJQUFJLE1BQUssT0FBTyxFQUFFLENBQUM7WUFDakQsZUFBZSxtQ0FDVixlQUFlO2dCQUNsQixnREFBZ0Q7Z0JBQ2hELGdEQUFnRDtnQkFDaEQsOENBQThDO2dCQUM5Qyx1REFBdUQ7Z0JBQ3ZELDhDQUE4QztxQkFDL0MsQ0FBQztRQUNKLENBQUM7YUFBTSxJQUFJLENBQUEsTUFBQSxpQkFBaUIsYUFBakIsaUJBQWlCLHVCQUFqQixpQkFBaUIsQ0FBRSxPQUFPLDBDQUFFLElBQUksTUFBSyxNQUFNLEVBQUUsQ0FBQztZQUN2RCx1QkFBdUI7WUFDdkIsZUFBZSxtQ0FDVixlQUFlO2dCQUNsQixzREFBc0Q7Z0JBQ3RELG9EQUFvRDtnQkFDcEQsa0RBQWtEO2dCQUNsRCwrQ0FBK0M7Z0JBQy9DLDZDQUE2QztnQkFDN0Msc0RBQXNEO2dCQUN0RCw2Q0FBNkM7Z0JBQzdDLCtEQUErRDtxQkFDaEUsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sMEJBQTBCO1lBQzFCLGVBQWUsbUNBQ1YsZUFBZTtnQkFDbEIsMERBQTBEO2dCQUMxRCx3REFBd0Q7Z0JBQ3hELHVEQUF1RDtnQkFDdkQsaURBQWlEO2dCQUNqRCx3REFBd0Q7Z0JBQ3hELCtDQUErQztxQkFDaEQsQ0FBQztRQUNKLENBQUM7UUFFRCxtRkFBbUY7UUFDbkYsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLEtBQUssa0JBQWtCLEVBQTNCLENBQTJCLENBQUMsQ0FBQztRQUU1RCxLQUFLLG1DQUFPLEtBQUssU0FBSyxlQUFlLE9BQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsK0JBQStCO0lBQy9CLElBQUksQ0FBQSxxQkFBcUIsYUFBckIscUJBQXFCLHVCQUFyQixxQkFBcUIsQ0FBRSxJQUFJLE1BQUssVUFBVSxFQUFFLENBQUM7UUFDL0MsSUFBTSxhQUFhLEdBQUcsQ0FBQyx5Q0FBeUMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBRTVGLEtBQUssbUNBQU8sS0FBSyxTQUFLLGFBQWEsT0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsSUFBSSxDQUFBLHFCQUFxQixhQUFyQixxQkFBcUIsdUJBQXJCLHFCQUFxQixDQUFFLElBQUksTUFBSyxVQUFVLEVBQUUsQ0FBQztRQUMvQyxJQUFNLGFBQWEsR0FBRztZQUNwQix5Q0FBeUM7WUFDekMsdUNBQXVDO1lBQ3ZDLHdCQUF3QjtTQUN6QixDQUFDO1FBRUYsS0FBSyxtQ0FBTyxLQUFLLFNBQUssYUFBYSxPQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQXhLRCxzREF3S0MifQ==
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlUHJvamVjdEZpbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxpdGllcy9jb25maWd1cmVQcm9qZWN0RmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRUEseURBQXdEO0FBRXhELFNBQWdCLHFCQUFxQixDQUNuQyxxQkFBb0QsRUFDcEQsS0FBZSxFQUNmLGlCQUFnRCxFQUNoRCxjQUE2QyxFQUM3QyxPQUFnQixFQUNoQixVQUFzQjs7SUFFdEIsMkRBQTJEO0lBQzNELElBQU0sU0FBUyxHQUFHO1FBQ2hCLHdCQUF3QjtRQUN4QixtQkFBbUI7UUFDbkIsa0JBQWtCO1FBQ2xCLDBCQUEwQjtRQUMxQix1QkFBdUI7UUFDdkIscUJBQXFCO1FBQ3JCLGtCQUFrQjtLQUNuQixDQUFDO0lBRUYsSUFBTSxjQUFjLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUQsdURBQXVEO0lBQ3ZELElBQUksY0FBYyxLQUFLLE1BQU0sSUFBSSxDQUFBLGlCQUFpQixhQUFqQixpQkFBaUIsdUJBQWpCLGlCQUFpQixDQUFFLElBQUksTUFBSyxhQUFhLEVBQUUsQ0FBQztRQUMzRSxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUsscUJBQU8sU0FBUyxPQUFDLENBQUM7SUFFdkIsaUNBQWlDO0lBQ2pDLG1EQUFtRDtJQUNuRCxJQUFJLENBQUEsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLElBQUksTUFBSyxZQUFZLEVBQUUsQ0FBQztRQUMxQyxJQUFNLGVBQWUsR0FBRyxDQUFDLDRDQUE0QyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7UUFFM0csS0FBSyxtQ0FBTyxLQUFLLFNBQUssZUFBZSxPQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixnREFBZ0Q7SUFDaEQsSUFBSSxD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