create-expo-stack 2.4.3 → 2.5.0-next.00da55e

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 (86) hide show
  1. package/README.md +213 -156
  2. package/build/commands/create-expo-stack.js +62 -56
  3. package/build/templates/base/App.tsx.ejs +51 -91
  4. package/build/templates/base/app.json.ejs +6 -0
  5. package/build/templates/base/components/BackButton.tsx.ejs +23 -0
  6. package/build/templates/base/components/Button.tsx.ejs +40 -0
  7. package/build/templates/base/components/EditScreenInfo.tsx.ejs +55 -0
  8. package/build/templates/base/components/HeaderButton.tsx.ejs +28 -0
  9. package/build/templates/base/components/ScreenContent.tsx.ejs +38 -0
  10. package/build/templates/base/components/TabBarIcon.tsx.ejs +15 -0
  11. package/build/templates/base/package.json.ejs +17 -7
  12. package/build/templates/base/prettier.config.js.ejs +11 -0
  13. package/build/templates/packages/expo-router/drawer/app/(drawer)/(tabs)/_layout.tsx.ejs +1 -13
  14. package/build/templates/packages/expo-router/drawer/app/(drawer)/(tabs)/index.tsx.ejs +18 -84
  15. package/build/templates/packages/expo-router/drawer/app/(drawer)/(tabs)/two.tsx.ejs +18 -84
  16. package/build/templates/packages/expo-router/drawer/app/(drawer)/_layout.tsx.ejs +4 -18
  17. package/build/templates/packages/expo-router/drawer/app/(drawer)/index.tsx.ejs +12 -80
  18. package/build/templates/packages/expo-router/drawer/app/_layout.tsx.ejs +4 -0
  19. package/build/templates/packages/expo-router/drawer/app/modal.tsx.ejs +16 -92
  20. package/build/templates/packages/expo-router/stack/app/_layout.tsx.ejs +3 -0
  21. package/build/templates/packages/expo-router/stack/app/details.tsx.ejs +17 -171
  22. package/build/templates/packages/expo-router/stack/app/index.tsx.ejs +23 -187
  23. package/build/templates/packages/expo-router/tabs/app/(tabs)/_layout.tsx.ejs +6 -50
  24. package/build/templates/packages/expo-router/tabs/app/(tabs)/index.tsx.ejs +18 -84
  25. package/build/templates/packages/expo-router/tabs/app/(tabs)/two.tsx.ejs +18 -83
  26. package/build/templates/packages/expo-router/tabs/app/_layout.tsx.ejs +3 -0
  27. package/build/templates/packages/expo-router/tabs/app/modal.tsx.ejs +17 -92
  28. package/build/templates/packages/i18next/components/InternalizationExample.tsx.ejs +23 -0
  29. package/build/templates/packages/i18next/core/i18n/fallbackChecker.ts.ejs +13 -0
  30. package/build/templates/packages/i18next/core/i18n/init.ts.ejs +24 -0
  31. package/build/templates/packages/i18next/core/i18n/languageDetector.ts.ejs +13 -0
  32. package/build/templates/packages/i18next/translation/en.json.ejs +8 -0
  33. package/build/templates/packages/i18next/translation/fr.json.ejs +8 -0
  34. package/build/templates/packages/i18next/translation/index.ts.ejs +20 -0
  35. package/build/templates/packages/nativewind/components/BackButton.tsx.ejs +18 -0
  36. package/build/templates/packages/nativewind/components/Button.tsx.ejs +14 -0
  37. package/build/templates/packages/nativewind/components/EditScreenInfo.tsx.ejs +40 -0
  38. package/build/templates/packages/nativewind/components/ScreenContent.tsx.ejs +25 -0
  39. package/build/templates/packages/react-navigation/App.tsx.ejs +4 -1
  40. package/build/templates/packages/react-navigation/navigation/drawer-navigator.tsx.ejs +14 -26
  41. package/build/templates/packages/react-navigation/navigation/index.tsx.ejs +2 -101
  42. package/build/templates/packages/react-navigation/navigation/tab-navigator.tsx.ejs +8 -62
  43. package/build/templates/packages/react-navigation/screens/details.tsx.ejs +22 -108
  44. package/build/templates/packages/react-navigation/screens/home.tsx.ejs +3 -82
  45. package/build/templates/packages/react-navigation/screens/modal.tsx.ejs +16 -104
  46. package/build/templates/packages/react-navigation/screens/one.tsx.ejs +2 -97
  47. package/build/templates/packages/react-navigation/screens/overview.tsx.ejs +37 -182
  48. package/build/templates/packages/react-navigation/screens/two.tsx.ejs +3 -98
  49. package/build/templates/packages/restyle/components/BackButton.tsx.ejs +15 -0
  50. package/build/templates/packages/restyle/components/Button.tsx.ejs +32 -0
  51. package/build/templates/packages/restyle/components/EditScreenInfo.tsx.ejs +29 -0
  52. package/build/templates/packages/restyle/components/ScreenContent.tsx.ejs +20 -0
  53. package/build/templates/packages/tamagui/components/BackButton.tsx.ejs +19 -0
  54. package/build/templates/packages/tamagui/components/Button.tsx.ejs +9 -0
  55. package/build/templates/packages/tamagui/components/EditScreenInfo.tsx.ejs +29 -0
  56. package/build/templates/packages/tamagui/components/ScreenContent.tsx.ejs +22 -0
  57. package/build/templates/packages/unistyles/components/BackButton.tsx.ejs +26 -0
  58. package/build/templates/packages/unistyles/components/Button.tsx.ejs +12 -0
  59. package/build/templates/packages/unistyles/components/EditScreenInfo.tsx.ejs +61 -0
  60. package/build/templates/packages/unistyles/components/ScreenContent.tsx.ejs +24 -0
  61. package/build/templates/packages/unistyles/theme.ts.ejs +30 -46
  62. package/build/types/types.d.ts +3 -2
  63. package/build/types/utilities/configureProjectFiles.d.ts +1 -1
  64. package/build/types/utilities/generateProjectFiles.d.ts +1 -1
  65. package/build/types/utilities/getPackageManager.d.ts +1 -0
  66. package/build/types/utilities/validateProjectName.d.ts +1 -1
  67. package/build/types.js +3 -2
  68. package/build/utilities/configureProjectFiles.js +86 -19
  69. package/build/utilities/generateProjectFiles.js +8 -4
  70. package/build/utilities/getPackageManager.js +9 -2
  71. package/build/utilities/printOutput.js +4 -2
  72. package/build/utilities/renderTitle.js +8 -1
  73. package/build/utilities/runCLI.js +124 -34
  74. package/build/utilities/showHelp.js +4 -1
  75. package/build/utilities/validateProjectName.js +14 -8
  76. package/package.json +66 -66
  77. package/build/templates/base/.prettierrc +0 -7
  78. package/build/templates/packages/expo-router/drawer/components/edit-screen-info.tsx.ejs +0 -153
  79. package/build/templates/packages/expo-router/index.js +0 -4
  80. package/build/templates/packages/expo-router/index.ts +0 -1
  81. package/build/templates/packages/expo-router/tabs/components/edit-screen-info.tsx.ejs +0 -153
  82. package/build/templates/packages/react-navigation/components/edit-screen-info.tsx.ejs +0 -180
  83. package/build/types/templates/packages/expo-router/index.d.ts +0 -1
  84. /package/build/templates/packages/expo-router/drawer/app/{[...unmatched].tsx.ejs → +not-found.tsx.ejs} +0 -0
  85. /package/build/templates/packages/expo-router/stack/app/{[...unmatched].tsx.ejs → +not-found.tsx.ejs} +0 -0
  86. /package/build/templates/packages/expo-router/tabs/app/{[...unmatched].tsx.ejs → +not-found.tsx.ejs} +0 -0
