create-expo-stack 2.5.0-next.738ca1b → 2.5.0-next.807f3dc
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 +11 -153
- package/build/templates/base/App.tsx.ejs +44 -110
- package/build/templates/base/components/BackButton.tsx.ejs +23 -0
- package/build/templates/base/components/Button.tsx.ejs +40 -0
- package/build/templates/base/components/EditScreenInfo.tsx.ejs +55 -0
- package/build/templates/base/components/HeaderButton.tsx.ejs +28 -0
- package/build/templates/base/components/ScreenContent.tsx.ejs +38 -0
- package/build/templates/base/components/TabBarIcon.tsx.ejs +15 -0
- package/build/templates/packages/expo-router/drawer/app/(drawer)/(tabs)/_layout.tsx.ejs +1 -13
- package/build/templates/packages/expo-router/drawer/app/(drawer)/(tabs)/index.tsx.ejs +18 -84
- package/build/templates/packages/expo-router/drawer/app/(drawer)/(tabs)/two.tsx.ejs +18 -84
- package/build/templates/packages/expo-router/drawer/app/(drawer)/_layout.tsx.ejs +4 -18
- package/build/templates/packages/expo-router/drawer/app/(drawer)/index.tsx.ejs +12 -98
- package/build/templates/packages/expo-router/drawer/app/modal.tsx.ejs +16 -92
- package/build/templates/packages/expo-router/stack/app/details.tsx.ejs +17 -171
- package/build/templates/packages/expo-router/stack/app/index.tsx.ejs +20 -202
- package/build/templates/packages/expo-router/tabs/app/(tabs)/_layout.tsx.ejs +6 -50
- package/build/templates/packages/expo-router/tabs/app/(tabs)/index.tsx.ejs +18 -102
- package/build/templates/packages/expo-router/tabs/app/(tabs)/two.tsx.ejs +18 -83
- package/build/templates/packages/expo-router/tabs/app/modal.tsx.ejs +17 -92
- package/build/templates/packages/i18next/components/InternalizationExample.tsx.ejs +1 -1
- package/build/templates/packages/i18next/translation/en.json.ejs +3 -3
- package/build/templates/packages/i18next/translation/fr.json.ejs +3 -3
- package/build/templates/packages/nativewind/components/BackButton.tsx.ejs +18 -0
- package/build/templates/packages/nativewind/components/Button.tsx.ejs +14 -0
- package/build/templates/packages/nativewind/components/EditScreenInfo.tsx.ejs +40 -0
- package/build/templates/packages/nativewind/components/ScreenContent.tsx.ejs +25 -0
- package/build/templates/packages/react-navigation/App.tsx.ejs +1 -1
- package/build/templates/packages/react-navigation/navigation/drawer-navigator.tsx.ejs +14 -26
- package/build/templates/packages/react-navigation/navigation/index.tsx.ejs +2 -101
- package/build/templates/packages/react-navigation/navigation/tab-navigator.tsx.ejs +8 -62
- package/build/templates/packages/react-navigation/screens/details.tsx.ejs +22 -108
- package/build/templates/packages/react-navigation/screens/home.tsx.ejs +3 -100
- package/build/templates/packages/react-navigation/screens/modal.tsx.ejs +16 -104
- package/build/templates/packages/react-navigation/screens/one.tsx.ejs +2 -115
- package/build/templates/packages/react-navigation/screens/overview.tsx.ejs +37 -199
- package/build/templates/packages/react-navigation/screens/two.tsx.ejs +3 -98
- package/build/templates/packages/restyle/components/BackButton.tsx.ejs +15 -0
- package/build/templates/packages/restyle/components/Button.tsx.ejs +32 -0
- package/build/templates/packages/restyle/components/EditScreenInfo.tsx.ejs +29 -0
- package/build/templates/packages/restyle/components/ScreenContent.tsx.ejs +20 -0
- package/build/templates/packages/tamagui/components/BackButton.tsx.ejs +19 -0
- package/build/templates/packages/tamagui/components/Button.tsx.ejs +9 -0
- package/build/templates/packages/tamagui/components/EditScreenInfo.tsx.ejs +29 -0
- package/build/templates/packages/tamagui/components/ScreenContent.tsx.ejs +22 -0
- package/build/templates/packages/unistyles/components/BackButton.tsx.ejs +26 -0
- package/build/templates/packages/unistyles/components/Button.tsx.ejs +12 -0
- package/build/templates/packages/unistyles/components/EditScreenInfo.tsx.ejs +61 -0
- package/build/templates/packages/unistyles/components/ScreenContent.tsx.ejs +24 -0
- package/build/templates/packages/unistyles/theme.ts.ejs +30 -46
- package/build/utilities/configureProjectFiles.js +68 -10
- package/build/utilities/generateProjectFiles.js +2 -2
- package/build/utilities/showHelp.js +3 -3
- package/package.json +1 -1
- package/build/templates/packages/expo-router/drawer/components/edit-screen-info.tsx.ejs +0 -153
- package/build/templates/packages/expo-router/tabs/components/edit-screen-info.tsx.ejs +0 -153
- package/build/templates/packages/react-navigation/components/edit-screen-info.tsx.ejs +0 -180
package/README.md
CHANGED
|
@@ -12,14 +12,17 @@
|
|
|
12
12
|
|
|
13
13
|
## Sponsors
|
|
14
14
|
|
|
15
|
-
NativeWind
|
|
16
|
-
Restyle
|
|
17
|
-
StyleSheets
|
|
18
|
-
Tamagui
|
|
19
|
-
|
|
20
15
|
Support this project by <a href="https://github.com/sponsors/danstepanov" target="_blank">becoming a sponsor</a>. Your logo will show up here with a link to your website.
|
|
21
16
|
|
|
22
|
-
<a href="https://galaxies.dev/" target="_blank" style="margin-top: 10px;margin-right: 10px; margin-bottom: 10px;"
|
|
17
|
+
<a href="https://galaxies.dev/" target="_blank" style="margin-top: 10px;margin-right: 10px; margin-bottom: 10px;" >
|
|
18
|
+
<img src="https://expostack.dev/galaxies-logo.svg" style="border-radius: 50%;">
|
|
19
|
+
</a>
|
|
20
|
+
<a href="https://expo.dev/" target="_blank" style="margin: 10px;">
|
|
21
|
+
<img src="https://expostack.dev/expo-logo.svg" style="border-radius: 50%;">
|
|
22
|
+
</a>
|
|
23
|
+
<a href="https://github.com/derkweijers" target="_blank" style="margin: 10px;">
|
|
24
|
+
<img src="https://avatars.githubusercontent.com/u/11644998?v=4" height="64" width="64" style="border-radius: 50%;">
|
|
25
|
+
</a>
|
|
23
26
|
|
|
24
27
|
## Description
|
|
25
28
|
|
|
@@ -84,153 +87,8 @@ If you'd like help with your React Native/Expo app or are just looking for a tec
|
|
|
84
87
|
|
|
85
88
|
Thanks go to these wonderful people:
|
|
86
89
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
<tr>
|
|
90
|
-
<td align="center" valign="top" width="14.28%">
|
|
91
|
-
<a href="https://onlydans.gg/">
|
|
92
|
-
<img src="https://pbs.twimg.com/profile_images/1689473757713514496/8fQrCrBx_400x400.jpg" width="100px;" alt="Dan Stepanov"/>
|
|
93
|
-
<br />
|
|
94
|
-
Dan Stepanov
|
|
95
|
-
</a>
|
|
96
|
-
</td>
|
|
97
|
-
<td align="center" valign="top" width="14.28%">
|
|
98
|
-
<a href="https://twitter.com/ernestodotgg">
|
|
99
|
-
<img src="https://pbs.twimg.com/profile_images/1647055447931617285/RPeZJI3z_400x400.jpg" width="100px;" alt="Ernesto Resende"/>
|
|
100
|
-
<br />
|
|
101
|
-
Ernesto Resende
|
|
102
|
-
</a>
|
|
103
|
-
</td>
|
|
104
|
-
<td align="center" valign="top" width="14.28%">
|
|
105
|
-
<a href="https://github.com/hqasmei">
|
|
106
|
-
<img src="https://avatars.githubusercontent.com/u/39573679?v=4" width="100px;" alt="Hosna Qasmei"/>
|
|
107
|
-
<br />
|
|
108
|
-
Hosna Qasmei
|
|
109
|
-
</a>
|
|
110
|
-
</td>
|
|
111
|
-
<td align="center" valign="top" width="14.28%">
|
|
112
|
-
<a href="https://github.com/frankcalise/">
|
|
113
|
-
<img src="https://pbs.twimg.com/profile_images/1262363198839238662/uIfRNVBY_400x400.jpg" width="100px;" alt="Frank Calise"/>
|
|
114
|
-
<br />
|
|
115
|
-
Frank Calise
|
|
116
|
-
</a>
|
|
117
|
-
</td>
|
|
118
|
-
</tr>
|
|
119
|
-
<tr>
|
|
120
|
-
<td align="center" valign="top" width="14.28%">
|
|
121
|
-
<a href="https://github.com/sammoore">
|
|
122
|
-
<img src="https://avatars.githubusercontent.com/u/2035492?v=4" width="100px;" alt="Sam Moore"/>
|
|
123
|
-
<br />
|
|
124
|
-
Sam Moore
|
|
125
|
-
</a>
|
|
126
|
-
</td>
|
|
127
|
-
<td align="center" valign="top" width="14.28%">
|
|
128
|
-
<a href="https://twitter.com/mironcatalin">
|
|
129
|
-
<img src="https://avatars.githubusercontent.com/u/2805320?v=4" width="100px;" alt="Catalin Miron"/>
|
|
130
|
-
<br />
|
|
131
|
-
Catalin Miron
|
|
132
|
-
</a>
|
|
133
|
-
</td>
|
|
134
|
-
<td align="center" valign="top" width="14.28%">
|
|
135
|
-
<a href="https://twitter.com/PickleNik0864">
|
|
136
|
-
<img src="https://pbs.twimg.com/profile_images/1694518037385244672/eaS0RTwB_400x400.jpg" width="100px;" alt="catalinmiron"/>
|
|
137
|
-
<br />
|
|
138
|
-
PickleNik
|
|
139
|
-
</a>
|
|
140
|
-
</td>
|
|
141
|
-
<td align="center" valign="top" width="14.28%">
|
|
142
|
-
<a href="https://twitter.com/trashh_dev">
|
|
143
|
-
<img src="https://pbs.twimg.com/profile_images/1598959528518643713/aWdwBYxv_400x400.jpg" width="100px;" alt="Chris Bautista"/>
|
|
144
|
-
<br />
|
|
145
|
-
Chris Bautista
|
|
146
|
-
</a>
|
|
147
|
-
</td>
|
|
148
|
-
</tr>
|
|
149
|
-
<tr>
|
|
150
|
-
<td align="center" valign="top" width="14.28%">
|
|
151
|
-
<a href="https://twitter.com/hugemathguy">
|
|
152
|
-
<img src="https://pbs.twimg.com/profile_images/1503470123763617796/49xDaART_400x400.jpg" width="100px;" alt="Andrew Levy"/>
|
|
153
|
-
<br />
|
|
154
|
-
Andrew Levy
|
|
155
|
-
</a>
|
|
156
|
-
</td>
|
|
157
|
-
<td align="center" valign="top" width="14.28%">
|
|
158
|
-
<a href="https://twitter.com/alire74_">
|
|
159
|
-
<img src="https://pbs.twimg.com/profile_images/1680836863026765824/lrljy0sl_400x400.jpg" width="100px;" alt="Ali Zamani"/>
|
|
160
|
-
<br />
|
|
161
|
-
Ali Zamani
|
|
162
|
-
</a>
|
|
163
|
-
</td>
|
|
164
|
-
<td align="center" valign="top" width="14.28%">
|
|
165
|
-
<a href="https://github.com/saimon24">
|
|
166
|
-
<img src="https://avatars.githubusercontent.com/u/2514208?v=4" width="100px;" alt="Simon Grimm"/>
|
|
167
|
-
<br />
|
|
168
|
-
Simon Grimm
|
|
169
|
-
</a>
|
|
170
|
-
</td>
|
|
171
|
-
<td align="center" valign="top" width="14.28%">
|
|
172
|
-
<a href="https://twitter.com/mwarger">
|
|
173
|
-
<img src="https://avatars.githubusercontent.com/u/686823?v=4" width="100px;" alt="Mat Warger"/>
|
|
174
|
-
<br />
|
|
175
|
-
Mat Warger
|
|
176
|
-
</a>
|
|
177
|
-
</td>
|
|
178
|
-
</tr>
|
|
179
|
-
<tr>
|
|
180
|
-
<td align="center" valign="top" width="14.28%">
|
|
181
|
-
<a href="https://github.com/kratos-respawned">
|
|
182
|
-
<img src="https://avatars.githubusercontent.com/u/87561983?v=4" width="100px;" alt="kratos-respawned"/>
|
|
183
|
-
<br />
|
|
184
|
-
Gaurav Bhandari
|
|
185
|
-
</a>
|
|
186
|
-
</td>
|
|
187
|
-
<td align="center" valign="top" width="14.28%">
|
|
188
|
-
<a href="https://github.com/b0iq">
|
|
189
|
-
<img src="https://avatars.githubusercontent.com/u/106549013?v=4" width="100px;" alt="b0iq"/>
|
|
190
|
-
<br />
|
|
191
|
-
b0iq
|
|
192
|
-
</a>
|
|
193
|
-
</td>
|
|
194
|
-
<td align="center" valign="top" width="14.28%">
|
|
195
|
-
<a href="https://aodhan.netlify.app/">
|
|
196
|
-
<img src="https://pbs.twimg.com/profile_images/1472990183993888772/3X5J4d9__400x400.png" width="100px;" alt="Aodhan Hamilton"/>
|
|
197
|
-
<br />
|
|
198
|
-
Aodhan Hamilton
|
|
199
|
-
</a>
|
|
200
|
-
</td>
|
|
201
|
-
<td align="center" valign="top" width="14.28%">
|
|
202
|
-
<a href="https://github.com/finnbayer">
|
|
203
|
-
<img src="https://avatars.githubusercontent.com/u/115630860?v=4" width="100px;" alt="finnbayer"/>
|
|
204
|
-
<br />
|
|
205
|
-
Finn Bayer
|
|
206
|
-
</a>
|
|
207
|
-
</td>
|
|
208
|
-
</tr>
|
|
209
|
-
<tr>
|
|
210
|
-
<td align="center" valign="top" width="14.28%">
|
|
211
|
-
<a href="https://github.com/todevmilen">
|
|
212
|
-
<img src="https://avatars.githubusercontent.com/u/78319110?v=4" width="100px;" alt="todevmilen"/>
|
|
213
|
-
<br />
|
|
214
|
-
Milen Todev
|
|
215
|
-
</a>
|
|
216
|
-
</td>
|
|
217
|
-
<td align="center" valign="top" width="14.28%">
|
|
218
|
-
<a href="https://github.com/gialencar">
|
|
219
|
-
<img src="https://avatars.githubusercontent.com/u/11895696?v=4" width="100px;" alt="gialencar"/>
|
|
220
|
-
<br />
|
|
221
|
-
Gilson Alencar
|
|
222
|
-
</a>
|
|
223
|
-
</td>
|
|
224
|
-
<td align="center" valign="top" width="14.28%">
|
|
225
|
-
<a href="https://github.com/Joehoel">
|
|
226
|
-
<img src="https://avatars.githubusercontent.com/u/31251240?v=4" width="100px;" alt="joehoel"/>
|
|
227
|
-
<br />
|
|
228
|
-
Joël Kuijper
|
|
229
|
-
</a>
|
|
230
|
-
</td>
|
|
231
|
-
</tr>
|
|
232
|
-
</tbody>
|
|
233
|
-
</table>
|
|
90
|
+
<!-- readme: contributors -start -->
|
|
91
|
+
<!-- readme: contributors -end -->
|
|
234
92
|
|
|
235
93
|
[downloads-image]: https://img.shields.io/npm/dm/create-expo-stack?color=364fc7&logoColor=364fc7
|
|
236
94
|
[npm-url]: https://www.npmjs.com/package/create-expo-stack
|
|
@@ -1,127 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
import '
|
|
3
|
-
<% } %>
|
|
4
|
-
import React from 'react';
|
|
5
|
-
|
|
6
|
-
<% if (props.stylingPackage?.name === "nativewind") {%>
|
|
7
|
-
import { Text, View } from 'react-native';
|
|
8
|
-
<% } else if (props.stylingPackage?.name === "tamagui") {%>
|
|
9
|
-
import { View } from 'react-native';
|
|
10
|
-
import { TamaguiProvider, Text, styled } from 'tamagui';
|
|
11
|
-
import config from './tamagui.config'
|
|
12
|
-
<% } else if (props.stylingPackage?.name === "restyle") {%>
|
|
13
|
-
import { ThemeProvider } from '@shopify/restyle';
|
|
14
|
-
import {theme, Text} from './theme';
|
|
15
|
-
<% } else if (props.stylingPackage?.name === "unistyles") {%>
|
|
16
|
-
import { createStyleSheet, useStyles } from 'react-native-unistyles'
|
|
17
|
-
import { Text, View } from 'react-native';
|
|
18
|
-
<% } else {%>
|
|
19
|
-
import { StyleSheet, Text, View } from 'react-native';
|
|
20
|
-
<% } %>
|
|
1
|
+
import { ScreenContent } from 'components/ScreenContent';
|
|
2
|
+
import { StatusBar } from 'expo-status-bar';
|
|
21
3
|
|
|
22
4
|
<% if (props.internalizationPackage?.name === "i18next") { %>
|
|
23
|
-
import { InternalizationExample } from 'components/InternalizationExample';
|
|
24
|
-
|
|
25
5
|
import './translation';
|
|
6
|
+
import { InternalizationExample } from 'components/InternalizationExample';
|
|
26
7
|
<% } %>
|
|
27
8
|
|
|
9
|
+
<% if (props.stylingPackage?.name === "nativewind") { %>
|
|
10
|
+
import './global.css';
|
|
11
|
+
<% } else if (props.stylingPackage?.name === "restyle") { %>
|
|
12
|
+
import { ThemeProvider } from '@shopify/restyle';
|
|
13
|
+
import { theme } from 'theme';
|
|
14
|
+
<% } else if (props.stylingPackage?.name === "tamagui") { %>
|
|
15
|
+
import { TamaguiProvider } from 'tamagui';
|
|
16
|
+
import config from './tamagui.config';
|
|
17
|
+
<% } %>
|
|
28
18
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
<View className={styles.container}>
|
|
35
|
-
<% if (props.internalizationPackage?.name === "i18next") { %>
|
|
36
|
-
<InternalizationExample />
|
|
37
|
-
<% } else { %>
|
|
38
|
-
<Text>Open up App.tsx to start working on your app!</Text>
|
|
39
|
-
<% } %>
|
|
40
|
-
<StatusBar style="auto" />
|
|
41
|
-
</View >
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const styles = {
|
|
46
|
-
container: 'flex flex-1 items-center justify-center bg-white',
|
|
47
|
-
};
|
|
48
|
-
<% } else if (props.stylingPackage?.name === "tamagui") {%>
|
|
49
|
-
const MyView = styled(View, {
|
|
50
|
-
name: "MyView",
|
|
51
|
-
flex: 1,
|
|
52
|
-
alignItems: 'center',
|
|
53
|
-
justifyContent: 'center',
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
export default function App() {
|
|
57
|
-
return (
|
|
58
|
-
<TamaguiProvider config={config}>
|
|
59
|
-
<MyView>
|
|
60
|
-
<Text>Open up App.tsx to start working on your app!</Text>
|
|
19
|
+
<% if (props.stylingPackage?.name === "restyle") {%>
|
|
20
|
+
export default function App() {
|
|
21
|
+
return (
|
|
22
|
+
<ThemeProvider theme={theme}>
|
|
23
|
+
<ScreenContent title="Home" path="App.tsx">
|
|
61
24
|
<% if (props.internalizationPackage?.name === "i18next") { %>
|
|
62
25
|
<InternalizationExample />
|
|
63
26
|
<% } %>
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
<% } else if (props.stylingPackage?.name === "
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
27
|
+
</ScreenContent>
|
|
28
|
+
<StatusBar style="auto" />
|
|
29
|
+
</ThemeProvider>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
<% } else if (props.stylingPackage?.name === "tamagui") {%>
|
|
33
|
+
export default function App() {
|
|
34
|
+
return (
|
|
35
|
+
<TamaguiProvider config={config}>
|
|
36
|
+
<ScreenContent title="Home" path="App.tsx">
|
|
73
37
|
<% if (props.internalizationPackage?.name === "i18next") { %>
|
|
74
38
|
<InternalizationExample />
|
|
75
39
|
<% } else { %>
|
|
76
|
-
|
|
40
|
+
<Text>Open up App.tsx to start working on your app!</Text>
|
|
77
41
|
<% } %>
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
<InternalizationExample />
|
|
89
|
-
<% } else { %>
|
|
90
|
-
<Text>Open up App.tsx to start working on your app!</Text>
|
|
91
|
-
<% } %>
|
|
92
|
-
<StatusBar style="auto" />
|
|
93
|
-
</View >
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const stylesheet = createStyleSheet({
|
|
98
|
-
container: {
|
|
99
|
-
flex: 1,
|
|
100
|
-
backgroundColor: '#fff',
|
|
101
|
-
alignItems: 'center',
|
|
102
|
-
justifyContent: 'center',
|
|
103
|
-
},
|
|
104
|
-
});
|
|
105
|
-
<% } else {%>
|
|
106
|
-
export default function App() {
|
|
107
|
-
return (
|
|
108
|
-
<View style={styles.container}>
|
|
42
|
+
</ScreenContent>
|
|
43
|
+
<StatusBar style="auto" />
|
|
44
|
+
</TamaguiProvider>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
<% } else { %>
|
|
48
|
+
export default function App() {
|
|
49
|
+
return (
|
|
50
|
+
<>
|
|
51
|
+
<ScreenContent title="Home" path="App.tsx">
|
|
109
52
|
<% if (props.internalizationPackage?.name === "i18next") { %>
|
|
110
53
|
<InternalizationExample />
|
|
111
|
-
<% } else { %>
|
|
112
|
-
<Text>Open up App.tsx to start working on your app!</Text>
|
|
113
54
|
<% } %>
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
55
|
+
</ScreenContent>
|
|
56
|
+
<StatusBar style="auto" />
|
|
57
|
+
</>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
<% } %>
|
|
118
61
|
|
|
119
|
-
const styles = StyleSheet.create({
|
|
120
|
-
container: {
|
|
121
|
-
flex: 1,
|
|
122
|
-
backgroundColor: '#fff',
|
|
123
|
-
alignItems: 'center',
|
|
124
|
-
justifyContent: 'center',
|
|
125
|
-
},
|
|
126
|
-
});
|
|
127
|
-
<% } %>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Feather } from '@expo/vector-icons';
|
|
2
|
+
import { Text, View, StyleSheet } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export const BackButton = ({ onPress }: { onPress: () => void }) => {
|
|
5
|
+
return (
|
|
6
|
+
<View style={styles.backButton}>
|
|
7
|
+
<Feather name="chevron-left" size={16} color="#007AFF" />
|
|
8
|
+
<Text style={styles.backButtonText} onPress={onPress}>
|
|
9
|
+
Back
|
|
10
|
+
</Text>
|
|
11
|
+
</View>
|
|
12
|
+
);
|
|
13
|
+
};
|
|
14
|
+
const styles = StyleSheet.create({
|
|
15
|
+
backButton: {
|
|
16
|
+
flexDirection: 'row',
|
|
17
|
+
paddingLeft: 20,
|
|
18
|
+
},
|
|
19
|
+
backButtonText: {
|
|
20
|
+
color: '#007AFF',
|
|
21
|
+
marginLeft: 4,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { forwardRef } from 'react';
|
|
2
|
+
import { StyleSheet, Text, TouchableOpacity, TouchableOpacityProps } from 'react-native';
|
|
3
|
+
|
|
4
|
+
type ButtonProps = {
|
|
5
|
+
onPress?: TouchableOpacityProps['onPress'];
|
|
6
|
+
title?: string;
|
|
7
|
+
} & TouchableOpacityProps;
|
|
8
|
+
|
|
9
|
+
export const Button = forwardRef<TouchableOpacity, ButtonProps>(({ onPress, title }, ref) => {
|
|
10
|
+
return (
|
|
11
|
+
<TouchableOpacity ref={ref} style={styles.button} onPress={onPress}>
|
|
12
|
+
<Text style={styles.buttonText}>{title}</Text>
|
|
13
|
+
</TouchableOpacity>
|
|
14
|
+
);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const styles = StyleSheet.create({
|
|
18
|
+
button: {
|
|
19
|
+
alignItems: 'center',
|
|
20
|
+
backgroundColor: '#6366F1',
|
|
21
|
+
borderRadius: 24,
|
|
22
|
+
elevation: 5,
|
|
23
|
+
flexDirection: 'row',
|
|
24
|
+
justifyContent: 'center',
|
|
25
|
+
padding: 16,
|
|
26
|
+
shadowColor: '#000',
|
|
27
|
+
shadowOffset: {
|
|
28
|
+
height: 2,
|
|
29
|
+
width: 0,
|
|
30
|
+
},
|
|
31
|
+
shadowOpacity: 0.25,
|
|
32
|
+
shadowRadius: 3.84,
|
|
33
|
+
},
|
|
34
|
+
buttonText: {
|
|
35
|
+
color: '#FFFFFF',
|
|
36
|
+
fontSize: 16,
|
|
37
|
+
fontWeight: '600',
|
|
38
|
+
textAlign: 'center',
|
|
39
|
+
},
|
|
40
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { StyleSheet, Text, View } from 'react-native';
|
|
2
|
+
|
|
3
|
+
<% if (props.internalizationPackage?.name === "i18next") { %>
|
|
4
|
+
import { useTranslation } from 'react-i18next';
|
|
5
|
+
<% } %>
|
|
6
|
+
|
|
7
|
+
export default function EditScreenInfo({ path }: { path: string }) {
|
|
8
|
+
<% if (props.internalizationPackage?.name === "i18next") { %>
|
|
9
|
+
const { t } = useTranslation();
|
|
10
|
+
const title = t('getStarted');
|
|
11
|
+
const description = t('changeCode')
|
|
12
|
+
<% } else { %>
|
|
13
|
+
const title = "Open up the code for this screen:"
|
|
14
|
+
const description = "Change any of the text, save the file, and your app will automatically update."
|
|
15
|
+
<% } %>
|
|
16
|
+
return (
|
|
17
|
+
<View style={styles.getStartedContainer}>
|
|
18
|
+
<Text style={styles.getStartedText}>{title}</Text>
|
|
19
|
+
<View style={[styles.codeHighlightContainer, styles.homeScreenFilename]}>
|
|
20
|
+
<Text>{path}</Text>
|
|
21
|
+
</View>
|
|
22
|
+
<Text style={styles.getStartedText}>{description}</Text>
|
|
23
|
+
</View>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const styles = StyleSheet.create({
|
|
28
|
+
codeHighlightContainer: {
|
|
29
|
+
borderRadius: 3,
|
|
30
|
+
paddingHorizontal: 4,
|
|
31
|
+
},
|
|
32
|
+
getStartedContainer: {
|
|
33
|
+
alignItems: 'center',
|
|
34
|
+
marginHorizontal: 50,
|
|
35
|
+
},
|
|
36
|
+
getStartedText: {
|
|
37
|
+
fontSize: 17,
|
|
38
|
+
lineHeight: 24,
|
|
39
|
+
textAlign: 'center',
|
|
40
|
+
},
|
|
41
|
+
helpContainer: {
|
|
42
|
+
alignItems: 'center',
|
|
43
|
+
marginHorizontal: 20,
|
|
44
|
+
marginTop: 15,
|
|
45
|
+
},
|
|
46
|
+
helpLink: {
|
|
47
|
+
paddingVertical: 15,
|
|
48
|
+
},
|
|
49
|
+
helpLinkText: {
|
|
50
|
+
textAlign: 'center',
|
|
51
|
+
},
|
|
52
|
+
homeScreenFilename: {
|
|
53
|
+
marginVertical: 7,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import FontAwesome from '@expo/vector-icons/FontAwesome';
|
|
2
|
+
import { Pressable, StyleSheet } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export const HeaderButton = ({ onPress }: { onPress?: () => void }) => {
|
|
5
|
+
return (
|
|
6
|
+
<Pressable onPress={onPress}>
|
|
7
|
+
{({ pressed }) => (
|
|
8
|
+
<FontAwesome
|
|
9
|
+
name="info-circle"
|
|
10
|
+
size={25}
|
|
11
|
+
color="gray"
|
|
12
|
+
style={[
|
|
13
|
+
styles.headerRight,
|
|
14
|
+
{
|
|
15
|
+
opacity: pressed ? 0.5 : 1,
|
|
16
|
+
},
|
|
17
|
+
]}
|
|
18
|
+
/>
|
|
19
|
+
)}
|
|
20
|
+
</Pressable>
|
|
21
|
+
);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const styles = StyleSheet.create({
|
|
25
|
+
headerRight: {
|
|
26
|
+
marginRight: 15,
|
|
27
|
+
},
|
|
28
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { StyleSheet, Text, View } from 'react-native';
|
|
2
|
+
|
|
3
|
+
import EditScreenInfo from './EditScreenInfo';
|
|
4
|
+
|
|
5
|
+
type ScreenContentProps = {
|
|
6
|
+
title: string;
|
|
7
|
+
path: string;
|
|
8
|
+
children?: React.ReactNode;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const ScreenContent = ({ title, path, children }: ScreenContentProps) => {
|
|
12
|
+
return (
|
|
13
|
+
<View style={styles.container}>
|
|
14
|
+
<Text style={styles.title}>{title}</Text>
|
|
15
|
+
<View style={styles.separator} />
|
|
16
|
+
<EditScreenInfo path={path} />
|
|
17
|
+
{children}
|
|
18
|
+
</View>
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const styles = StyleSheet.create({
|
|
23
|
+
container: {
|
|
24
|
+
alignItems: 'center',
|
|
25
|
+
flex: 1,
|
|
26
|
+
justifyContent: 'center',
|
|
27
|
+
},
|
|
28
|
+
separator: {
|
|
29
|
+
backgroundColor: '#d1d5db',
|
|
30
|
+
height: 1,
|
|
31
|
+
marginVertical: 30,
|
|
32
|
+
width: '80%',
|
|
33
|
+
},
|
|
34
|
+
title: {
|
|
35
|
+
fontSize: 20,
|
|
36
|
+
fontWeight: 'bold',
|
|
37
|
+
},
|
|
38
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import FontAwesome from '@expo/vector-icons/FontAwesome';
|
|
2
|
+
import { StyleSheet } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export const TabBarIcon = (props: {
|
|
5
|
+
name: React.ComponentProps<typeof FontAwesome>['name'];
|
|
6
|
+
color: string;
|
|
7
|
+
}) => {
|
|
8
|
+
return <FontAwesome size={28} style={styles.tabBarIcon} {...props} />;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const styles = StyleSheet.create({
|
|
12
|
+
tabBarIcon: {
|
|
13
|
+
marginBottom: -3,
|
|
14
|
+
},
|
|
15
|
+
});
|
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
import FontAwesome from '@expo/vector-icons/FontAwesome';
|
|
2
1
|
import { Tabs } from 'expo-router';
|
|
3
2
|
import { StyleSheet } from 'react-native';
|
|
3
|
+
import { TabBarIcon } from '~/components/TabBarIcon';
|
|
4
4
|
|
|
5
|
-
function TabBarIcon(props: {
|
|
6
|
-
name: React.ComponentProps<typeof FontAwesome>['name'];
|
|
7
|
-
color: string;
|
|
8
|
-
}) {
|
|
9
|
-
return <FontAwesome size={28} style={styles.tabBarIcon} {...props} />;
|
|
10
|
-
}
|
|
11
5
|
|
|
12
6
|
export default function TabLayout() {
|
|
13
7
|
return (
|
|
@@ -33,9 +27,3 @@ export default function TabLayout() {
|
|
|
33
27
|
</Tabs>
|
|
34
28
|
);
|
|
35
29
|
}
|
|
36
|
-
|
|
37
|
-
const styles = StyleSheet.create({
|
|
38
|
-
tabBarIcon: {
|
|
39
|
-
marginBottom: -3,
|
|
40
|
-
},
|
|
41
|
-
});
|