rothzerg 0.1.0

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 (341) hide show
  1. package/dist/cli.js +949 -0
  2. package/package.json +27 -0
  3. package/readme.md +0 -0
  4. package/templates/_base-website/App.tsx +59 -0
  5. package/templates/_base-website/InitialDataContext.tsx +21 -0
  6. package/templates/_base-website/_gitignore +5 -0
  7. package/templates/_base-website/client.tsx +26 -0
  8. package/templates/_base-website/components/DeepLinkLayout.css +41 -0
  9. package/templates/_base-website/components/DeepLinkLayout.tsx +39 -0
  10. package/templates/_base-website/components/DownloadSection.css +60 -0
  11. package/templates/_base-website/components/DownloadSection.tsx +61 -0
  12. package/templates/_base-website/components/SiteFeaturesSection.tsx +68 -0
  13. package/templates/_base-website/components/SiteFooter.tsx +29 -0
  14. package/templates/_base-website/components/SiteHeroSection.tsx +30 -0
  15. package/templates/_base-website/components/SiteHighlightsSection.tsx +38 -0
  16. package/templates/_base-website/components/SiteLanguageSwitcher.tsx +9 -0
  17. package/templates/_base-website/components/SiteNavigation.tsx +24 -0
  18. package/templates/_base-website/config.ts +78 -0
  19. package/templates/_base-website/data/blog/authors.json +18 -0
  20. package/templates/_base-website/data/blog/categories.json +53 -0
  21. package/templates/_base-website/data/blog/posts.json +29 -0
  22. package/templates/_base-website/data/blog/tags.json +86 -0
  23. package/templates/_base-website/i18n/config.ts +60 -0
  24. package/templates/_base-website/i18n/sections/blog/_index.ts +41 -0
  25. package/templates/_base-website/i18n/sections/blog/ar.ts +24 -0
  26. package/templates/_base-website/i18n/sections/blog/de.ts +24 -0
  27. package/templates/_base-website/i18n/sections/blog/en.ts +24 -0
  28. package/templates/_base-website/i18n/sections/blog/es.ts +24 -0
  29. package/templates/_base-website/i18n/sections/blog/fr.ts +24 -0
  30. package/templates/_base-website/i18n/sections/blog/hi.ts +24 -0
  31. package/templates/_base-website/i18n/sections/blog/id.ts +24 -0
  32. package/templates/_base-website/i18n/sections/blog/it.ts +24 -0
  33. package/templates/_base-website/i18n/sections/blog/ja.ts +24 -0
  34. package/templates/_base-website/i18n/sections/blog/ko.ts +24 -0
  35. package/templates/_base-website/i18n/sections/blog/nl.ts +24 -0
  36. package/templates/_base-website/i18n/sections/blog/pl.ts +24 -0
  37. package/templates/_base-website/i18n/sections/blog/pt.ts +24 -0
  38. package/templates/_base-website/i18n/sections/blog/ru.ts +24 -0
  39. package/templates/_base-website/i18n/sections/blog/sv.ts +24 -0
  40. package/templates/_base-website/i18n/sections/blog/th.ts +24 -0
  41. package/templates/_base-website/i18n/sections/blog/tr.ts +24 -0
  42. package/templates/_base-website/i18n/sections/blog/vi.ts +24 -0
  43. package/templates/_base-website/i18n/sections/blog/zh.ts +24 -0
  44. package/templates/_base-website/i18n/sections/common/_index.ts +41 -0
  45. package/templates/_base-website/i18n/sections/common/ar.ts +29 -0
  46. package/templates/_base-website/i18n/sections/common/de.ts +29 -0
  47. package/templates/_base-website/i18n/sections/common/en.ts +29 -0
  48. package/templates/_base-website/i18n/sections/common/es.ts +29 -0
  49. package/templates/_base-website/i18n/sections/common/fr.ts +29 -0
  50. package/templates/_base-website/i18n/sections/common/hi.ts +29 -0
  51. package/templates/_base-website/i18n/sections/common/id.ts +29 -0
  52. package/templates/_base-website/i18n/sections/common/it.ts +29 -0
  53. package/templates/_base-website/i18n/sections/common/ja.ts +29 -0
  54. package/templates/_base-website/i18n/sections/common/ko.ts +29 -0
  55. package/templates/_base-website/i18n/sections/common/nl.ts +29 -0
  56. package/templates/_base-website/i18n/sections/common/pl.ts +29 -0
  57. package/templates/_base-website/i18n/sections/common/pt.ts +29 -0
  58. package/templates/_base-website/i18n/sections/common/ru.ts +29 -0
  59. package/templates/_base-website/i18n/sections/common/sv.ts +29 -0
  60. package/templates/_base-website/i18n/sections/common/th.ts +29 -0
  61. package/templates/_base-website/i18n/sections/common/tr.ts +29 -0
  62. package/templates/_base-website/i18n/sections/common/vi.ts +29 -0
  63. package/templates/_base-website/i18n/sections/common/zh.ts +29 -0
  64. package/templates/_base-website/i18n/sections/deepLink/_index.ts +41 -0
  65. package/templates/_base-website/i18n/sections/deepLink/ar.ts +14 -0
  66. package/templates/_base-website/i18n/sections/deepLink/de.ts +14 -0
  67. package/templates/_base-website/i18n/sections/deepLink/en.ts +14 -0
  68. package/templates/_base-website/i18n/sections/deepLink/es.ts +14 -0
  69. package/templates/_base-website/i18n/sections/deepLink/fr.ts +14 -0
  70. package/templates/_base-website/i18n/sections/deepLink/hi.ts +14 -0
  71. package/templates/_base-website/i18n/sections/deepLink/id.ts +14 -0
  72. package/templates/_base-website/i18n/sections/deepLink/it.ts +14 -0
  73. package/templates/_base-website/i18n/sections/deepLink/ja.ts +14 -0
  74. package/templates/_base-website/i18n/sections/deepLink/ko.ts +14 -0
  75. package/templates/_base-website/i18n/sections/deepLink/nl.ts +14 -0
  76. package/templates/_base-website/i18n/sections/deepLink/pl.ts +14 -0
  77. package/templates/_base-website/i18n/sections/deepLink/pt.ts +14 -0
  78. package/templates/_base-website/i18n/sections/deepLink/ru.ts +14 -0
  79. package/templates/_base-website/i18n/sections/deepLink/sv.ts +14 -0
  80. package/templates/_base-website/i18n/sections/deepLink/th.ts +14 -0
  81. package/templates/_base-website/i18n/sections/deepLink/tr.ts +14 -0
  82. package/templates/_base-website/i18n/sections/deepLink/vi.ts +14 -0
  83. package/templates/_base-website/i18n/sections/deepLink/zh.ts +14 -0
  84. package/templates/_base-website/i18n/sections/home/_index.ts +41 -0
  85. package/templates/_base-website/i18n/sections/home/ar.ts +85 -0
  86. package/templates/_base-website/i18n/sections/home/de.ts +85 -0
  87. package/templates/_base-website/i18n/sections/home/en.ts +85 -0
  88. package/templates/_base-website/i18n/sections/home/es.ts +85 -0
  89. package/templates/_base-website/i18n/sections/home/fr.ts +85 -0
  90. package/templates/_base-website/i18n/sections/home/hi.ts +85 -0
  91. package/templates/_base-website/i18n/sections/home/id.ts +85 -0
  92. package/templates/_base-website/i18n/sections/home/it.ts +85 -0
  93. package/templates/_base-website/i18n/sections/home/ja.ts +85 -0
  94. package/templates/_base-website/i18n/sections/home/ko.ts +85 -0
  95. package/templates/_base-website/i18n/sections/home/nl.ts +85 -0
  96. package/templates/_base-website/i18n/sections/home/pl.ts +85 -0
  97. package/templates/_base-website/i18n/sections/home/pt.ts +85 -0
  98. package/templates/_base-website/i18n/sections/home/ru.ts +85 -0
  99. package/templates/_base-website/i18n/sections/home/sv.ts +85 -0
  100. package/templates/_base-website/i18n/sections/home/th.ts +85 -0
  101. package/templates/_base-website/i18n/sections/home/tr.ts +85 -0
  102. package/templates/_base-website/i18n/sections/home/vi.ts +85 -0
  103. package/templates/_base-website/i18n/sections/home/zh.ts +85 -0
  104. package/templates/_base-website/i18n/sections/support/_index.ts +41 -0
  105. package/templates/_base-website/i18n/sections/support/ar.ts +37 -0
  106. package/templates/_base-website/i18n/sections/support/de.ts +37 -0
  107. package/templates/_base-website/i18n/sections/support/en.ts +37 -0
  108. package/templates/_base-website/i18n/sections/support/es.ts +37 -0
  109. package/templates/_base-website/i18n/sections/support/fr.ts +37 -0
  110. package/templates/_base-website/i18n/sections/support/hi.ts +37 -0
  111. package/templates/_base-website/i18n/sections/support/id.ts +37 -0
  112. package/templates/_base-website/i18n/sections/support/it.ts +37 -0
  113. package/templates/_base-website/i18n/sections/support/ja.ts +37 -0
  114. package/templates/_base-website/i18n/sections/support/ko.ts +37 -0
  115. package/templates/_base-website/i18n/sections/support/nl.ts +37 -0
  116. package/templates/_base-website/i18n/sections/support/pl.ts +37 -0
  117. package/templates/_base-website/i18n/sections/support/pt.ts +37 -0
  118. package/templates/_base-website/i18n/sections/support/ru.ts +37 -0
  119. package/templates/_base-website/i18n/sections/support/sv.ts +37 -0
  120. package/templates/_base-website/i18n/sections/support/th.ts +37 -0
  121. package/templates/_base-website/i18n/sections/support/tr.ts +37 -0
  122. package/templates/_base-website/i18n/sections/support/vi.ts +37 -0
  123. package/templates/_base-website/i18n/sections/support/zh.ts +37 -0
  124. package/templates/_base-website/i18n/translations.ts +25 -0
  125. package/templates/_base-website/index.ts +460 -0
  126. package/templates/_base-website/pages/404.tsx +35 -0
  127. package/templates/_base-website/pages/blog/author.tsx +97 -0
  128. package/templates/_base-website/pages/blog/category.tsx +89 -0
  129. package/templates/_base-website/pages/blog/index.tsx +81 -0
  130. package/templates/_base-website/pages/blog/post.tsx +110 -0
  131. package/templates/_base-website/pages/blog/tag.tsx +86 -0
  132. package/templates/_base-website/pages/custom-pages/example.tsx +54 -0
  133. package/templates/_base-website/pages/index.tsx +29 -0
  134. package/templates/_base-website/pages/privacy.tsx +45 -0
  135. package/templates/_base-website/pages/support.tsx +154 -0
  136. package/templates/_base-website/pages/terms.tsx +68 -0
  137. package/templates/_base-website/public/images/16.png +0 -0
  138. package/templates/_base-website/public/images/apple-touch-icon.png +0 -0
  139. package/templates/_base-website/public/images/favicon-32x32.png +0 -0
  140. package/templates/_base-website/public/images/favicon.png +0 -0
  141. package/templates/_base-website/public/images/logo_dark.svg +6 -0
  142. package/templates/_base-website/public/images/logo_light.svg +6 -0
  143. package/templates/_base-website/public/images/og-image.png +0 -0
  144. package/templates/_base-website/public/images/screenshots/ar_dashboard.jpg +0 -0
  145. package/templates/_base-website/public/images/screenshots/de_dashboard.jpg +0 -0
  146. package/templates/_base-website/public/images/screenshots/en_dashboard.jpg +0 -0
  147. package/templates/_base-website/public/images/screenshots/es_dashboard.jpg +0 -0
  148. package/templates/_base-website/public/images/screenshots/fr_dashboard.jpg +0 -0
  149. package/templates/_base-website/public/images/screenshots/hi_dashboard.jpg +0 -0
  150. package/templates/_base-website/public/images/screenshots/id_dashboard.jpg +0 -0
  151. package/templates/_base-website/public/images/screenshots/it_dashboard.jpg +0 -0
  152. package/templates/_base-website/public/images/screenshots/ja_dashboard.jpg +0 -0
  153. package/templates/_base-website/public/images/screenshots/ko_dashboard.jpg +0 -0
  154. package/templates/_base-website/public/images/screenshots/nl_dashboard.jpg +0 -0
  155. package/templates/_base-website/public/images/screenshots/pl_dashboard.jpg +0 -0
  156. package/templates/_base-website/public/images/screenshots/pt_dashboard.jpg +0 -0
  157. package/templates/_base-website/public/images/screenshots/ru_dashboard.jpg +0 -0
  158. package/templates/_base-website/public/images/screenshots/sv_dashboard.jpg +0 -0
  159. package/templates/_base-website/public/images/screenshots/th_dashboard.jpg +0 -0
  160. package/templates/_base-website/public/images/screenshots/tr_dashboard.jpg +0 -0
  161. package/templates/_base-website/public/images/screenshots/vi_dashboard.jpg +0 -0
  162. package/templates/_base-website/public/images/screenshots/zh_dashboard.jpg +0 -0
  163. package/templates/_base-website/rothzerg.template.json +63 -0
  164. package/templates/_base-website/styles/404.css +32 -0
  165. package/templates/_base-website/styles/_app.css +131 -0
  166. package/templates/_base-website/styles/_shared.css +194 -0
  167. package/templates/_base-website/styles/index.css +1 -0
  168. package/templates/_base-website/styles/privacy.css +1 -0
  169. package/templates/_base-website/styles/support.css +148 -0
  170. package/templates/_base-website/styles/terms.css +22 -0
  171. package/templates/mobile-app/_gitignore +46 -0
  172. package/templates/mobile-app/analysis_options.yaml +28 -0
  173. package/templates/mobile-app/android/app/build.gradle.kts +56 -0
  174. package/templates/mobile-app/android/app/google-services.json +29 -0
  175. package/templates/mobile-app/android/app/src/debug/AndroidManifest.xml +7 -0
  176. package/templates/mobile-app/android/app/src/main/AndroidManifest.xml +54 -0
  177. package/templates/mobile-app/android/app/src/main/kotlin/com/example/{{projectNameSnake}}/MainActivity.kt +5 -0
  178. package/templates/mobile-app/android/app/src/main/res/drawable/launch_background.xml +12 -0
  179. package/templates/mobile-app/android/app/src/main/res/drawable-v21/launch_background.xml +12 -0
  180. package/templates/mobile-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  181. package/templates/mobile-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  182. package/templates/mobile-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  183. package/templates/mobile-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  184. package/templates/mobile-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  185. package/templates/mobile-app/android/app/src/main/res/values/styles.xml +18 -0
  186. package/templates/mobile-app/android/app/src/main/res/values-night/styles.xml +18 -0
  187. package/templates/mobile-app/android/app/src/profile/AndroidManifest.xml +7 -0
  188. package/templates/mobile-app/android/build.gradle.kts +24 -0
  189. package/templates/mobile-app/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  190. package/templates/mobile-app/android/gradle.properties +2 -0
  191. package/templates/mobile-app/android/settings.gradle.kts +31 -0
  192. package/templates/mobile-app/assets/icons/logo.png +0 -0
  193. package/templates/mobile-app/assets/icons/logo_dark.svg +5 -0
  194. package/templates/mobile-app/assets/icons/logo_light.svg +5 -0
  195. package/templates/mobile-app/assets/lottie/tick.json +1 -0
  196. package/templates/mobile-app/devtools_options.yaml +3 -0
  197. package/templates/mobile-app/ios/Flutter/AppFrameworkInfo.plist +26 -0
  198. package/templates/mobile-app/ios/Flutter/Debug.xcconfig +2 -0
  199. package/templates/mobile-app/ios/Flutter/Release.xcconfig +2 -0
  200. package/templates/mobile-app/ios/Podfile +46 -0
  201. package/templates/mobile-app/ios/Podfile.lock +1807 -0
  202. package/templates/mobile-app/ios/Runner/AppDelegate.swift +16 -0
  203. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +122 -0
  204. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png +0 -0
  205. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png +0 -0
  206. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png +0 -0
  207. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png +0 -0
  208. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png +0 -0
  209. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png +0 -0
  210. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png +0 -0
  211. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png +0 -0
  212. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png +0 -0
  213. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png +0 -0
  214. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png +0 -0
  215. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png +0 -0
  216. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png +0 -0
  217. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png +0 -0
  218. package/templates/mobile-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png +0 -0
  219. package/templates/mobile-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +23 -0
  220. package/templates/mobile-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png +0 -0
  221. package/templates/mobile-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png +0 -0
  222. package/templates/mobile-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png +0 -0
  223. package/templates/mobile-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +5 -0
  224. package/templates/mobile-app/ios/Runner/Base.lproj/LaunchScreen.storyboard +37 -0
  225. package/templates/mobile-app/ios/Runner/Base.lproj/Main.storyboard +26 -0
  226. package/templates/mobile-app/ios/Runner/GoogleService-Info.plist +30 -0
  227. package/templates/mobile-app/ios/Runner/Info.plist +70 -0
  228. package/templates/mobile-app/ios/Runner/Runner-Bridging-Header.h +1 -0
  229. package/templates/mobile-app/ios/Runner.xcodeproj/project.pbxproj +772 -0
  230. package/templates/mobile-app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  231. package/templates/mobile-app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  232. package/templates/mobile-app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +8 -0
  233. package/templates/mobile-app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +101 -0
  234. package/templates/mobile-app/ios/Runner.xcworkspace/contents.xcworkspacedata +10 -0
  235. package/templates/mobile-app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  236. package/templates/mobile-app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +8 -0
  237. package/templates/mobile-app/ios/RunnerTests/RunnerTests.swift +12 -0
  238. package/templates/mobile-app/l10n.yaml +5 -0
  239. package/templates/mobile-app/lib/core/config/app_config.dart +76 -0
  240. package/templates/mobile-app/lib/core/constants/app_colors.dart +13 -0
  241. package/templates/mobile-app/lib/core/constants/app_constants.dart +123 -0
  242. package/templates/mobile-app/lib/core/constants/countries.dart +199 -0
  243. package/templates/mobile-app/lib/core/constants/keys.dart +46 -0
  244. package/templates/mobile-app/lib/core/constants/languages.dart +51 -0
  245. package/templates/mobile-app/lib/core/services/admin_service.dart +271 -0
  246. package/templates/mobile-app/lib/core/services/analytics_service.dart +296 -0
  247. package/templates/mobile-app/lib/core/services/auth_service.dart +185 -0
  248. package/templates/mobile-app/lib/core/services/device_service.dart +228 -0
  249. package/templates/mobile-app/lib/core/services/firebase_service.dart +490 -0
  250. package/templates/mobile-app/lib/core/services/in_app_messaging_service.dart +166 -0
  251. package/templates/mobile-app/lib/core/services/logging_service.dart +451 -0
  252. package/templates/mobile-app/lib/core/services/messaging_service.dart +460 -0
  253. package/templates/mobile-app/lib/core/services/remote_config_service.dart +167 -0
  254. package/templates/mobile-app/lib/core/services/revenue_cat_service.dart +364 -0
  255. package/templates/mobile-app/lib/core/services/storage_service.dart +313 -0
  256. package/templates/mobile-app/lib/core/theme/dark_theme.dart +295 -0
  257. package/templates/mobile-app/lib/core/theme/light_theme.dart +296 -0
  258. package/templates/mobile-app/lib/core/utils/formatters.dart +236 -0
  259. package/templates/mobile-app/lib/core/utils/image_picker_helper.dart +78 -0
  260. package/templates/mobile-app/lib/core/utils/validators.dart +292 -0
  261. package/templates/mobile-app/lib/firebase_options.dart +19 -0
  262. package/templates/mobile-app/lib/l10n/app_en.arb +1371 -0
  263. package/templates/mobile-app/lib/l10n/app_localizations.dart +2042 -0
  264. package/templates/mobile-app/lib/l10n/app_localizations_en.dart +1033 -0
  265. package/templates/mobile-app/lib/main.dart +152 -0
  266. package/templates/mobile-app/lib/models/device_model.dart +90 -0
  267. package/templates/mobile-app/lib/models/news_banner.dart +53 -0
  268. package/templates/mobile-app/lib/models/user_model.dart +120 -0
  269. package/templates/mobile-app/lib/providers/admin_provider.dart +67 -0
  270. package/templates/mobile-app/lib/providers/auth_provider.dart +328 -0
  271. package/templates/mobile-app/lib/providers/remote_config_provider.dart +81 -0
  272. package/templates/mobile-app/lib/providers/subscription_provider.dart +67 -0
  273. package/templates/mobile-app/lib/providers/theme_provider.dart +51 -0
  274. package/templates/mobile-app/lib/screens/admin/admin_panel_screen.dart +436 -0
  275. package/templates/mobile-app/lib/screens/admin/admin_panel_user_details_screen.dart +942 -0
  276. package/templates/mobile-app/lib/screens/admin/admin_panel_users_screen.dart +344 -0
  277. package/templates/mobile-app/lib/screens/auth/auth_home_screen.dart +266 -0
  278. package/templates/mobile-app/lib/screens/auth/forgot_password_screen.dart +214 -0
  279. package/templates/mobile-app/lib/screens/auth/login_screen.dart +312 -0
  280. package/templates/mobile-app/lib/screens/auth/profile_setup_screen.dart +157 -0
  281. package/templates/mobile-app/lib/screens/auth/register_screen.dart +288 -0
  282. package/templates/mobile-app/lib/screens/developer/developer_panel_screen.dart +436 -0
  283. package/templates/mobile-app/lib/screens/developer/remote_config_screen.dart +315 -0
  284. package/templates/mobile-app/lib/screens/developer/remote_config_test_screen.dart +461 -0
  285. package/templates/mobile-app/lib/screens/home/home_screen.dart +270 -0
  286. package/templates/mobile-app/lib/screens/legal/privacy_policy_screen.dart +63 -0
  287. package/templates/mobile-app/lib/screens/legal/terms_screen.dart +82 -0
  288. package/templates/mobile-app/lib/screens/main_navigation_screen.dart +85 -0
  289. package/templates/mobile-app/lib/screens/premium/subscription_screen.dart +516 -0
  290. package/templates/mobile-app/lib/screens/profile/edit_profile_screen.dart +246 -0
  291. package/templates/mobile-app/lib/screens/settings/about_app_screen.dart +200 -0
  292. package/templates/mobile-app/lib/screens/settings/cache_manager_screen.dart +400 -0
  293. package/templates/mobile-app/lib/screens/settings/change_password_screen.dart +269 -0
  294. package/templates/mobile-app/lib/screens/settings/delete_account_screen.dart +261 -0
  295. package/templates/mobile-app/lib/screens/settings/settings_screen.dart +400 -0
  296. package/templates/mobile-app/lib/screens/splash/splash_screen.dart +125 -0
  297. package/templates/mobile-app/lib/widgets/app_button.dart +255 -0
  298. package/templates/mobile-app/lib/widgets/app_drawer.dart +207 -0
  299. package/templates/mobile-app/lib/widgets/bottom_sheet_selector.dart +79 -0
  300. package/templates/mobile-app/lib/widgets/button_banner.dart +177 -0
  301. package/templates/mobile-app/lib/widgets/country_picker.dart +169 -0
  302. package/templates/mobile-app/lib/widgets/custom_app_bar.dart +30 -0
  303. package/templates/mobile-app/lib/widgets/email_verification_banner.dart +163 -0
  304. package/templates/mobile-app/lib/widgets/empty_screen.dart +42 -0
  305. package/templates/mobile-app/lib/widgets/language_picker.dart +145 -0
  306. package/templates/mobile-app/lib/widgets/news_banner_widget.dart +264 -0
  307. package/templates/mobile-app/lib/widgets/remote_config/remote_config_widgets.dart +294 -0
  308. package/templates/mobile-app/lib/widgets/section_header.dart +23 -0
  309. package/templates/mobile-app/lib/widgets/success_overlay.dart +117 -0
  310. package/templates/mobile-app/lib/widgets/top_notification.dart +263 -0
  311. package/templates/mobile-app/lib/widgets/user_avatar_picker.dart +58 -0
  312. package/templates/mobile-app/pubspec.yaml +97 -0
  313. package/templates/mobile-app/rothzerg.template.json +43 -0
  314. package/templates/web-app/_gitignore +4 -0
  315. package/templates/web-app/index.html +12 -0
  316. package/templates/web-app/package.json +23 -0
  317. package/templates/web-app/rothzerg.template.json +41 -0
  318. package/templates/web-app/src/App.css +6 -0
  319. package/templates/web-app/src/App.tsx +12 -0
  320. package/templates/web-app/src/index.css +14 -0
  321. package/templates/web-app/src/main.tsx +10 -0
  322. package/templates/web-app/tsconfig.app.json +20 -0
  323. package/templates/web-app/tsconfig.json +7 -0
  324. package/templates/web-app/tsconfig.node.json +18 -0
  325. package/templates/web-app/vite.config.ts +6 -0
  326. package/templates/website-blog/overrides/config.ts +76 -0
  327. package/templates/website-blog/overrides/pages/index.tsx +63 -0
  328. package/templates/website-blog/rothzerg.template.json +29 -0
  329. package/templates/website-business/overrides/App.tsx +49 -0
  330. package/templates/website-business/overrides/components/SiteHeroSection.tsx +33 -0
  331. package/templates/website-business/overrides/config.ts +76 -0
  332. package/templates/website-business/overrides/pages/about.tsx +50 -0
  333. package/templates/website-business/overrides/pages/contact.tsx +61 -0
  334. package/templates/website-business/overrides/pages/index.tsx +37 -0
  335. package/templates/website-business/overrides/pages/services.tsx +70 -0
  336. package/templates/website-business/rothzerg.template.json +18 -0
  337. package/templates/website-mobile/overrides/App.tsx +62 -0
  338. package/templates/website-mobile/overrides/components/SiteHeroSection.tsx +18 -0
  339. package/templates/website-mobile/overrides/config.ts +76 -0
  340. package/templates/website-mobile/overrides/pages/index.tsx +34 -0
  341. package/templates/website-mobile/rothzerg.template.json +64 -0