@@ -46,11 +46,13 @@ var types_1 = require("../types");
46
46
  var clearStylingPackages_1 = __importDefault(require("../utilities/clearStylingPackages"));
47
47
  var validateProjectName_1 = require("../utilities/validateProjectName");
48
48
  var navigationValidationError = "You must pass in either --react-navigation or --expo-router if you want to use the --tabs or --drawer+tabs options";
49
+ var projectNameValidationError = "A project with the name";
50
+ var bunInstallationError = 'User cancelled to install recommended version of Bun.';
49
51
  var command = {
50
52
  name: 'create-expo-stack',
51
53
  description: 'Create a new Expo project',
52
54
  run: function (toolbox) { return __awaiter(void 0, void 0, void 0, function () {
53
- var _a, exists, removeAsync, _b, first, options, _c, error, info, highlight, success, warning, prompt, printSomethingWentWrong, useDefault, skipCLI, useBlankTypescript, optionsPassedIn, cliResults, askName, name, pathSegments, err_1, generateRerunScript, packageManager, packages, authenticationPackage, navigationPackage, stylingPackage, files, formattedFiles, err_2;
55
+ var _a, exists, removeAsync, _b, first, options, _c, error, info, highlight, success, warning, prompt, printSomethingWentWrong, useDefault, skipCLI, useBlankTypescript, optionsPassedIn, cliResults, askName, name, pathSegments, err_1, generateRerunScript, packageManager, packages, authenticationPackage, navigationPackage, stylingPackage, internalizationPackage, files, formattedFiles, err_2;
54
56
  return __generator(this, function (_d) {
55
57
  switch (_d.label) {
56
58
  case 0:
@@ -69,9 +71,10 @@ var command = {
69
71
  useBlankTypescript = options.blank || false;
70
72
  optionsPassedIn = types_1.availablePackages.some(function (condition) { return options[condition] !== undefined; });
71
73
  cliResults = constants_1.defaultOptions;
74
+ cliResults.flags.packageManager = (0, utilities_1.getPackageManager)(toolbox, cliResults);
72
75
  _d.label = 1;
73
76
  case 1:
74
- _d.trys.push([1, 10, , 11]);
77
+ _d.trys.push([1, 7, , 9]);
75
78
  // Validation: check if the user passed in the tabs/drawer option without passing in either expo router or react navigation. If so, throw an error
76
79
  if ((options.tabs || options['drawer+tabs']) &&
77
80
  !options.reactNavigation &&
@@ -86,41 +89,36 @@ var command = {
86
89
  return [4 /*yield*/, (0, utilities_1.renderTitle)(toolbox)];
87
90
  case 2:
88
91
  _d.sent();
89
- // TODO: this is hacky, figure out a way to do this better
90
- // set timeout for 1 second so that the title can render before the CLI runs
91
- return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 200); })];
92
- case 3:
93
- // TODO: this is hacky, figure out a way to do this better
94
- // set timeout for 1 second so that the title can render before the CLI runs
95
- _d.sent();
96
- if (!(!first && (options.ignite || !(useDefault || optionsPassedIn || skipCLI || useBlankTypescript)))) return [3 /*break*/, 5];
92
+ if (!(!first && (options.ignite || !(useDefault || optionsPassedIn || skipCLI || useBlankTypescript)))) return [3 /*break*/, 4];
97
93
  askName = {
98
94
  type: 'input',
99
95
  name: 'name',
100
96
  message: "What do you want to name your project? (".concat(constants_1.DEFAULT_APP_NAME, ")")
101
97
  };
102
98
  return [4 /*yield*/, prompt.ask(askName)];
103
- case 4:
99
+ case 3:
104
100
  name = (_d.sent()).name;
105
101
  // if name is undefined or empty string, use default name
106
102
  cliResults.projectName = name || constants_1.DEFAULT_APP_NAME;
107
- return [3 /*break*/, 6];
108
- case 5:
103
+ return [3 /*break*/, 5];
104
+ case 4:
109
105
  // Destructure the results but set the projectName if the first param is passed in
110
106
  cliResults.projectName = first || constants_1.DEFAULT_APP_NAME;
111
107
  pathSegments = cliResults.projectName.split('/');
112
108
  cliResults.projectName = pathSegments.pop(); // get last segment as the project name
113
- _d.label = 6;
109
+ _d.label = 5;
110
+ case 5:
111
+ // Validate the provided project name; check if the directory already exists
112
+ // - We may or may not be interactive, so conditionally pass in prompt.
113
+ // - Ignore validation if the overwrite option is passed in.
114
+ if (options.overwrite) {
115
+ cliResults.flags.overwrite = true;
116
+ }
117
+ return [4 /*yield*/, (0, validateProjectName_1.validateProjectName)(exists, removeAsync, !(useDefault || optionsPassedIn || skipCLI || useBlankTypescript) ? prompt : null, cliResults.projectName, success, cliResults.flags.overwrite)];
114
118
  case 6:
115
- if (!options.overwrite) return [3 /*break*/, 7];
116
- cliResults.flags.overwrite = true;
117
- return [3 /*break*/, 9];
118
- case 7: return [4 /*yield*/, (0, validateProjectName_1.validateProjectName)(exists, removeAsync, !(useDefault || optionsPassedIn || skipCLI || useBlankTypescript) ? prompt : null, cliResults.projectName)];
119
- case 8:
120
119
  _d.sent();
121
- _d.label = 9;
122
- case 9: return [3 /*break*/, 11];
123
- case 10:
120
+ return [3 /*break*/, 9];
121
+ case 7:
124
122
  err_1 = _d.sent();
125
123
  if (err_1 === '') {
126
124
  // user cancelled/exited the interactive CLI
@@ -130,31 +128,28 @@ var command = {
130
128
  // user tried passing in tabs/drawer option without passing in either expo router or react navigation
131
129
  return [2 /*return*/, void error("\n".concat(navigationValidationError, "\n"))];
132
130
  }
133
- // TODO: delete all files with projectName
134
- // await removeAsync(cliResults.projectName);
131
+ if (err_1.message.includes(projectNameValidationError)) {
132
+ return [2 /*return*/, void success("\nCancelled... \uD83D\uDC4B \n")];
133
+ }
134
+ // Delete all files with projectName
135
+ return [4 /*yield*/, removeAsync(cliResults.projectName)];
136
+ case 8:
137
+ // Delete all files with projectName
138
+ _d.sent();
135
139
  printSomethingWentWrong();
136
140
  throw err_1;
137
- case 11:
138
- _d.trys.push([11, 18, , 19]);
139
- if (!options.ignite) return [3 /*break*/, 13];
141
+ case 9:
142
+ _d.trys.push([9, 16, , 18]);
143
+ if (!options.ignite) return [3 /*break*/, 11];
140
144
  return [4 /*yield*/, (0, utilities_1.runIgnite)(toolbox, cliResults.projectName, cliResults)];
141
- case 12:
145
+ case 10:
142
146
  _d.sent();
143
- return [3 /*break*/, 17];
144
- case 13:
147
+ return [3 /*break*/, 15];
148
+ case 11:
145
149
  // Check if the user wants to not install dependencies and/or not initialize git, update cliResults accordingly
146
150
  cliResults.flags.noInstall =
147
151
  options.noInstall || (typeof options.install === 'boolean' && !options.install) || false;
148
152
  cliResults.flags.noGit = options.noGit || (typeof options.git === 'boolean' && !options.git) || false;
149
- cliResults.flags.packageManager = options.bun
150
- ? 'bun'
151
- : options.pnpm
152
- ? 'pnpm'
153
- : options.npm
154
- ? 'npm'
155
- : options.yarn
156
- ? 'yarn'
157
- : undefined;
158
153
  // Validate import alias string forward slash and asterisk
159
154
  if (typeof options.importAlias === 'string') {
160
155
  if (!options.importAlias.endsWith('/*')) {
@@ -162,16 +157,13 @@ var command = {
162
157
  }
163
158
  }
164
159
  cliResults.flags.importAlias = options.importAlias !== false && options['import-alias'] !== false;
165
- if (!!(useDefault || optionsPassedIn || skipCLI || useBlankTypescript)) return [3 /*break*/, 15];
160
+ if (!!(useDefault || optionsPassedIn || skipCLI || useBlankTypescript)) return [3 /*break*/, 13];
166
161
  return [4 /*yield*/, (0, utilities_1.runCLI)(toolbox, cliResults.projectName)];
167
- case 14:
162
+ case 12:
168
163
  // Run the CLI to prompt the user for input
169
164
  cliResults = _d.sent();
170
- _d.label = 15;
171
- case 15:
172
- if (!cliResults.flags.packageManager) {
173
- cliResults.flags.packageManager = 'npm';
174
- }
165
+ _d.label = 13;
166
+ case 13:
175
167
  // Update the cliResults with the options passed in via the command
176
168
  // Navigation packages
177
169
  if (options.reactNavigation || options['react-navigation'] || options.reactnavigation) {
@@ -263,6 +255,13 @@ var command = {
263
255
  type: 'authentication'
264
256
  });
265
257
  }
258
+ // Internalization packages
259
+ if (options.i18next) {
260
+ cliResults.packages.push({
261
+ name: 'i18next',
262
+ type: 'internationalization'
263
+ });
264
+ }
266
265
  // By this point, all cliResults should be set
267
266
  info('');
268
267
  highlight('Your project configuration:');
@@ -309,29 +308,36 @@ var command = {
309
308
  authenticationPackage = packages.find(function (p) { return p.type === 'authentication'; }) || undefined;
310
309
  navigationPackage = packages.find(function (p) { return p.type === 'navigation'; }) || undefined;
311
310
  stylingPackage = packages.find(function (p) { return p.type === 'styling'; });
311
+ internalizationPackage = packages.find(function (p) { return p.type === 'internationalization'; });
312
312
  files = [];
313
- files = (0, utilities_1.configureProjectFiles)(authenticationPackage, files, navigationPackage, stylingPackage, toolbox, cliResults);
313
+ files = (0, utilities_1.configureProjectFiles)(authenticationPackage, files, navigationPackage, stylingPackage, toolbox, cliResults, internalizationPackage);
314
314
  formattedFiles = [];
315
- formattedFiles = (0, utilities_1.generateProjectFiles)(authenticationPackage, cliResults, files, formattedFiles, navigationPackage, packageManager, stylingPackage, toolbox);
315
+ formattedFiles = (0, utilities_1.generateProjectFiles)(authenticationPackage, cliResults, files, formattedFiles, navigationPackage, packageManager, stylingPackage, toolbox, internalizationPackage);
316
316
  return [4 /*yield*/, (0, utilities_1.printOutput)(cliResults, formattedFiles, toolbox, stylingPackage)];
317
- case 16:
317
+ case 14:
318
318
  _d.sent();
319
- _d.label = 17;
320
- case 17: return [3 /*break*/, 19];
321
- case 18:
319
+ _d.label = 15;
320
+ case 15: return [3 /*break*/, 18];
321
+ case 16:
322
322
  err_2 = _d.sent();
323
323
  if (err_2 === '') {
324
324
  // user cancelled/exited the interactive CLI
325
325
  return [2 /*return*/, void success("\nCancelled... \uD83D\uDC4B \n")];
326
326
  }
327
- // TODO: delete all files with projectName
328
- // await removeAsync(cliResults.projectName);
327
+ if (err_2.message.includes(bunInstallationError)) {
328
+ return [2 /*return*/, void success("\nUser cancelled to install recommended version of Bun... \uD83D\uDC4B \n")];
329
+ }
330
+ // Delete all files with projectName
331
+ return [4 /*yield*/, removeAsync(cliResults.projectName)];
332
+ case 17:
333
+ // Delete all files with projectName
334
+ _d.sent();
329
335
  printSomethingWentWrong();
330
336
  throw err_2;
331
- case 19: return [2 /*return*/];
337
+ case 18: return [2 /*return*/];
332
338
  }
333
339
  });
334
340
  }); }
335
341
  };
336
342
  exports.default = command;
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWV4cG8tc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvY3JlYXRlLWV4cG8tc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFN0IsMENBU3NCO0FBQ3RCLDBDQUFnRTtBQUNoRSxrQ0FBeUQ7QUFDekQsMkZBQXFFO0FBQ3JFLHdFQUF1RTtBQUV2RSxJQUFNLHlCQUF5QixHQUFHLG9IQUFvSCxDQUFDO0FBRXZKLElBQU0sT0FBTyxHQUFtQjtJQUM5QixJQUFJLEVBQUUsbUJBQW1CO0lBQ3pCLFdBQVcsRUFBRSwyQkFBMkI7SUFDeEMsR0FBRyxFQUFFLFVBQU8sT0FBTzs7Ozs7b0JBRWYsS0FJRSxPQUFPLFdBSjBCLEVBQXJCLE1BQU0sWUFBQSxFQUFFLFdBQVcsaUJBQUEsRUFDakMsS0FHRSxPQUFPLFdBSHFCLEVBQWhCLEtBQUssV0FBQSxFQUFFLE9BQU8sYUFBQSxFQUM1QixLQUVFLE9BQU8sTUFGMEMsRUFBMUMsS0FBSyxXQUFBLEVBQUUsSUFBSSxVQUFBLEVBQUUsU0FBUyxlQUFBLEVBQUUsT0FBTyxhQUFBLEVBQUUsT0FBTyxhQUFBLEVBQ2pELE1BQU0sR0FDSixPQUFPLE9BREgsQ0FDSTtvQkFFTix1QkFBdUIsR0FBRzt3QkFDOUIsSUFBSSxDQUFDLHVFQUE2RCxDQUFDLENBQUM7d0JBQ3BFLElBQUksQ0FDRiwySEFBMkgsQ0FDNUgsQ0FBQzt3QkFDRixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ1gsQ0FBQyxDQUFDO29CQUNGLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQzlCLElBQUEsb0JBQVEsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dCQUVuQyxzQkFBTztvQkFDVCxDQUFDO29CQUdLLFVBQVUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7b0JBQ2pDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDO29CQUU1QyxlQUFlLEdBQUcseUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQUMsU0FBUyxJQUFLLE9BQUEsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsRUFBaEMsQ0FBZ0MsQ0FBQyxDQUFDO29CQUc1RixVQUFVLEdBQWUsMEJBQWMsQ0FBQzs7OztvQkFHMUMsa0pBQWtKO29CQUNsSixJQUNFLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ3hDLENBQUMsT0FBTyxDQUFDLGVBQWU7d0JBQ3hCLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO3dCQUM1QixDQUFDLE9BQU8sQ0FBQyxlQUFlO3dCQUN4QixDQUFDLE9BQU8sQ0FBQyxVQUFVO3dCQUNuQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7d0JBQ3ZCLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFDbkIsQ0FBQzt3QkFDRCx1Q0FBdUM7d0JBQ3ZDLE1BQU0seUJBQXlCLENBQUM7b0JBQ2xDLENBQUM7b0JBRUQscUJBQU0sSUFBQSx1QkFBVyxFQUFDLE9BQU8sQ0FBQyxFQUFBOztvQkFBMUIsU0FBMEIsQ0FBQztvQkFFM0IsMERBQTBEO29CQUMxRCw0RUFBNEU7b0JBQzVFLHFCQUFNLElBQUksT0FBTyxDQUFDLFVBQUMsT0FBTyxJQUFLLE9BQUEsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBeEIsQ0FBd0IsQ0FBQyxFQUFBOztvQkFGeEQsMERBQTBEO29CQUMxRCw0RUFBNEU7b0JBQzVFLFNBQXdELENBQUM7eUJBQ3JELENBQUEsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksZUFBZSxJQUFJLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUEsRUFBL0Ysd0JBQStGO29CQUMzRixPQUFPLEdBQUc7d0JBQ2QsSUFBSSxFQUFFLE9BQU87d0JBQ2IsSUFBSSxFQUFFLE1BQU07d0JBQ1osT0FBTyxFQUFFLGtEQUEyQyw0QkFBZ0IsTUFBRztxQkFDeEUsQ0FBQztvQkFDZSxxQkFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFBOztvQkFBbEMsSUFBSSxHQUFLLENBQUEsU0FBeUIsQ0FBQSxLQUE5QjtvQkFDWix5REFBeUQ7b0JBQ3pELFVBQVUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLDRCQUFnQixDQUFDOzs7b0JBRWxELGtGQUFrRjtvQkFDbEYsVUFBVSxDQUFDLFdBQVcsR0FBRyxLQUFLLElBQUksNEJBQWdCLENBQUM7b0JBQzdDLFlBQVksR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDdkQsVUFBVSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyx1Q0FBdUM7Ozt5QkFNbEYsT0FBTyxDQUFDLFNBQVMsRUFBakIsd0JBQWlCO29CQUNuQixVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7O3dCQUVsQyxxQkFBTSxJQUFBLHlDQUFtQixFQUN2QixNQUFNLEVBQ04sV0FBVyxFQUNYLENBQUMsQ0FBQyxVQUFVLElBQUksZUFBZSxJQUFJLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFDakYsVUFBVSxDQUFDLFdBQVcsQ0FDdkIsRUFBQTs7b0JBTEQsU0FLQyxDQUFDOzs7OztvQkFHSixJQUFJLEtBQUcsS0FBSyxFQUFFLEVBQUUsQ0FBQzt3QkFDZiw0Q0FBNEM7d0JBQzVDLHNCQUFPLEtBQUssT0FBTyxDQUFDLGdDQUFzQixDQUFDLEVBQUM7b0JBQzlDLENBQUM7b0JBQ0QsSUFBSSxLQUFHLEtBQUsseUJBQXlCLEVBQUUsQ0FBQzt3QkFDdEMscUdBQXFHO3dCQUNyRyxzQkFBTyxLQUFLLEtBQUssQ0FBQyxZQUFLLHlCQUF5QixPQUFJLENBQUMsRUFBQztvQkFDeEQsQ0FBQztvQkFFRCwwQ0FBMEM7b0JBQzFDLDZDQUE2QztvQkFFN0MsdUJBQXVCLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxLQUFHLENBQUM7Ozt5QkFNTixPQUFPLENBQUMsTUFBTSxFQUFkLHlCQUFjO29CQUNoQixxQkFBTSxJQUFBLHFCQUFTLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLEVBQUE7O29CQUE1RCxTQUE0RCxDQUFDOzs7b0JBRTdELCtHQUErRztvQkFDL0csVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTO3dCQUN4QixPQUFPLENBQUMsU0FBUyxJQUFJLENBQUMsT0FBTyxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUM7b0JBQzNGLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQztvQkFDdEcsVUFBVSxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLEdBQUc7d0JBQzNDLENBQUMsQ0FBQyxLQUFLO3dCQUNQLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSTs0QkFDWixDQUFDLENBQUMsTUFBTTs0QkFDUixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUc7Z0NBQ1gsQ0FBQyxDQUFDLEtBQUs7Z0NBQ1AsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJO29DQUNaLENBQUMsQ0FBQyxNQUFNO29DQUNSLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBRXBCLDBEQUEwRDtvQkFDMUQsSUFBSSxPQUFPLE9BQU8sQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDOzRCQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7d0JBQy9FLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxLQUFLLEtBQUssSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssS0FBSyxDQUFDO3lCQUU5RixDQUFDLENBQUMsVUFBVSxJQUFJLGVBQWUsSUFBSSxPQUFPLElBQUksa0JBQWtCLENBQUMsRUFBakUseUJBQWlFO29CQUV0RCxxQkFBTSxJQUFBLGtCQUFNLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBQTs7b0JBRDFELDRDQUE0QztvQkFDNUMsVUFBVSxHQUFHLFNBQTZDLENBQUM7OztvQkFHN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7d0JBQ3JDLFVBQVUsQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztvQkFDMUMsQ0FBQztvQkFFRCxtRUFBbUU7b0JBQ25FLHNCQUFzQjtvQkFDdEIsSUFBSSxPQUFPLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQzt3QkFDdEYsK0JBQStCO3dCQUMvQixVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs0QkFDdkIsSUFBSSxFQUFFLGtCQUFrQjs0QkFDeEIsSUFBSSxFQUFFLFlBQVk7NEJBQ2xCLE9BQU8sRUFBRTtnQ0FDUCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsT0FBTzs2QkFDakY7eUJBQ0YsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7d0JBQ3ZFLDBCQUEwQjt3QkFDMUIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7NEJBQ3ZCLElBQUksRUFBRSxhQUFhOzRCQUNuQixJQUFJLEVBQUUsWUFBWTs0QkFDbEIsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPOzZCQUNqRjt5QkFDRixDQUFDLENBQUM7b0JBQ0wsQ0FBQztvQkFFRCxtQkFBbUI7b0JBQ25CLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO3dCQUN2Qix3RUFBd0U7d0JBQ3hFLFVBQVUsR0FBRyxJQUFBLDhCQUFvQixFQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUM5Qyx5QkFBeUI7d0JBQ3pCLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDOzRCQUN2QixJQUFJLEVBQUUsWUFBWTs0QkFDbEIsSUFBSSxFQUFFLFNBQVM7eUJBQ2hCLENBQUMsQ0FBQztvQkFDTCxDQUFDO3lCQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUMzQixVQUFVLEdBQUcsSUFBQSw4QkFBb0IsRUFBQyxVQUFVLENBQUMsQ0FBQzt3QkFDOUMsc0JBQXNCO3dCQUN0QixVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs0QkFDdkIsSUFBSSxFQUFFLFNBQVM7NEJBQ2YsSUFBSSxFQUFFLFNBQVM7eUJBQ2hCLENBQUMsQ0FBQztvQkFDTCxDQUFDO3lCQUFNLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUM3QixVQUFVLEdBQUcsSUFBQSw4QkFBb0IsRUFBQyxVQUFVLENBQUMsQ0FBQzt3QkFDOUMsd0JBQXdCO3dCQUN4QixVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs0QkFDdkIsSUFBSSxFQUFFLFdBQVc7NEJBQ2pCLElBQUksRUFBRSxTQUFTO3lCQUNoQixDQUFDLENBQUM7b0JBQ0wsQ0FBQzt5QkFBTSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDOUIsVUFBVSxHQUFHLElBQUEsOEJBQW9CLEVBQUMsVUFBVSxDQUFDLENBQUM7d0JBQzlDLHlCQUF5Qjt3QkFDekIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7NEJBQ3ZCLElBQUksRUFBRSxZQUFZOzRCQUNsQixJQUFJLEVBQUUsU0FBUzt5QkFDaEIsQ0FBQyxDQUFDO29CQUNMLENBQUM7eUJBQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQzNCLElBQUksQ0FBQzs0QkFDSCxVQUFVLEdBQUcsSUFBQSw4QkFBb0IsRUFBQyxVQUFVLENBQUMsQ0FBQzs0QkFDOUMseUJBQXlCOzRCQUN6QixVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQ0FDdkIsSUFBSSxFQUFFLFNBQVM7Z0NBQ2YsSUFBSSxFQUFFLFNBQVM7NkJBQ2hCLENBQUMsQ0FBQzt3QkFDTCxDQUFDO3dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7NEJBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssT0FBQSxFQUFFLENBQUMsQ0FBQzt3QkFDekIsQ0FBQztvQkFDSCxDQUFDO29CQUNELCtDQUErQzt5QkFDMUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFwQixDQUFvQixDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQzdFLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDOzRCQUN2QixJQUFJLEVBQUUsWUFBWTs0QkFDbEIsSUFBSSxFQUFFLFNBQVM7eUJBQ2hCLENBQUMsQ0FBQztvQkFDTCxDQUFDO29CQUVELDBCQUEwQjtvQkFDMUIsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3JCLHVCQUF1Qjt3QkFDdkIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7NEJBQ3ZCLElBQUksRUFBRSxVQUFVOzRCQUNoQixJQUFJLEVBQUUsZ0JBQWdCO3lCQUN2QixDQUFDLENBQUM7b0JBQ0wsQ0FBQztvQkFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDckIsdUJBQXVCO3dCQUN2QixVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs0QkFDdkIsSUFBSSxFQUFFLFVBQVU7NEJBQ2hCLElBQUksRUFBRSxnQkFBZ0I7eUJBQ3ZCLENBQUMsQ0FBQztvQkFDTCxDQUFDO29CQUVELDhDQUE4QztvQkFDOUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNULFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO29CQUN6QyxJQUFJLENBQUMsVUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFFLENBQUMsQ0FBQztvQkFFM0UsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNULFNBQVMsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO29CQUd0QyxtQkFBbUIsR0FBRyxVQUFDLFVBQXNCO3dCQUNqRCxJQUFJLE1BQU0sR0FBRyxnQ0FBeUIsVUFBVSxDQUFDLFdBQVcsTUFBRyxDQUFDO3dCQUVoRSxtQkFBbUI7d0JBQ25CLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUMsQ0FBQzs7NEJBQzVCLE1BQU0sSUFBSSxZQUFLLENBQUMsQ0FBQyxJQUFJLE1BQUcsQ0FBQzs0QkFDekIscUVBQXFFOzRCQUNyRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7Z0NBQzVCLElBQUksQ0FBQSxNQUFBLENBQUMsQ0FBQyxPQUFPLDBDQUFFLElBQUksTUFBSyxNQUFNLEVBQUUsQ0FBQztvQ0FDL0IsTUFBTSxJQUFJLFNBQVMsQ0FBQztnQ0FDdEIsQ0FBQztxQ0FBTSxJQUFJLENBQUEsTUFBQSxDQUFDLENBQUMsT0FBTywwQ0FBRSxJQUFJLE1BQUssZUFBZSxFQUFFLENBQUM7b0NBQy9DLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQztnQ0FDN0IsQ0FBQzs0QkFDSCxDQUFDO3dCQUNILENBQUMsQ0FBQyxDQUFDO3dCQUVILHNEQUFzRDt3QkFDdEQsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUMvQixNQUFNLElBQUksZUFBZSxDQUFDO3dCQUM1QixDQUFDO3dCQUVELG1EQUFtRDt3QkFDbkQsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDOzRCQUMzQixNQUFNLElBQUksV0FBVyxDQUFDO3dCQUN4QixDQUFDO3dCQUVELDZEQUE2RDt3QkFDN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7NEJBQ2xDLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQzt3QkFDakMsQ0FBQzt3QkFFRCwwQkFBMEI7d0JBQzFCLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxjQUFjLEtBQUssS0FBSyxFQUFFLENBQUM7NEJBQzlDLE1BQU0sSUFBSSxZQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFFLENBQUM7d0JBQ25ELENBQUM7d0JBRUQsT0FBTyxNQUFNLENBQUM7b0JBQ2hCLENBQUMsQ0FBQztvQkFFSSxjQUFjLEdBQUcsSUFBQSw2QkFBaUIsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQzlELE9BQU8sQ0FBQyxZQUFLLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFFLENBQUMsQ0FBQztvQkFFeEMsUUFBUSxHQUFLLFVBQVUsU0FBZixDQUFnQjtvQkFHMUIscUJBQXFCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLEVBQTNCLENBQTJCLENBQUMsSUFBSSxTQUFTLENBQUM7b0JBQ3ZGLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBdkIsQ0FBdUIsQ0FBQyxJQUFJLFNBQVMsQ0FBQztvQkFFL0UsY0FBYyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBcEIsQ0FBb0IsQ0FBQyxDQUFDO29CQUU5RCxLQUFLLEdBQWEsRUFBRSxDQUFDO29CQUV6QixLQUFLLEdBQUcsSUFBQSxpQ0FBcUIsRUFDM0IscUJBQXFCLEVBQ3JCLEtBQUssRUFDTCxpQkFBaUIsRUFDakIsY0FBYyxFQUNkLE9BQU8sRUFDUCxVQUFVLENBQ1gsQ0FBQztvQkFHRSxjQUFjLEdBQVUsRUFBRSxDQUFDO29CQUUvQixjQUFjLEdBQUcsSUFBQSxnQ0FBb0IsRUFDbkMscUJBQXFCLEVBQ3JCLFVBQVUsRUFDVixLQUFLLEVBQ0wsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsY0FBYyxFQUNkLE9BQU8sQ0FDUixDQUFDO29CQUVGLHFCQUFNLElBQUEsdUJBQVcsRUFBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsRUFBQTs7b0JBQXRFLFNBQXNFLENBQUM7Ozs7O29CQUd6RSxJQUFJLEtBQUcsS0FBSyxFQUFFLEVBQUUsQ0FBQzt3QkFDZiw0Q0FBNEM7d0JBQzVDLHNCQUFPLEtBQUssT0FBTyxDQUFDLGdDQUFzQixDQUFDLEVBQUM7b0JBQzlDLENBQUM7b0JBRUQsMENBQTBDO29CQUMxQyw2Q0FBNkM7b0JBRTdDLHVCQUF1QixFQUFFLENBQUM7b0JBQzFCLE1BQU0sS0FBRyxDQUFDOzs7O1NBRWI7Q0FDRixDQUFDO0FBRUYsa0JBQWUsT0FBTyxDQUFDIn0=
343
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWV4cG8tc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvY3JlYXRlLWV4cG8tc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFN0IsMENBU3NCO0FBQ3RCLDBDQUFnRTtBQUNoRSxrQ0FBeUQ7QUFDekQsMkZBQXFFO0FBQ3JFLHdFQUF1RTtBQUV2RSxJQUFNLHlCQUF5QixHQUFHLG9IQUFvSCxDQUFDO0FBQ3ZKLElBQU0sMEJBQTBCLEdBQUcseUJBQXlCLENBQUM7QUFDN0QsSUFBTSxvQkFBb0IsR0FBRyx1REFBdUQsQ0FBQztBQUVyRixJQUFNLE9BQU8sR0FBbUI7SUFDOUIsSUFBSSxFQUFFLG1CQUFtQjtJQUN6QixXQUFXLEVBQUUsMkJBQTJCO0lBQ3hDLEdBQUcsRUFBRSxVQUFPLE9BQU87Ozs7O29CQUVmLEtBSUUsT0FBTyxXQUowQixFQUFyQixNQUFNLFlBQUEsRUFBRSxXQUFXLGlCQUFBLEVBQ2pDLEtBR0UsT0FBTyxXQUhxQixFQUFoQixLQUFLLFdBQUEsRUFBRSxPQUFPLGFBQUEsRUFDNUIsS0FFRSxPQUFPLE1BRjBDLEVBQTFDLEtBQUssV0FBQSxFQUFFLElBQUksVUFBQSxFQUFFLFNBQVMsZUFBQSxFQUFFLE9BQU8sYUFBQSxFQUFFLE9BQU8sYUFBQSxFQUNqRCxNQUFNLEdBQ0osT0FBTyxPQURILENBQ0k7b0JBRU4sdUJBQXVCLEdBQUc7d0JBQzlCLElBQUksQ0FBQyx1RUFBNkQsQ0FBQyxDQUFDO3dCQUNwRSxJQUFJLENBQ0YsMkhBQTJILENBQzVILENBQUM7d0JBQ0YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNYLENBQUMsQ0FBQztvQkFDRixJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFD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
@@ -1,101 +1,61 @@
1
- <% if (props.stylingPackage?.name === "nativewind") { %>
2
- import './global.css';
1
+ import { ScreenContent } from 'components/ScreenContent';
2
+ import { StatusBar } from 'expo-status-bar';
3
+
4
+ <% if (props.internalizationPackage?.name === "i18next") { %>
5
+ import './translation';
6
+ import { InternalizationExample } from 'components/InternalizationExample';
3
7
  <% } %>
4
- import React from 'react';
5
8
 
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") {%>
9
+ <% if (props.stylingPackage?.name === "nativewind") { %>
10
+ import './global.css';
11
+ <% } else if (props.stylingPackage?.name === "restyle") { %>
13
12
  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';
13
+ import { theme } from 'theme';
14
+ <% } else if (props.stylingPackage?.name === "tamagui") { %>
15
+ import { TamaguiProvider } from 'tamagui';
16
+ import config from './tamagui.config';
20
17
  <% } %>
21
18
 
22
- import { StatusBar } from 'expo-status-bar';
23
-
24
- <% if (props.stylingPackage?.name === "nativewind") {%>
25
- export default function App() {
26
- return (
27
- <View className={styles.container}>
28
- <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">
24
+ <% if (props.internalizationPackage?.name === "i18next") { %>
25
+ <InternalizationExample />
26
+ <% } %>
27
+ </ScreenContent>
29
28
  <StatusBar style="auto" />
30
- </View >
29
+ </ThemeProvider>
31
30
  );
32
- }
33
-
34
- const styles = {
35
- container: 'flex flex-1 items-center justify-center bg-white',
36
- };
31
+ }
37
32
  <% } else if (props.stylingPackage?.name === "tamagui") {%>
38
- const MyView = styled(View, {
39
- name: "MyView",
40
- flex: 1,
41
- alignItems: 'center',
42
- justifyContent: 'center',
43
- });
44
-
45
- export default function App() {
46
- return (
47
- <TamaguiProvider config={config}>
48
- <MyView>
49
- <Text>Open up App.tsx to start working on your app!</Text>
50
- <StatusBar style="auto" />
51
- </MyView>
52
- </TamaguiProvider >
53
- );
54
- }
55
- <% } else if (props.stylingPackage?.name === "restyle") {%>
56
- export default function App() {
57
- return (
58
- <ThemeProvider theme={theme}>
33
+ export default function App() {
34
+ return (
35
+ <TamaguiProvider config={config}>
36
+ <ScreenContent title="Home" path="App.tsx">
37
+ <% if (props.internalizationPackage?.name === "i18next") { %>
38
+ <InternalizationExample />
39
+ <% } else { %>
59
40
  <Text>Open up App.tsx to start working on your app!</Text>
60
- <StatusBar style="auto" />
61
- </ThemeProvider>
62
- );
63
- }
64
- <% } else if (props.stylingPackage?.name === "unistyles") {%>
65
- export default function App() {
66
- const {styles} = useStyles(stylesheet)
67
- return (
68
- <View style={styles.container}>
69
- <Text>Open up App.tsx to start working on your app!</Text>
70
- <StatusBar style="auto" />
71
- </View >
72
- );
73
- }
74
-
75
- const stylesheet = createStyleSheet({
76
- container: {
77
- flex: 1,
78
- backgroundColor: '#fff',
79
- alignItems: 'center',
80
- justifyContent: 'center',
81
- },
82
- });
83
- <% } else {%>
84
- export default function App() {
85
- return (
86
- <View style={styles.container}>
87
- <Text>Open up App.tsx to start working on your app!</Text>
88
- <StatusBar style="auto" />
89
- </View >
90
- );
91
- }
41
+ <% } %>
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">
52
+ <% if (props.internalizationPackage?.name === "i18next") { %>
53
+ <InternalizationExample />
54
+ <% } %>
55
+ </ScreenContent>
56
+ <StatusBar style="auto" />
57
+ </>
58
+ );
59
+ }
60
+ <% } %>
92
61
 
93
- const styles = StyleSheet.create({
94
- container: {
95
- flex: 1,
96
- backgroundColor: '#fff',
97
- alignItems: 'center',
98
- justifyContent: 'center',
99
- },
100
- });
101
- <% } %>
@@ -47,5 +47,11 @@
47
47
  "backgroundColor": "#ffffff"
48
48
  }
49
49
  }
50
+ <% if (props.internalizationPackage?.name === "i18next") { %>
51
+ ,
52
+ "plugins": [
53
+ "expo-localization"
54
+ ]
55
+ <% } %>
50
56
  }
51
57
  }
@@ -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
+ });