create-expo-stack 2.4.0-next.f483b52 → 2.4.1-next.9242c21

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 (55) hide show
  1. package/README.md +1 -0
  2. package/build/commands/create-expo-stack.js +39 -17
  3. package/build/templates/base/App.tsx.ejs +25 -0
  4. package/build/templates/base/babel.config.js.ejs +10 -11
  5. package/build/templates/base/package.json.ejs +29 -21
  6. package/build/templates/packages/expo-router/drawer/app/(drawer)/(tabs)/_layout.tsx.ejs +41 -0
  7. package/build/templates/packages/expo-router/drawer/app/(drawer)/(tabs)/index.tsx.ejs +88 -0
  8. package/build/templates/packages/expo-router/drawer/app/(drawer)/(tabs)/two.tsx.ejs +88 -0
  9. package/build/templates/packages/expo-router/drawer/app/(drawer)/_layout.tsx.ejs +43 -19
  10. package/build/templates/packages/expo-router/drawer/app/(drawer)/index.tsx.ejs +20 -1
  11. package/build/templates/packages/expo-router/drawer/app/[...unmatched].tsx.ejs +26 -0
  12. package/build/templates/packages/expo-router/drawer/app/_layout.tsx.ejs +39 -30
  13. package/build/templates/packages/expo-router/drawer/app/modal.tsx.ejs +96 -0
  14. package/build/templates/packages/expo-router/drawer/components/edit-screen-info.tsx.ejs +153 -0
  15. package/build/templates/packages/expo-router/metro.config.js.ejs +16 -0
  16. package/build/templates/packages/expo-router/stack/app/[...unmatched].tsx.ejs +28 -0
  17. package/build/templates/packages/expo-router/stack/app/_layout.tsx.ejs +7 -0
  18. package/build/templates/packages/expo-router/stack/app/details.tsx.ejs +43 -1
  19. package/build/templates/packages/expo-router/stack/app/index.tsx.ejs +36 -0
  20. package/build/templates/packages/expo-router/tabs/app/(tabs)/_layout.tsx.ejs +30 -8
  21. package/build/templates/packages/expo-router/tabs/app/(tabs)/index.tsx.ejs +16 -2
  22. package/build/templates/packages/expo-router/tabs/app/(tabs)/two.tsx.ejs +15 -2
  23. package/build/templates/packages/expo-router/tabs/app/[...unmatched].tsx.ejs +28 -0
  24. package/build/templates/packages/expo-router/tabs/app/_layout.tsx.ejs +7 -0
  25. package/build/templates/packages/expo-router/tabs/app/modal.tsx.ejs +15 -1
  26. package/build/templates/packages/expo-router/tabs/components/edit-screen-info.tsx.ejs +36 -0
  27. package/build/templates/packages/firebase/metro.config.js.ejs +9 -10
  28. package/build/templates/packages/nativewind/global.css +3 -0
  29. package/build/templates/packages/nativewind/metro.config.js +7 -0
  30. package/build/templates/packages/nativewind/tailwind.config.js.ejs +1 -0
  31. package/build/templates/packages/react-navigation/App.tsx.ejs +6 -0
  32. package/build/templates/packages/react-navigation/components/edit-screen-info.tsx.ejs +59 -0
  33. package/build/templates/packages/react-navigation/navigation/drawer-navigator.tsx.ejs +41 -6
  34. package/build/templates/packages/react-navigation/navigation/index.tsx.ejs +31 -2
  35. package/build/templates/packages/react-navigation/navigation/tab-navigator.tsx.ejs +47 -17
  36. package/build/templates/packages/react-navigation/screens/details.tsx.ejs +25 -0
  37. package/build/templates/packages/react-navigation/screens/home.tsx.ejs +83 -0
  38. package/build/templates/packages/react-navigation/screens/modal.tsx.ejs +13 -0
  39. package/build/templates/packages/react-navigation/screens/one.tsx.ejs +12 -0
  40. package/build/templates/packages/react-navigation/screens/overview.tsx.ejs +33 -2
  41. package/build/templates/packages/react-navigation/screens/two.tsx.ejs +12 -0
  42. package/build/templates/packages/unistyles/breakpoints.ts.ejs +9 -0
  43. package/build/templates/packages/unistyles/theme.ts.ejs +76 -0
  44. package/build/templates/packages/unistyles/unistyles.ts.ejs +27 -0
  45. package/build/types/types.d.ts +2 -2
  46. package/build/types/utilities/printOutput.d.ts +2 -2
  47. package/build/types.js +3 -2
  48. package/build/utilities/configureProjectFiles.js +29 -8
  49. package/build/utilities/generateProjectFiles.js +5 -2
  50. package/build/utilities/printOutput.js +14 -2
  51. package/build/utilities/runCLI.js +7 -3
  52. package/build/utilities/showHelp.js +3 -1
  53. package/package.json +2 -2
  54. package/build/templates/packages/expo-router/drawer/app/(drawer)/news.tsx.ejs +0 -71
  55. package/build/templates/packages/expo-router/metro.config.js +0 -11