@@ -0,0 +1,23 @@
1
+ import 'package:flutter/material.dart';
2
+
3
+ /// A reusable section header for settings screens
4
+ class SectionHeader extends StatelessWidget {
5
+ final String title;
6
+
7
+ const SectionHeader({super.key, required this.title});
8
+
9
+ @override
10
+ Widget build(BuildContext context) {
11
+ return Padding(
12
+ padding: const EdgeInsets.fromLTRB(16, 16, 0, 8),
13
+ child: Text(
14
+ title,
15
+ style: TextStyle(
16
+ fontSize: 14,
17
+ fontWeight: FontWeight.bold,
18
+ color: Theme.of(context).colorScheme.primary,
19
+ ),
20
+ ),
21
+ );
22
+ }
23
+ }
@@ -0,0 +1,117 @@
1
+ import 'package:flutter/material.dart';
2
+ import 'package:lottie/lottie.dart';
3
+
4
+ /// A full-screen success overlay that displays a Lottie animation.
5
+ ///
6
+ /// Usage:
7
+ /// ```dart
8
+ /// await SuccessOverlay.show(context);
9
+ /// // Continue after animation completes
10
+ /// Navigator.pop(context);
11
+ /// ```
12
+ class SuccessOverlay extends StatefulWidget {
13
+ final String lottiePath;
14
+ final Duration? duration;
15
+ final VoidCallback? onComplete;
16
+
17
+ const SuccessOverlay({
18
+ super.key,
19
+ this.lottiePath = 'assets/lottie/tick.json',
20
+ this.duration,
21
+ this.onComplete,
22
+ });
23
+
24
+ /// Shows the success overlay and returns when the animation completes.
25
+ static Future<void> show(
26
+ BuildContext context, {
27
+ String lottiePath = 'assets/lottie/tick.json',
28
+ Duration? duration,
29
+ }) {
30
+ return showGeneralDialog<void>(
31
+ context: context,
32
+ barrierDismissible: false,
33
+ barrierColor: Colors.transparent,
34
+ transitionDuration: const Duration(milliseconds: 200),
35
+ pageBuilder: (context, animation, secondaryAnimation) {
36
+ return SuccessOverlay(
37
+ lottiePath: lottiePath,
38
+ duration: duration,
39
+ onComplete: () => Navigator.of(context).pop(),
40
+ );
41
+ },
42
+ transitionBuilder: (context, animation, secondaryAnimation, child) {
43
+ return FadeTransition(opacity: animation, child: child);
44
+ },
45
+ );
46
+ }
47
+
48
+ @override
49
+ State<SuccessOverlay> createState() => _SuccessOverlayState();
50
+ }
51
+
52
+ class _SuccessOverlayState extends State<SuccessOverlay>
53
+ with SingleTickerProviderStateMixin {
54
+ late final AnimationController _controller;
55
+ bool _animationLoaded = false;
56
+
57
+ @override
58
+ void initState() {
59
+ super.initState();
60
+ _controller = AnimationController(vsync: this);
61
+ _controller.addStatusListener((status) {
62
+ if (status == AnimationStatus.completed) {
63
+ widget.onComplete?.call();
64
+ }
65
+ });
66
+ }
67
+
68
+ @override
69
+ void dispose() {
70
+ _controller.dispose();
71
+ super.dispose();
72
+ }
73
+
74
+ @override
75
+ Widget build(BuildContext context) {
76
+ final theme = Theme.of(context);
77
+
78
+ return Material(
79
+ color: Colors.transparent,
80
+ child: Container(
81
+ width: double.infinity,
82
+ height: double.infinity,
83
+ decoration: BoxDecoration(color: theme.scaffoldBackgroundColor),
84
+ child: Center(
85
+ child: Column(
86
+ mainAxisAlignment: MainAxisAlignment.center,
87
+ children: [
88
+ SizedBox(
89
+ width: 200,
90
+ height: 200,
91
+ child: Lottie.asset(
92
+ widget.lottiePath,
93
+ controller: _controller,
94
+ fit: BoxFit.contain,
95
+ onLoaded: (composition) {
96
+ setState(() => _animationLoaded = true);
97
+ _controller.duration =
98
+ widget.duration ?? composition.duration;
99
+ _controller.forward();
100
+ },
101
+ ),
102
+ ),
103
+ if (!_animationLoaded)
104
+ Padding(
105
+ padding: const EdgeInsets.only(top: 24),
106
+ child: CircularProgressIndicator(
107
+ color: theme.primaryColor,
108
+ strokeWidth: 2,
109
+ ),
110
+ ),
111
+ ],
112
+ ),
113
+ ),
114
+ ),
115
+ );
116
+ }
117
+ }
@@ -0,0 +1,263 @@
1
+ import 'package:flutter/material.dart';
2
+ import '../core/constants/app_colors.dart';
3
+
4
+ /// A floating notification that appears at the top of the screen.
5
+ ///
6
+ /// Usage:
7
+ // ```dart
8
+ // import '../../widgets/top_notification.dart';
9
+ // // Success notification (blue)
10
+ // TopNotification.show(context, message: 'Success!');
11
+
12
+ // // Error notification (red)
13
+ // TopNotification.showError(context, message: 'Something went wrong');
14
+
15
+ // // Warning notification (gold)
16
+ // TopNotification.showWarning(context, message: 'Please check your input');
17
+
18
+ // // Info notification (blue)
19
+ // TopNotification.showInfo(context, message: 'FYI: New feature available');
20
+
21
+ // // Custom duration
22
+ // TopNotification.show(
23
+ // context,
24
+ // message: 'Quick message',
25
+ // duration: Duration(seconds: 2),
26
+ // );
27
+
28
+ // // Custom color and icon
29
+ // TopNotification.show(
30
+ // context,
31
+ // message: 'Custom notification',
32
+ // backgroundColor: Colors.purple,
33
+ // icon: Icons.star,
34
+ // );
35
+ // ```
36
+
37
+ class TopNotification {
38
+ /// Shows a success notification at the top of the screen
39
+ static void show(
40
+ BuildContext context, {
41
+ required String message,
42
+ Duration duration = const Duration(seconds: 3),
43
+ Color? backgroundColor,
44
+ IconData? icon,
45
+ }) {
46
+ _showNotification(
47
+ context,
48
+ message: message,
49
+ duration: duration,
50
+ backgroundColor: backgroundColor ?? AppColors.primaryBlue,
51
+ icon: icon ?? Icons.check_circle,
52
+ );
53
+ }
54
+
55
+ /// Shows an error notification at the top of the screen
56
+ static void showError(
57
+ BuildContext context, {
58
+ required String message,
59
+ Duration duration = const Duration(seconds: 3),
60
+ }) {
61
+ _showNotification(
62
+ context,
63
+ message: message,
64
+ duration: duration,
65
+ backgroundColor: AppColors.error,
66
+ icon: Icons.error,
67
+ );
68
+ }
69
+
70
+ // Show success notification at the top of the screen
71
+ static void showSuccess(
72
+ BuildContext context, {
73
+ required String message,
74
+ Duration duration = const Duration(seconds: 3),
75
+ }) {
76
+ _showNotification(
77
+ context,
78
+ message: message,
79
+ duration: duration,
80
+ backgroundColor: AppColors.success,
81
+ icon: Icons.check_circle,
82
+ );
83
+ }
84
+
85
+ /// Shows a warning notification at the top of the screen
86
+ static void showWarning(
87
+ BuildContext context, {
88
+ required String message,
89
+ Duration duration = const Duration(seconds: 3),
90
+ }) {
91
+ _showNotification(
92
+ context,
93
+ message: message,
94
+ duration: duration,
95
+ backgroundColor: AppColors.warning,
96
+ icon: Icons.warning,
97
+ );
98
+ }
99
+
100
+ /// Shows an info notification at the top of the screen
101
+ static void showInfo(
102
+ BuildContext context, {
103
+ required String message,
104
+ Duration duration = const Duration(seconds: 3),
105
+ }) {
106
+ _showNotification(
107
+ context,
108
+ message: message,
109
+ duration: duration,
110
+ backgroundColor: AppColors.info,
111
+ icon: Icons.info,
112
+ );
113
+ }
114
+
115
+ static void _showNotification(
116
+ BuildContext context, {
117
+ required String message,
118
+ required Duration duration,
119
+ required Color backgroundColor,
120
+ required IconData icon,
121
+ }) {
122
+ // Get the overlay before any async operations
123
+ final overlay = Overlay.maybeOf(context, rootOverlay: true);
124
+ if (overlay == null) return;
125
+
126
+ late OverlayEntry overlayEntry;
127
+
128
+ overlayEntry = OverlayEntry(
129
+ builder: (overlayContext) => _TopNotificationWidget(
130
+ message: message,
131
+ backgroundColor: backgroundColor,
132
+ icon: icon,
133
+ duration: duration,
134
+ onDismiss: () {
135
+ if (overlayEntry.mounted) {
136
+ overlayEntry.remove();
137
+ }
138
+ },
139
+ ),
140
+ );
141
+
142
+ overlay.insert(overlayEntry);
143
+ }
144
+ }
145
+
146
+ class _TopNotificationWidget extends StatefulWidget {
147
+ final String message;
148
+ final Color backgroundColor;
149
+ final IconData icon;
150
+ final Duration duration;
151
+ final VoidCallback onDismiss;
152
+
153
+ const _TopNotificationWidget({
154
+ required this.message,
155
+ required this.backgroundColor,
156
+ required this.icon,
157
+ required this.duration,
158
+ required this.onDismiss,
159
+ });
160
+
161
+ @override
162
+ State<_TopNotificationWidget> createState() => _TopNotificationWidgetState();
163
+ }
164
+
165
+ class _TopNotificationWidgetState extends State<_TopNotificationWidget>
166
+ with SingleTickerProviderStateMixin {
167
+ late AnimationController _controller;
168
+ late Animation<Offset> _slideAnimation;
169
+ late Animation<double> _fadeAnimation;
170
+
171
+ @override
172
+ void initState() {
173
+ super.initState();
174
+ _controller = AnimationController(
175
+ duration: const Duration(milliseconds: 300),
176
+ vsync: this,
177
+ );
178
+
179
+ _slideAnimation = Tween<Offset>(
180
+ begin: const Offset(0, -1),
181
+ end: Offset.zero,
182
+ ).animate(CurvedAnimation(parent: _controller, curve: Curves.easeOut));
183
+
184
+ _fadeAnimation = Tween<double>(begin: 0, end: 1).animate(_controller);
185
+
186
+ _controller.forward();
187
+
188
+ // Auto dismiss after specified duration
189
+ Future.delayed(widget.duration, () {
190
+ if (mounted) _dismiss();
191
+ });
192
+ }
193
+
194
+ void _dismiss() async {
195
+ await _controller.reverse();
196
+ widget.onDismiss();
197
+ }
198
+
199
+ @override
200
+ void dispose() {
201
+ _controller.dispose();
202
+ super.dispose();
203
+ }
204
+
205
+ @override
206
+ Widget build(BuildContext context) {
207
+ // Get viewPadding directly from the overlay's context - this ensures we always
208
+ // get the correct device safe area (Dynamic Island/notch) regardless of
209
+ // where the notification was triggered from
210
+ final topPadding = MediaQuery.of(context).viewPadding.top;
211
+
212
+ return Positioned(
213
+ top: topPadding + 8,
214
+ left: 16,
215
+ right: 16,
216
+ child: SlideTransition(
217
+ position: _slideAnimation,
218
+ child: FadeTransition(
219
+ opacity: _fadeAnimation,
220
+ child: GestureDetector(
221
+ onTap: _dismiss,
222
+ child: Material(
223
+ color: Colors.transparent,
224
+ child: Container(
225
+ padding: const EdgeInsets.symmetric(
226
+ horizontal: 16,
227
+ vertical: 14,
228
+ ),
229
+ decoration: BoxDecoration(
230
+ color: widget.backgroundColor,
231
+ borderRadius: BorderRadius.circular(12),
232
+ boxShadow: [
233
+ BoxShadow(
234
+ color: Colors.black.withValues(alpha: 0.2),
235
+ blurRadius: 10,
236
+ offset: const Offset(0, 4),
237
+ ),
238
+ ],
239
+ ),
240
+ child: Row(
241
+ children: [
242
+ Icon(widget.icon, color: Colors.white),
243
+ const SizedBox(width: 12),
244
+ Expanded(
245
+ child: Text(
246
+ widget.message,
247
+ style: const TextStyle(
248
+ color: Colors.white,
249
+ fontSize: 14,
250
+ fontWeight: FontWeight.w500,
251
+ ),
252
+ ),
253
+ ),
254
+ ],
255
+ ),
256
+ ),
257
+ ),
258
+ ),
259
+ ),
260
+ ),
261
+ );
262
+ }
263
+ }
@@ -0,0 +1,58 @@
1
+ import 'dart:io';
2
+ import 'package:flutter/material.dart';
3
+ import '../core/constants/app_constants.dart';
4
+
5
+ class UserAvatarPicker extends StatelessWidget {
6
+ final File? avatarFile;
7
+ final String? currentPhotoUrl;
8
+ final VoidCallback onTap;
9
+ final double radius;
10
+
11
+ const UserAvatarPicker({
12
+ super.key,
13
+ this.avatarFile,
14
+ this.currentPhotoUrl,
15
+ required this.onTap,
16
+ this.radius = AppConstants.avatarSize,
17
+ });
18
+
19
+ @override
20
+ Widget build(BuildContext context) {
21
+ return Center(
22
+ child: Stack(
23
+ children: [
24
+ CircleAvatar(
25
+ radius: radius,
26
+ backgroundColor: Theme.of(context).colorScheme.surface,
27
+ backgroundImage: avatarFile != null
28
+ ? FileImage(avatarFile!)
29
+ : (currentPhotoUrl != null
30
+ ? NetworkImage(currentPhotoUrl!)
31
+ : null)
32
+ as ImageProvider?,
33
+ child: avatarFile == null && currentPhotoUrl == null
34
+ ? Icon(
35
+ Icons.person,
36
+ size: radius,
37
+ color: Theme.of(context).colorScheme.onSurface,
38
+ )
39
+ : null,
40
+ ),
41
+ Positioned(
42
+ bottom: 0,
43
+ right: 0,
44
+ child: CircleAvatar(
45
+ radius: radius / 3,
46
+ backgroundColor: Theme.of(context).primaryColor,
47
+ child: IconButton(
48
+ icon: Icon(Icons.camera_alt, size: radius / 3),
49
+ color: Colors.white,
50
+ onPressed: onTap,
51
+ ),
52
+ ),
53
+ ),
54
+ ],
55
+ ),
56
+ );
57
+ }
58
+ }
@@ -0,0 +1,97 @@
1
+ name: {{projectNameSnake}}
2
+ description: "A new Flutter project."
3
+ publish_to: 'none'
4
+ version: 1.0.0+1
5
+
6
+ environment:
7
+ sdk: ^3.10.8
8
+
9
+ dependencies:
10
+ flutter:
11
+ sdk: flutter
12
+ flutter_localizations:
13
+ sdk: flutter
14
+
15
+ # UI & Icons
16
+ cupertino_icons: ^1.0.8
17
+ google_fonts: ^8.0.1
18
+ fl_chart: ^1.1.1
19
+ cached_network_image: ^3.3.1
20
+ flutter_cache_manager: ^3.3.1
21
+
22
+ # Firebase
23
+ firebase_core: ^4.2.1
24
+ firebase_auth: ^6.1.2
25
+ cloud_firestore: ^6.1.0
26
+ firebase_analytics: ^12.0.4
27
+ firebase_crashlytics: ^5.0.5
28
+ firebase_storage: ^13.0.4
29
+ firebase_remote_config: ^6.1.2
30
+ firebase_messaging: ^16.0.0
31
+ firebase_performance: ^0.11.1+3
32
+ firebase_in_app_messaging: ^0.9.0+6
33
+ firebase_app_installations: ^0.4.0+6
34
+
35
+ # Local Notifications
36
+ flutter_local_notifications: ^20.1.0
37
+ timezone: ^0.10.1
38
+
39
+ # Authentication Providers
40
+ google_sign_in: ^7.2.0
41
+ sign_in_with_apple: ^7.0.1
42
+ crypto: ^3.0.6
43
+
44
+ # RevenueCat
45
+ purchases_flutter: ^9.9.9
46
+
47
+ # AdMob
48
+ # google_mobile_ads: ^5.3.0
49
+
50
+ # State Management
51
+ flutter_riverpod: ^3.0.3
52
+
53
+ # Date/Number Formatting
54
+ intl: ^0.20.2
55
+
56
+ # Storage & Utilities
57
+ shared_preferences: ^2.2.2
58
+ path_provider: ^2.1.2
59
+ uuid: ^4.3.3
60
+ device_info_plus: ^12.3.0
61
+ package_info_plus: ^9.0.0
62
+
63
+ # Social & Sharing
64
+ share_plus: ^12.0.1
65
+ image_picker: ^1.0.7
66
+
67
+ # UI Utilities
68
+ shimmer: ^3.0.0
69
+ flutter_svg: ^2.0.9
70
+ smooth_page_indicator: ^2.0.1
71
+ qr_flutter: ^4.1.0
72
+ gal: ^2.3.0
73
+ url_launcher: ^6.2.5
74
+ lottie: ^3.3.1
75
+ app_settings: ^7.0.0
76
+
77
+ dev_dependencies:
78
+ flutter_test:
79
+ sdk: flutter
80
+ flutter_launcher_icons: "^0.14.4"
81
+ flutter_lints: ^6.0.0
82
+
83
+
84
+
85
+ flutter:
86
+ uses-material-design: true
87
+ generate: true
88
+ assets:
89
+ - assets/images/
90
+ - assets/icons/
91
+ - assets/lottie/
92
+
93
+ flutter_launcher_icons:
94
+ android: "launcher_icon"
95
+ ios: true
96
+ image_path: "assets/icons/logo.png"
97
+ min_sdk_android: 16 # android min sdk min:16, default 21
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "mobile-app",
3
+ "displayName": "Mobile App",
4
+ "description": "Flutter cross-platform app with Firebase, Riverpod, and RevenueCat",
5
+ "icon": "📱",
6
+ "category": "app",
7
+ "order": 2,
8
+ "prompts": [
9
+ {
10
+ "name": "projectName",
11
+ "type": "text",
12
+ "message": "Project name?",
13
+ "placeholder": "my-app",
14
+ "validate": "^[a-z][a-z0-9-]*$",
15
+ "validateMessage": "Only lowercase letters, numbers, and hyphens (must start with a letter)"
16
+ }
17
+ ],
18
+ "derived": {
19
+ "projectNameSnake": "{{projectName | snakeCase}}",
20
+ "projectNamePascal": "{{projectName | pascalCase}}"
21
+ },
22
+ "target": {
23
+ "type": "standalone",
24
+ "dirName": "{{projectName}}"
25
+ },
26
+ "hooks": {
27
+ "postCreate": [
28
+ { "run": "flutter pub get" },
29
+ { "run": "git init" },
30
+ { "run": "git add ." }
31
+ ]
32
+ },
33
+ "upgrade": {
34
+ "merge": ["pubspec.yaml"],
35
+ "overwrite": ["analysis_options.yaml", "l10n.yaml", "lib/core/**", "lib/providers/**", "lib/models/**", "lib/widgets/**"],
36
+ "ignore": ["lib/screens/**", "lib/l10n/**", "assets/**", "test/**", "android/**", "ios/**"]
37
+ },
38
+ "nextSteps": [
39
+ "cd {{projectName}}",
40
+ "Run `flutterfire configure` to set up Firebase",
41
+ "flutter run"
42
+ ]
43
+ }
@@ -0,0 +1,4 @@
1
+ node_modules
2
+ dist
3
+ .DS_Store
4
+ *.local
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>{{projectName}}</title>
7
+ </head>
8
+ <body>
9
+ <div id="root"></div>
10
+ <script type="module" src="/src/main.tsx"></script>
11
+ </body>
12
+ </html>
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "{{projectName}}",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "tsc && vite build",
9
+ "preview": "vite preview",
10
+ "typecheck": "tsc --noEmit"
11
+ },
12
+ "dependencies": {
13
+ "react": "^18.3.1",
14
+ "react-dom": "^18.3.1"
15
+ },
16
+ "devDependencies": {
17
+ "@types/react": "^18.3.5",
18
+ "@types/react-dom": "^18.3.0",
19
+ "@vitejs/plugin-react": "^4.3.1",
20
+ "typescript": "^5.5.3",
21
+ "vite": "^5.4.2"
22
+ }
23
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "web-app",
3
+ "displayName": "Web App",
4
+ "description": "React + Vite + TypeScript",
5
+ "icon": "⚛️",
6
+ "category": "app",
7
+ "order": 1,
8
+ "prompts": [
9
+ {
10
+ "name": "projectName",
11
+ "type": "text",
12
+ "message": "Project name?",
13
+ "placeholder": "my-app",
14
+ "validate": "^[a-z0-9-]+$",
15
+ "validateMessage": "Only lowercase letters, numbers, and hyphens"
16
+ }
17
+ ],
18
+ "derived": {
19
+ "projectNamePascal": "{{projectName | pascalCase}}"
20
+ },
21
+ "target": {
22
+ "type": "standalone",
23
+ "dirName": "{{projectName}}"
24
+ },
25
+ "hooks": {
26
+ "postCreate": [
27
+ { "run": "bun install" },
28
+ { "run": "git init" },
29
+ { "run": "git add ." }
30
+ ]
31
+ },
32
+ "upgrade": {
33
+ "merge": ["package.json"],
34
+ "overwrite": ["tsconfig.json", "tsconfig.node.json", "vite.config.ts", "index.html"],
35
+ "ignore": ["src/**", "public/**"]
36
+ },
37
+ "nextSteps": [
38
+ "cd {{projectName}}",
39
+ "bun run dev"
40
+ ]
41
+ }
@@ -0,0 +1,6 @@
1
+ .app {
2
+ max-width: 800px;
3
+ margin: 0 auto;
4
+ padding: 2rem;
5
+ text-align: center;
6
+ }