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,270 @@
1
+ import 'package:firebase_auth/firebase_auth.dart';
2
+ import 'package:flutter/material.dart';
3
+ import 'package:flutter_riverpod/flutter_riverpod.dart';
4
+ import '../../l10n/app_localizations.dart';
5
+ import '../../providers/auth_provider.dart';
6
+ import '../../core/constants/app_constants.dart';
7
+ import '../../widgets/email_verification_banner.dart';
8
+ import '../../widgets/news_banner_widget.dart';
9
+
10
+ class HomeScreen extends ConsumerStatefulWidget {
11
+ const HomeScreen({super.key});
12
+
13
+ @override
14
+ ConsumerState<HomeScreen> createState() => _HomeScreenState();
15
+ }
16
+
17
+ class _HomeScreenState extends ConsumerState<HomeScreen> {
18
+ bool _showEmailVerificationBanner = false;
19
+
20
+ @override
21
+ Widget build(BuildContext context) {
22
+ final l10n = AppLocalizations.of(context)!;
23
+ final authState = ref.watch(authStateProvider);
24
+ final uid = authState.value?.uid;
25
+
26
+ // Check email verification status
27
+ final firebaseUser = FirebaseAuth.instance.currentUser;
28
+ final shouldShowEmailBanner =
29
+ firebaseUser != null &&
30
+ firebaseUser.isAnonymous != true &&
31
+ !firebaseUser.emailVerified &&
32
+ firebaseUser.email != null;
33
+
34
+ // Update banner state if needed
35
+ if (shouldShowEmailBanner != _showEmailVerificationBanner) {
36
+ WidgetsBinding.instance.addPostFrameCallback((_) {
37
+ if (mounted) {
38
+ setState(() {
39
+ _showEmailVerificationBanner = shouldShowEmailBanner;
40
+ });
41
+ }
42
+ });
43
+ }
44
+
45
+ return authState.when(
46
+ data: (user) {
47
+ if (user == null) {
48
+ return Center(child: Text(l10n.errorLoadingUser));
49
+ }
50
+
51
+ // Watch user profile to get display name and check if anonymous
52
+ if (uid != null) {
53
+ final userProfile = ref.watch(userProfileProvider(uid));
54
+
55
+ return userProfile.when(
56
+ data: (profile) {
57
+ final displayName = profile?.displayName;
58
+ final photoUrl = profile?.photoUrl;
59
+
60
+ return SingleChildScrollView(
61
+ child: Column(
62
+ children: [
63
+ // News Banner at the top
64
+ const NewsBannerWidget(),
65
+
66
+ // User info section
67
+ Padding(
68
+ padding: const EdgeInsets.symmetric(
69
+ horizontal: 16,
70
+ vertical: 8,
71
+ ),
72
+ child: Column(
73
+ mainAxisAlignment: MainAxisAlignment.center,
74
+ children: [
75
+ EmailVerificationBanner(
76
+ onDismiss: () {
77
+ setState(() {
78
+ _showEmailVerificationBanner = false;
79
+ });
80
+ },
81
+ onVerified: () {
82
+ setState(() {
83
+ _showEmailVerificationBanner = false;
84
+ });
85
+ },
86
+ ),
87
+ const SizedBox(height: 32),
88
+
89
+ // Welcome message with display name
90
+ // User Avatar
91
+ CircleAvatar(
92
+ radius: AppConstants.avatarSize,
93
+ backgroundColor: Theme.of(
94
+ context,
95
+ ).colorScheme.surface,
96
+ backgroundImage: photoUrl != null
97
+ ? NetworkImage(photoUrl)
98
+ : null,
99
+ child: photoUrl == null
100
+ ? Icon(
101
+ Icons.person,
102
+ size: AppConstants.avatarSize,
103
+ color: Theme.of(
104
+ context,
105
+ ).colorScheme.onSurface,
106
+ )
107
+ : null,
108
+ ),
109
+ const SizedBox(height: 32),
110
+
111
+ Text(
112
+ l10n.welcome,
113
+ style: Theme.of(context).textTheme.headlineMedium,
114
+ ),
115
+ const SizedBox(height: 16),
116
+ if (displayName != null &&
117
+ displayName.isNotEmpty) ...[
118
+ Text(
119
+ displayName,
120
+ style: Theme.of(context).textTheme.headlineSmall
121
+ ?.copyWith(
122
+ fontWeight: FontWeight.bold,
123
+ color: Theme.of(context).primaryColor,
124
+ ),
125
+ ),
126
+ ] else ...[
127
+ Text(
128
+ user.email ?? l10n.guest,
129
+ style: Theme.of(context).textTheme.bodyLarge
130
+ ?.copyWith(
131
+ color: Theme.of(context)
132
+ .colorScheme
133
+ .onSurface
134
+ .withValues(alpha: 0.7),
135
+ ),
136
+ ),
137
+ ],
138
+ // User ID display
139
+ Container(
140
+ padding: const EdgeInsets.symmetric(
141
+ horizontal: 16,
142
+ vertical: 8,
143
+ ),
144
+ decoration: BoxDecoration(
145
+ color: Theme.of(
146
+ context,
147
+ ).colorScheme.surfaceContainerHighest,
148
+ borderRadius: BorderRadius.circular(12),
149
+ ),
150
+ child: Row(
151
+ mainAxisSize: MainAxisSize.min,
152
+ children: [
153
+ Icon(
154
+ Icons.fingerprint,
155
+ color: Theme.of(
156
+ context,
157
+ ).colorScheme.onSurfaceVariant,
158
+ size: 20,
159
+ ),
160
+ const SizedBox(width: 8),
161
+ Text(
162
+ 'ID: ${uid.substring(0, 8)}...',
163
+ style: TextStyle(
164
+ fontSize: 12,
165
+ fontFamily: 'monospace',
166
+ color: Theme.of(
167
+ context,
168
+ ).colorScheme.onSurfaceVariant,
169
+ ),
170
+ ),
171
+ ],
172
+ ),
173
+ ),
174
+ const SizedBox(height: 16),
175
+ Container(
176
+ padding: const EdgeInsets.symmetric(
177
+ horizontal: 24,
178
+ vertical: 12,
179
+ ),
180
+ decoration: BoxDecoration(
181
+ color: Colors.green.withValues(alpha: 0.1),
182
+ borderRadius: BorderRadius.circular(24),
183
+ border: Border.all(color: Colors.green, width: 2),
184
+ ),
185
+ child: Row(
186
+ mainAxisSize: MainAxisSize.min,
187
+ children: [
188
+ const Icon(
189
+ Icons.check_circle,
190
+ color: Colors.green,
191
+ size: 24,
192
+ ),
193
+ const SizedBox(width: 12),
194
+ Text(
195
+ l10n.youAreLoggedIn,
196
+ style: const TextStyle(
197
+ fontSize: 16,
198
+ fontWeight: FontWeight.w600,
199
+ color: Colors.green,
200
+ ),
201
+ ),
202
+ ],
203
+ ),
204
+ ),
205
+ ],
206
+ ),
207
+ ),
208
+ ],
209
+ ),
210
+ );
211
+ },
212
+ loading: () => const Center(child: CircularProgressIndicator()),
213
+ error: (error, stack) {
214
+ // Show fallback UI for users without profile documents
215
+ return SingleChildScrollView(
216
+ child: Column(
217
+ children: [
218
+ // News Banner at the top
219
+ const NewsBannerWidget(),
220
+
221
+ // User info section
222
+ Padding(
223
+ padding: const EdgeInsets.symmetric(vertical: 32.0),
224
+ child: Column(
225
+ mainAxisAlignment: MainAxisAlignment.center,
226
+ children: [
227
+ CircleAvatar(
228
+ radius: AppConstants.avatarSize,
229
+ backgroundColor: Theme.of(
230
+ context,
231
+ ).colorScheme.surface,
232
+ child: Icon(
233
+ Icons.person,
234
+ size: AppConstants.avatarSize,
235
+ color: Theme.of(context).colorScheme.onSurface,
236
+ ),
237
+ ),
238
+ const SizedBox(height: 32),
239
+ Text(
240
+ l10n.welcome,
241
+ style: Theme.of(context).textTheme.headlineMedium,
242
+ ),
243
+ const SizedBox(height: 16),
244
+ Text(
245
+ user.email ?? l10n.guest,
246
+ style: Theme.of(context).textTheme.bodyLarge
247
+ ?.copyWith(
248
+ color: Theme.of(context).colorScheme.onSurface
249
+ .withValues(alpha: 0.7),
250
+ ),
251
+ ),
252
+ ],
253
+ ),
254
+ ),
255
+ ],
256
+ ),
257
+ );
258
+ },
259
+ );
260
+ }
261
+
262
+ // Fallback if no uid
263
+ return Center(child: Text(l10n.errorLoadingUser));
264
+ },
265
+ loading: () => const Center(child: CircularProgressIndicator()),
266
+ error: (error, stack) =>
267
+ Center(child: Text(l10n.error(error.toString()))),
268
+ );
269
+ }
270
+ }
@@ -0,0 +1,63 @@
1
+ import 'package:flutter/material.dart';
2
+ import '../../l10n/app_localizations.dart';
3
+ import '../../widgets/custom_app_bar.dart';
4
+
5
+ class PrivacyPolicyScreen extends StatelessWidget {
6
+ const PrivacyPolicyScreen({super.key});
7
+
8
+ @override
9
+ Widget build(BuildContext context) {
10
+ final l10n = AppLocalizations.of(context)!;
11
+
12
+ return Scaffold(
13
+ appBar: CustomAppBar(title: l10n.privacyPolicy),
14
+ body: SingleChildScrollView(
15
+ padding: const EdgeInsets.all(16.0),
16
+ child: Column(
17
+ crossAxisAlignment: CrossAxisAlignment.start,
18
+ children: [
19
+ Text(
20
+ l10n.privacyPolicy,
21
+ style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
22
+ ),
23
+ const SizedBox(height: 8),
24
+ Text(
25
+ l10n.lastUpdated('February 1, 2026'),
26
+ style: TextStyle(
27
+ fontSize: 12,
28
+ color: Theme.of(context).textTheme.bodySmall?.color,
29
+ ),
30
+ ),
31
+ const SizedBox(height: 24),
32
+ _buildSection(
33
+ l10n.informationWeCollect,
34
+ l10n.privacyInfoCollectText,
35
+ ),
36
+ const SizedBox(height: 16),
37
+ _buildSection(l10n.howWeUseInfo, l10n.privacyHowWeUseText),
38
+ const SizedBox(height: 16),
39
+ _buildSection(l10n.dataSecurity, l10n.privacyDataSecurityText),
40
+ const SizedBox(height: 16),
41
+ _buildSection(l10n.yourRights, l10n.privacyYourRightsText),
42
+ const SizedBox(height: 16),
43
+ _buildSection(l10n.contactUs, l10n.privacyContactText),
44
+ ],
45
+ ),
46
+ ),
47
+ );
48
+ }
49
+
50
+ Widget _buildSection(String title, String content) {
51
+ return Column(
52
+ crossAxisAlignment: CrossAxisAlignment.start,
53
+ children: [
54
+ Text(
55
+ title,
56
+ style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
57
+ ),
58
+ const SizedBox(height: 8),
59
+ Text(content, style: const TextStyle(fontSize: 14, height: 1.5)),
60
+ ],
61
+ );
62
+ }
63
+ }
@@ -0,0 +1,82 @@
1
+ import 'package:flutter/material.dart';
2
+ import '../../l10n/app_localizations.dart';
3
+ import '../../widgets/custom_app_bar.dart';
4
+
5
+ class TermsScreen extends StatelessWidget {
6
+ const TermsScreen({super.key});
7
+
8
+ @override
9
+ Widget build(BuildContext context) {
10
+ final l10n = AppLocalizations.of(context)!;
11
+
12
+ return Scaffold(
13
+ appBar: CustomAppBar(title: l10n.termsAndConditions),
14
+ body: SingleChildScrollView(
15
+ padding: const EdgeInsets.all(16.0),
16
+ child: Column(
17
+ crossAxisAlignment: CrossAxisAlignment.start,
18
+ children: [
19
+ Text(
20
+ l10n.termsAndConditions,
21
+ style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
22
+ ),
23
+ const SizedBox(height: 8),
24
+ Text(
25
+ l10n.lastUpdated('February 1, 2026'),
26
+ style: TextStyle(
27
+ fontSize: 12,
28
+ color: Theme.of(context).textTheme.bodySmall?.color,
29
+ ),
30
+ ),
31
+ const SizedBox(height: 24),
32
+ _buildSection(l10n.acceptanceOfTerms, l10n.termsAcceptanceText),
33
+ const SizedBox(height: 16),
34
+ _buildSection(l10n.useOfService, l10n.termsUseOfServiceText),
35
+ const SizedBox(height: 16),
36
+ _buildSection(
37
+ l10n.userResponsibilities,
38
+ l10n.termsUserResponsibilitiesText,
39
+ ),
40
+ const SizedBox(height: 16),
41
+ _buildSection(
42
+ l10n.intellectualProperty,
43
+ l10n.termsIntellectualPropertyText,
44
+ ),
45
+ const SizedBox(height: 24),
46
+ _buildSection(l10n.acceptanceOfTerms, l10n.termsAcceptanceText),
47
+ const SizedBox(height: 16),
48
+ _buildSection(l10n.useOfService, l10n.termsUseOfServiceText),
49
+ const SizedBox(height: 16),
50
+ _buildSection(
51
+ l10n.userResponsibilities,
52
+ l10n.termsUserResponsibilitiesText,
53
+ ),
54
+ const SizedBox(height: 16),
55
+ _buildSection(
56
+ l10n.intellectualProperty,
57
+ l10n.termsIntellectualPropertyText,
58
+ ),
59
+ const SizedBox(height: 16),
60
+ _buildSection(l10n.termination, l10n.termsTerminationText),
61
+ const SizedBox(height: 16),
62
+ _buildSection(l10n.contactUs, l10n.termsContactText),
63
+ ],
64
+ ),
65
+ ),
66
+ );
67
+ }
68
+
69
+ Widget _buildSection(String title, String content) {
70
+ return Column(
71
+ crossAxisAlignment: CrossAxisAlignment.start,
72
+ children: [
73
+ Text(
74
+ title,
75
+ style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
76
+ ),
77
+ const SizedBox(height: 8),
78
+ Text(content, style: const TextStyle(fontSize: 14, height: 1.5)),
79
+ ],
80
+ );
81
+ }
82
+ }
@@ -0,0 +1,85 @@
1
+ import 'package:flutter/material.dart';
2
+ import 'home/home_screen.dart';
3
+ import 'settings/settings_screen.dart';
4
+ import '../widgets/empty_screen.dart';
5
+ import '../widgets/app_drawer.dart';
6
+ import '../l10n/app_localizations.dart';
7
+
8
+ class MainNavigationScreen extends StatefulWidget {
9
+ const MainNavigationScreen({super.key});
10
+
11
+ @override
12
+ State<MainNavigationScreen> createState() => _MainNavigationScreenState();
13
+ }
14
+
15
+ class _MainNavigationScreenState extends State<MainNavigationScreen> {
16
+ int _currentIndex = 0;
17
+
18
+ List<Widget> _getScreens(BuildContext context) {
19
+ final l10n = AppLocalizations.of(context)!;
20
+ return [
21
+ const HomeScreen(),
22
+ EmptyScreen(title: l10n.explore),
23
+ EmptyScreen(title: l10n.activity),
24
+ const SettingsScreen(),
25
+ ];
26
+ }
27
+
28
+ String _getAppBarTitle(BuildContext context) {
29
+ final l10n = AppLocalizations.of(context)!;
30
+ switch (_currentIndex) {
31
+ case 0:
32
+ return l10n.home;
33
+ case 1:
34
+ return l10n.explore;
35
+ case 2:
36
+ return l10n.activity;
37
+ case 3:
38
+ return l10n.settings;
39
+ default:
40
+ return l10n.home;
41
+ }
42
+ }
43
+
44
+ @override
45
+ Widget build(BuildContext context) {
46
+ final l10n = AppLocalizations.of(context)!;
47
+ final screens = _getScreens(context);
48
+
49
+ return Scaffold(
50
+ appBar: AppBar(title: Text(_getAppBarTitle(context)), centerTitle: true),
51
+ drawer: const AppDrawer(),
52
+ body: IndexedStack(index: _currentIndex, children: screens),
53
+ bottomNavigationBar: NavigationBar(
54
+ selectedIndex: _currentIndex,
55
+ onDestinationSelected: (int index) {
56
+ setState(() {
57
+ _currentIndex = index;
58
+ });
59
+ },
60
+ destinations: [
61
+ NavigationDestination(
62
+ icon: const Icon(Icons.home_outlined),
63
+ selectedIcon: const Icon(Icons.home),
64
+ label: l10n.home,
65
+ ),
66
+ NavigationDestination(
67
+ icon: const Icon(Icons.explore_outlined),
68
+ selectedIcon: const Icon(Icons.explore),
69
+ label: l10n.explore,
70
+ ),
71
+ NavigationDestination(
72
+ icon: const Icon(Icons.notifications_outlined),
73
+ selectedIcon: const Icon(Icons.notifications),
74
+ label: l10n.activity,
75
+ ),
76
+ NavigationDestination(
77
+ icon: const Icon(Icons.settings_outlined),
78
+ selectedIcon: const Icon(Icons.settings),
79
+ label: l10n.settings,
80
+ ),
81
+ ],
82
+ ),
83
+ );
84
+ }
85
+ }