@@ -1,61 +1,90 @@
1
- import FontAwesome from "@expo/vector-icons/FontAwesome";
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
- import { Pressable, StyleSheet } from "react-native";
4
+ <% if (props.stylingPackage?.name === 'unistyles') { %>
5
+ import { createStyleSheet, useStyles } from 'react-native-unistyles'
6
+ import { Pressable } from 'react-native';
7
+ <% } else if (props.navigationPackage?.options.type === 'drawer + tabs' ) { %>
8
+ import { StyleSheet } from 'react-native';
9
+ <% } else { %>
10
+ import { Pressable, StyleSheet } from 'react-native';
11
+ <% } %>
5
12
 
6
13
  import { RootStackParamList } from '.';
7
- import One from "../screens/one";
8
- import Two from "../screens/two";
14
+ import One from '../screens/one';
15
+ import Two from '../screens/two';
9
16
 
10
17
  const Tab = createBottomTabNavigator();
11
18
 
12
19
  function TabBarIcon(props: {
13
- name: React.ComponentProps<typeof FontAwesome>["name"];
20
+ name: React.ComponentProps<typeof FontAwesome>['name'];
14
21
  color: string;
15
22
  }) {
23
+ <% if (props.stylingPackage?.name === 'unistyles') {%>
24
+ const { styles } = useStyles(stylesheet)
25
+ <% } %>
16
26
  return <FontAwesome size={28} style={styles.tabBarIcon} {...props} />;
17
27
  }
18
28
 
19
29
  type Props = StackScreenProps<RootStackParamList, 'TabNavigator'>;
20
30
 
21
31
  export default function TabLayout({ navigation }: Props) {
32
+ <% if (props.stylingPackage?.name === 'unistyles') {%>
33
+ const { styles } = useStyles(stylesheet)
34
+ <% } %>
35
+
22
36
  return (
23
37
  <Tab.Navigator
24
38
  screenOptions={{
25
- tabBarActiveTintColor: "black",
39
+ tabBarActiveTintColor: 'black',
40
+ <% if (props.navigationPackage?.options.type === 'drawer + tabs') { %>
41
+ headerShown: false,
42
+ <% } %>
26
43
  }}>
27
44
  <Tab.Screen
28
- name="One"
45
+ name='One'
29
46
  component={One}
30
47
  options={{
31
- title: "Tab One",
32
- tabBarIcon: ({ color }) => <TabBarIcon name="code" color={color} />,
48
+ title: 'Tab One',
49
+ tabBarIcon: ({ color }) => <TabBarIcon name='code' color={color} />,
50
+ <% if (props.navigationPackage?.options.type === 'tabs') { %>
33
51
  headerRight: () => (
34
- <Pressable onPress={() => navigation.navigate("Modal")}>
52
+ <Pressable onPress={() => navigation.navigate('Modal')}>
35
53
  {({ pressed }) => (
36
54
  <FontAwesome
37
- name="info-circle"
55
+ name='info-circle'
38
56
  size={25}
39
- color="gray"
57
+ color='gray'
40
58
  style={[styles.headerRight, { opacity: pressed ? 0.5 : 1 }]}
41
59
  />
42
60
  )}
43
61
  </Pressable>
44
- ),
62
+ )
63
+ <% } %>
45
64
  }}
46
65
  />
47
66
  <Tab.Screen
48
- name="Two"
67
+ name='Two'
49
68
  component={Two}
50
69
  options={{
51
- title: "Tab Two",
52
- tabBarIcon: ({ color }) => <TabBarIcon name="code" color={color} />,
70
+ title: 'Tab Two',
71
+ tabBarIcon: ({ color }) => <TabBarIcon name='code' color={color} />,
53
72
  }}
54
73
  />
55
74
  </Tab.Navigator>
56
75
  );
57
76
  }
58
77
 
78
+ <% if (props.stylingPackage?.name === 'unistyles') { %>
79
+ const stylesheet = createStyleSheet({
80
+ headerRight: {
81
+ marginRight: 15
82
+ },
83
+ tabBarIcon: {
84
+ marginBottom: -3
85
+ }
86
+ });
87
+ <% } else { %>
59
88
  const styles = StyleSheet.create({
60
89
  headerRight: {
61
90
  marginRight: 15
@@ -63,4 +92,5 @@ const styles = StyleSheet.create({
63
92
  tabBarIcon: {
64
93
  marginBottom: -3
65
94
  }
66
- });
95
+ });
96
+ <% } %>
@@ -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: {
@@ -0,0 +1,83 @@
1
+ <% if (props.stylingPackage?.name === 'nativewind') { %>
2
+ import { Text, View } from 'react-native';
3
+ <% } else if (props.stylingPackage?.name === 'tamagui') { %>
4
+ import { YStack, H2, Separator, Theme } from 'tamagui';
5
+ <% } else if (props.stylingPackage?.name === 'restyle') { %>
6
+ import { Box, Text } from 'theme';
7
+ <% } else if (props.stylingPackage?.name === 'unistyles') { %>
8
+ import { useStyles } from 'react-native-unistyles'
9
+ import { Text, View } from 'react-native';
10
+ <% } else if (props.stylingPackage?.name === 'stylesheet') { %>
11
+ import { StyleSheet, Text, View } from 'react-native';
12
+ <% } %>
13
+
14
+ const Page = () => {
15
+ <% if (props.stylingPackage?.name === 'unistyles') { %>
16
+ const { theme } = useStyles();
17
+
18
+ return (
19
+ <View style={theme.components.container}>
20
+ <Text style={theme.components.title}>News</Text>
21
+ <View style={theme.components.separator} />
22
+ </View>
23
+ );
24
+ <% } else if (props.stylingPackage?.name === 'nativewind') { %>
25
+ return (
26
+ <View className={styles.container}>
27
+ <Text className={styles.title}>Home</Text>
28
+ <View className={styles.separator} />
29
+ <EditScreenInfo path='app/(tabs)/index.tsx' />
30
+ </View>
31
+ );
32
+ <% } else if (props.stylingPackage?.name === 'tamagui') { %>
33
+ return (
34
+ <Theme name='light'>
35
+ <YStack flex={1} alignItems='center' justifyContent='center'>
36
+ <H2>Home</H2>
37
+ <Separator />
38
+ </YStack>
39
+ </Theme>
40
+ );
41
+ <% } else if (props.stylingPackage?.name === 'restyle') { %>
42
+ return (
43
+ <Box flex={1} alignItems='center' justifyContent='center'>
44
+ <Text variant='title'>Home</Text>
45
+ <Box height={1} marginVertical='l_32' width='80%' />
46
+ </Box>
47
+ );
48
+ <% } else { %>
49
+ return (
50
+ <View style={styles.container}>
51
+ <Text style={styles.title}>Home</Text>
52
+ <View style={styles.separator} />
53
+ </View>
54
+ );
55
+ <% } %>
56
+ }
57
+
58
+ export default Page;
59
+
60
+ <% if (props.stylingPackage?.name === 'nativewind') { %>
61
+ const styles = {
62
+ container: `items-center flex-1 justify-center`,
63
+ separator: `h-[1px] my-7 w-4/5 bg-gray-200`,
64
+ title: `text-xl font-bold`
65
+ };
66
+ <% } else if (props.stylingPackage?.name === 'stylesheet') { %>
67
+ const styles = StyleSheet.create({
68
+ container: {
69
+ alignItems: 'center',
70
+ flex: 1,
71
+ justifyContent: 'center',
72
+ },
73
+ separator: {
74
+ height: 1,
75
+ marginVertical: 30,
76
+ width: '80%',
77
+ },
78
+ title: {
79
+ fontSize: 20,
80
+ fontWeight: 'bold',
81
+ }
82
+ });
83
+ <% } %>
@@ -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,8 +5,8 @@ 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"];
9
- export type NavigationTypes = 'stack' | 'tabs' | 'drawer' | undefined;
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
+ export type NavigationTypes = 'stack' | 'tabs' | 'drawer + tabs' | undefined;
10
10
  export type PackageManager = 'yarn' | 'npm' | 'pnpm' | 'bun';
11
11
  export type AvailablePackages = {
12
12
  name: (typeof availablePackages)[number];
@@ -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=
@@ -32,7 +32,12 @@ function configureProjectFiles(authenticationPackage, files, navigationPackage,
32
32
  // add nativewind files if needed
33
33
  // modify base files with nativewind specifications
34
34
  if ((stylingPackage === null || stylingPackage === void 0 ? void 0 : stylingPackage.name) === 'nativewind') {
35
- var nativewindFiles = ['packages/nativewind/tailwind.config.js.ejs', 'packages/nativewind/app-env.d.ts'];
35
+ var nativewindFiles = [
36
+ 'packages/nativewind/tailwind.config.js.ejs',
37
+ 'packages/nativewind/app-env.d.ts',
38
+ 'packages/nativewind/metro.config.js',
39
+ 'packages/nativewind/global.css'
40
+ ];
36
41
  files = __spreadArray(__spreadArray([], files, true), nativewindFiles, true);
37
42
  }
38
43
  // add tamagui files if needed
@@ -52,6 +57,16 @@ function configureProjectFiles(authenticationPackage, files, navigationPackage,
52
57
  ];
53
58
  files = __spreadArray(__spreadArray([], files, true), restyleFiles, true);
54
59
  }
60
+ // add unistyles files if needed
61
+ // modify base files with unis specifications
62
+ if ((stylingPackage === null || stylingPackage === void 0 ? void 0 : stylingPackage.name) === 'unistyles') {
63
+ var unistylesFiles = [
64
+ 'packages/unistyles/breakpoints.ts.ejs',
65
+ 'packages/unistyles/theme.ts.ejs',
66
+ 'packages/unistyles/unistyles.ts.ejs'
67
+ ];
68
+ files = __spreadArray(__spreadArray([], files, true), unistylesFiles, true);
69
+ }
55
70
  // add react navigation files if needed
56
71
  // modify base files with react navigation specifications
57
72
  if ((navigationPackage === null || navigationPackage === void 0 ? void 0 : navigationPackage.name) === 'react-navigation') {
@@ -76,11 +91,13 @@ function configureProjectFiles(authenticationPackage, files, navigationPackage,
76
91
  'packages/react-navigation/screens/two.tsx.ejs'
77
92
  ], false);
78
93
  }
79
- else if (((_c = navigationPackage === null || navigationPackage === void 0 ? void 0 : navigationPackage.options) === null || _c === void 0 ? void 0 : _c.type) === 'drawer') {
94
+ else if (((_c = navigationPackage === null || navigationPackage === void 0 ? void 0 : navigationPackage.options) === null || _c === void 0 ? void 0 : _c.type) === 'drawer + tabs') {
80
95
  // it's a drawer navigator
81
96
  reactNavigationFiles = __spreadArray(__spreadArray([], reactNavigationFiles, true), [
82
97
  'packages/react-navigation/components/edit-screen-info.tsx.ejs',
83
98
  'packages/react-navigation/navigation/drawer-navigator.tsx.ejs',
99
+ 'packages/react-navigation/navigation/tab-navigator.tsx.ejs',
100
+ 'packages/react-navigation/screens/home.tsx.ejs',
84
101
  'packages/react-navigation/screens/modal.tsx.ejs',
85
102
  'packages/react-navigation/screens/one.tsx.ejs',
86
103
  'packages/react-navigation/screens/two.tsx.ejs'
@@ -95,7 +112,7 @@ function configureProjectFiles(authenticationPackage, files, navigationPackage,
95
112
  if ((navigationPackage === null || navigationPackage === void 0 ? void 0 : navigationPackage.name) === 'expo-router') {
96
113
  var expoRouterFiles = [
97
114
  'packages/expo-router/expo-env.d.ts',
98
- 'packages/expo-router/metro.config.js',
115
+ 'packages/expo-router/metro.config.js.ejs',
99
116
  'packages/expo-router/index.ts'
100
117
  ];
101
118
  // if it's a stack, add the stack files) {
@@ -124,12 +141,16 @@ function configureProjectFiles(authenticationPackage, files, navigationPackage,
124
141
  else {
125
142
  // it's a drawer navigator
126
143
  expoRouterFiles = __spreadArray(__spreadArray([], expoRouterFiles, true), [
127
- 'packages/expo-router/drawer/app/(drawer)/_layout.tsx.ejs',
128
- 'packages/expo-router/drawer/app/(drawer)/index.tsx.ejs',
129
- 'packages/expo-router/drawer/app/(drawer)/news.tsx.ejs',
130
144
  'packages/expo-router/drawer/app/_layout.tsx.ejs',
131
145
  'packages/expo-router/drawer/app/[...unmatched].tsx.ejs',
132
- 'packages/expo-router/drawer/app/+html.tsx.ejs'
146
+ 'packages/expo-router/drawer/app/+html.tsx.ejs',
147
+ 'packages/expo-router/drawer/app/(drawer)/_layout.tsx.ejs',
148
+ 'packages/expo-router/drawer/app/(drawer)/index.tsx.ejs',
149
+ 'packages/expo-router/drawer/app/(drawer)/(tabs)/_layout.tsx.ejs',
150
+ 'packages/expo-router/drawer/app/(drawer)/(tabs)/index.tsx.ejs',
151
+ 'packages/expo-router/drawer/app/(drawer)/(tabs)/two.tsx.ejs',
152
+ 'packages/expo-router/drawer/app/modal.tsx.ejs',
153
+ 'packages/expo-router/drawer/components/edit-screen-info.tsx.ejs'
133
154
  ], false);
134
155
  }
135
156
  // Remove the base App.tsx.ejs file since we'll be using index.tsx from expo-router
@@ -153,4 +174,4 @@ function configureProjectFiles(authenticationPackage, files, navigationPackage,
153
174
  return files;
154
175
  }
155
176
  exports.configureProjectFiles = configureProjectFiles;
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlUHJvamVjdEZpbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxpdGllcy9jb25maWd1cmVQcm9qZWN0RmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRUEseURBQXdEO0FBRXhELFNBQWdCLHFCQUFxQixDQUNuQyxxQkFBb0QsRUFDcEQsS0FBZSxFQUNmLGlCQUFnRCxFQUNoRCxjQUE2QyxFQUM3QyxPQUFnQixFQUNoQixVQUFzQjs7SUFFdEIsMkRBQTJEO0lBQzNELElBQU0sU0FBUyxHQUFHO1FBQ2hCLHdCQUF3QjtRQUN4QixtQkFBbUI7UUFDbkIsa0JBQWtCO1FBQ2xCLDBCQUEwQjtRQUMxQix1QkFBdUI7UUFDdkIscUJBQXFCO1FBQ3JCLGtCQUFrQjtLQUNuQixDQUFDO0lBRUYsSUFBTSxjQUFjLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUQsdURBQXVEO0lBQ3ZELElBQUksY0FBYyxLQUFLLE1BQU0sSUFBSSxDQUFBLGlCQUFpQixhQUFqQixpQkFBaUIsdUJBQWpCLGlCQUFpQixDQUFFLElBQUksTUFBSyxhQUFhLEVBQUUsQ0FBQztRQUMzRSxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUsscUJBQU8sU0FBUyxPQUFDLENBQUM7SUFFdkIsaUNBQWlDO0lBQ2pDLG1EQUFtRDtJQUNuRCxJQUFJLENBQUEsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLElBQUksTUFBSyxZQUFZLEVBQUUsQ0FBQztRQUMxQyxJQUFNLGVBQWUsR0FBRyxDQUFDLDRDQUE0QyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7UUFFM0csS0FBSyxtQ0FBTyxLQUFLLFNBQUssZUFBZSxPQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixnREFBZ0Q7SUFDaEQsSUFBSSxD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
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlUHJvamVjdEZpbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxpdGllcy9jb25maWd1cmVQcm9qZWN0RmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRUEseURBQXdEO0FBRXhELFNBQWdCLHFCQUFxQixDQUNuQyxxQkFBb0QsRUFDcEQsS0FBZSxFQUNmLGlCQUFnRCxFQUNoRCxjQUE2QyxFQUM3QyxPQUFnQixFQUNoQixVQUFzQjs7SUFFdEIsMkRBQTJEO0lBQzNELElBQU0sU0FBUyxHQUFHO1FBQ2hCLHdCQUF3QjtRQUN4QixtQkFBbUI7UUFDbkIsa0JBQWtCO1FBQ2xCLDBCQUEwQjtRQUMxQix1QkFBdUI7UUFDdkIscUJBQXFCO1FBQ3JCLGtCQUFrQjtLQUNuQixDQUFDO0lBRUYsSUFBTSxjQUFjLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUQsdURBQXVEO0lBQ3ZELElBQUksY0FBYyxLQUFLLE1BQU0sSUFBSSxDQUFBLGlCQUFpQixhQUFqQixpQkFBaUIsdUJBQWpCLGlCQUFpQixDQUFFLElBQUksTUFBSyxhQUFhLEVBQUUsQ0FBQztRQUMzRSxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUsscUJBQU8sU0FBUyxPQUFDLENBQUM7SUFFdkIsaUNBQWlDO0lBQ2pDLG1EQUFtRDtJQUNuRCxJQUFJLENBQUEsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLElBQUksTUFBSyxZQUFZLEVBQUUsQ0FBQztRQUMxQyxJQUFNLGVBQWUsR0FBRztZQUN0Qiw0Q0FBNEM7WUFDNUMsa0NBQWtDO1lBQ2xDLHFDQUFxQztZQUNyQyxnQ0FBZ0M7U0FDakMsQ0FBQztRQUVGLEtBQUssbUNBQU8sS0FBSyxTQUFLLGVBQWUsT0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCw4QkFB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