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,461 @@
1
+ import 'package:flutter/material.dart';
2
+ import 'package:flutter_riverpod/flutter_riverpod.dart';
3
+ import 'package:firebase_remote_config/firebase_remote_config.dart';
4
+ import '../../providers/remote_config_provider.dart';
5
+ import '../../widgets/top_notification.dart';
6
+
7
+ /// Quick test screen to verify Remote Config integration
8
+ /// This can be used during development to test different configurations
9
+ class RemoteConfigTestScreen extends ConsumerWidget {
10
+ const RemoteConfigTestScreen({super.key});
11
+
12
+ @override
13
+ Widget build(BuildContext context, WidgetRef ref) {
14
+ final remoteConfigService = ref.watch(remoteConfigServiceProvider);
15
+
16
+ return Scaffold(
17
+ appBar: AppBar(
18
+ title: const Text('Remote Config Test'),
19
+ actions: [
20
+ IconButton(
21
+ icon: const Icon(Icons.refresh),
22
+ tooltip: 'Refresh Config',
23
+ onPressed: () async {
24
+ TopNotification.showInfo(
25
+ context,
26
+ message: 'Refreshing config...',
27
+ );
28
+ final updated = await remoteConfigService.fetchConfig();
29
+ if (context.mounted) {
30
+ if (updated) {
31
+ TopNotification.showSuccess(
32
+ context,
33
+ message: '✓ Config updated',
34
+ );
35
+ } else {
36
+ TopNotification.showInfo(context, message: 'ℹ No changes');
37
+ }
38
+ }
39
+ },
40
+ ),
41
+ ],
42
+ ),
43
+ body: ListView(
44
+ padding: const EdgeInsets.all(16),
45
+ children: [
46
+ _buildTestCard(
47
+ context,
48
+ title: '🔧 Feature Flags Test',
49
+ description: 'Test authentication provider visibility',
50
+ child: _FeatureFlagsTest(),
51
+ ),
52
+ const SizedBox(height: 16),
53
+ _buildTestCard(
54
+ context,
55
+ title: '🚧 Maintenance Mode Test',
56
+ description: 'Test maintenance mode behavior',
57
+ child: _MaintenanceModeTest(),
58
+ ),
59
+ const SizedBox(height: 16),
60
+ _buildTestCard(
61
+ context,
62
+ title: '📱 Version Control Test',
63
+ description: 'Test version enforcement',
64
+ child: _VersionControlTest(),
65
+ ),
66
+ const SizedBox(height: 16),
67
+ _buildTestCard(
68
+ context,
69
+ title: '🎨 Custom Values Test',
70
+ description: 'Test retrieving custom config values',
71
+ child: _CustomValuesTest(),
72
+ ),
73
+ const SizedBox(height: 16),
74
+ _buildTestCard(
75
+ context,
76
+ title: '📊 Config Status',
77
+ description: 'View current config status',
78
+ child: _ConfigStatusInfo(),
79
+ ),
80
+ ],
81
+ ),
82
+ );
83
+ }
84
+
85
+ Widget _buildTestCard(
86
+ BuildContext context, {
87
+ required String title,
88
+ required String description,
89
+ required Widget child,
90
+ }) {
91
+ return Card(
92
+ elevation: 2,
93
+ child: Padding(
94
+ padding: const EdgeInsets.all(16),
95
+ child: Column(
96
+ crossAxisAlignment: CrossAxisAlignment.start,
97
+ children: [
98
+ Text(
99
+ title,
100
+ style: Theme.of(
101
+ context,
102
+ ).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.bold),
103
+ ),
104
+ const SizedBox(height: 4),
105
+ Text(
106
+ description,
107
+ style: Theme.of(
108
+ context,
109
+ ).textTheme.bodySmall?.copyWith(color: Colors.grey[600]),
110
+ ),
111
+ const SizedBox(height: 16),
112
+ child,
113
+ ],
114
+ ),
115
+ ),
116
+ );
117
+ }
118
+ }
119
+
120
+ class _FeatureFlagsTest extends ConsumerWidget {
121
+ @override
122
+ Widget build(BuildContext context, WidgetRef ref) {
123
+ final googleAuthEnabled = ref.watch(googleAuthEnabledProvider);
124
+ final appleAuthEnabled = ref.watch(appleAuthEnabledProvider);
125
+ final anonymousAuthEnabled = ref.watch(anonymousAuthEnabledProvider);
126
+
127
+ return Column(
128
+ children: [
129
+ _buildFlagRow('Google Auth', googleAuthEnabled),
130
+ _buildFlagRow('Apple Auth', appleAuthEnabled),
131
+ _buildFlagRow('Anonymous Auth', anonymousAuthEnabled),
132
+ const SizedBox(height: 8),
133
+ const Divider(),
134
+ const SizedBox(height: 8),
135
+ const Text(
136
+ '💡 These flags control which auth buttons appear on login screen',
137
+ style: TextStyle(fontSize: 12, fontStyle: FontStyle.italic),
138
+ ),
139
+ ],
140
+ );
141
+ }
142
+
143
+ Widget _buildFlagRow(String label, bool enabled) {
144
+ return Padding(
145
+ padding: const EdgeInsets.symmetric(vertical: 4),
146
+ child: Row(
147
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
148
+ children: [
149
+ Text(label),
150
+ Container(
151
+ padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
152
+ decoration: BoxDecoration(
153
+ color: enabled
154
+ ? Colors.green.withValues(alpha: 0.1)
155
+ : Colors.red.withValues(alpha: 0.1),
156
+ borderRadius: BorderRadius.circular(12),
157
+ border: Border.all(color: enabled ? Colors.green : Colors.red),
158
+ ),
159
+ child: Text(
160
+ enabled ? 'ENABLED' : 'DISABLED',
161
+ style: TextStyle(
162
+ color: enabled ? Colors.green : Colors.red,
163
+ fontWeight: FontWeight.bold,
164
+ fontSize: 12,
165
+ ),
166
+ ),
167
+ ),
168
+ ],
169
+ ),
170
+ );
171
+ }
172
+ }
173
+
174
+ class _MaintenanceModeTest extends ConsumerWidget {
175
+ @override
176
+ Widget build(BuildContext context, WidgetRef ref) {
177
+ final maintenanceMode = ref.watch(maintenanceModeProvider);
178
+
179
+ return Column(
180
+ crossAxisAlignment: CrossAxisAlignment.start,
181
+ children: [
182
+ Row(
183
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
184
+ children: [
185
+ const Text('Maintenance Mode'),
186
+ Switch(
187
+ value: maintenanceMode,
188
+ onChanged: null, // Read-only, controlled by Remote Config
189
+ activeTrackColor: Colors.orange,
190
+ ),
191
+ ],
192
+ ),
193
+ const SizedBox(height: 8),
194
+ if (maintenanceMode)
195
+ Container(
196
+ padding: const EdgeInsets.all(12),
197
+ decoration: BoxDecoration(
198
+ color: Colors.orange.withValues(alpha: 0.1),
199
+ borderRadius: BorderRadius.circular(8),
200
+ border: Border.all(color: Colors.orange),
201
+ ),
202
+ child: const Row(
203
+ children: [
204
+ Icon(Icons.warning, color: Colors.orange),
205
+ SizedBox(width: 8),
206
+ Expanded(
207
+ child: Text(
208
+ 'Maintenance mode is ACTIVE. Users would see maintenance screen.',
209
+ style: TextStyle(fontSize: 12),
210
+ ),
211
+ ),
212
+ ],
213
+ ),
214
+ )
215
+ else
216
+ Container(
217
+ padding: const EdgeInsets.all(12),
218
+ decoration: BoxDecoration(
219
+ color: Colors.green.withValues(alpha: 0.1),
220
+ borderRadius: BorderRadius.circular(8),
221
+ border: Border.all(color: Colors.green),
222
+ ),
223
+ child: const Row(
224
+ children: [
225
+ Icon(Icons.check_circle, color: Colors.green),
226
+ SizedBox(width: 8),
227
+ Expanded(
228
+ child: Text(
229
+ 'App is operating normally.',
230
+ style: TextStyle(fontSize: 12),
231
+ ),
232
+ ),
233
+ ],
234
+ ),
235
+ ),
236
+ ],
237
+ );
238
+ }
239
+ }
240
+
241
+ class _VersionControlTest extends ConsumerWidget {
242
+ @override
243
+ Widget build(BuildContext context, WidgetRef ref) {
244
+ final minimumVersion = ref.watch(minimumVersionProvider);
245
+ final forceUpdate = ref.watch(forceUpdateProvider);
246
+
247
+ return Column(
248
+ crossAxisAlignment: CrossAxisAlignment.start,
249
+ children: [
250
+ Row(
251
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
252
+ children: [
253
+ const Text('Minimum Version'),
254
+ Text(
255
+ minimumVersion,
256
+ style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
257
+ ),
258
+ ],
259
+ ),
260
+ const SizedBox(height: 8),
261
+ Row(
262
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
263
+ children: [
264
+ const Text('Force Update'),
265
+ Switch(
266
+ value: forceUpdate,
267
+ onChanged: null,
268
+ activeTrackColor: Colors.red,
269
+ ),
270
+ ],
271
+ ),
272
+ const SizedBox(height: 12),
273
+ Container(
274
+ padding: const EdgeInsets.all(12),
275
+ decoration: BoxDecoration(
276
+ color: Colors.blue.withValues(alpha: 0.1),
277
+ borderRadius: BorderRadius.circular(8),
278
+ border: Border.all(color: Colors.blue),
279
+ ),
280
+ child: const Column(
281
+ crossAxisAlignment: CrossAxisAlignment.start,
282
+ children: [
283
+ Text(
284
+ '💡 How it works:',
285
+ style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12),
286
+ ),
287
+ SizedBox(height: 4),
288
+ Text(
289
+ '• If app version < minimum version, show update screen\n'
290
+ '• If force_update is true, users cannot skip\n'
291
+ '• If force_update is false, update is optional',
292
+ style: TextStyle(fontSize: 11),
293
+ ),
294
+ ],
295
+ ),
296
+ ),
297
+ ],
298
+ );
299
+ }
300
+ }
301
+
302
+ class _CustomValuesTest extends ConsumerWidget {
303
+ @override
304
+ Widget build(BuildContext context, WidgetRef ref) {
305
+ final remoteConfig = ref.watch(remoteConfigServiceProvider);
306
+
307
+ // Example custom values (these need to be added in Firebase Console)
308
+ final showNewFeature = remoteConfig.getBool('show_new_feature');
309
+ final welcomeMessage = remoteConfig.getString('welcome_message');
310
+ final maxAttempts = remoteConfig.getInt('max_login_attempts');
311
+
312
+ return Column(
313
+ crossAxisAlignment: CrossAxisAlignment.start,
314
+ children: [
315
+ _buildCustomValueRow(
316
+ 'show_new_feature (bool)',
317
+ showNewFeature.toString(),
318
+ ),
319
+ _buildCustomValueRow(
320
+ 'welcome_message (string)',
321
+ welcomeMessage.isEmpty ? '(not set)' : welcomeMessage,
322
+ ),
323
+ _buildCustomValueRow(
324
+ 'max_login_attempts (int)',
325
+ maxAttempts.toString(),
326
+ ),
327
+ const SizedBox(height: 12),
328
+ Container(
329
+ padding: const EdgeInsets.all(12),
330
+ decoration: BoxDecoration(
331
+ color: Colors.purple.withValues(alpha: 0.1),
332
+ borderRadius: BorderRadius.circular(8),
333
+ border: Border.all(color: Colors.purple),
334
+ ),
335
+ child: const Column(
336
+ crossAxisAlignment: CrossAxisAlignment.start,
337
+ children: [
338
+ Text(
339
+ '📝 Add these in Firebase Console:',
340
+ style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12),
341
+ ),
342
+ SizedBox(height: 4),
343
+ Text(
344
+ '• show_new_feature (Boolean)\n'
345
+ '• welcome_message (String)\n'
346
+ '• max_login_attempts (Number)',
347
+ style: TextStyle(fontSize: 11),
348
+ ),
349
+ ],
350
+ ),
351
+ ),
352
+ ],
353
+ );
354
+ }
355
+
356
+ Widget _buildCustomValueRow(String label, String value) {
357
+ return Padding(
358
+ padding: const EdgeInsets.symmetric(vertical: 4),
359
+ child: Row(
360
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
361
+ children: [
362
+ Expanded(child: Text(label, style: const TextStyle(fontSize: 13))),
363
+ Text(
364
+ value,
365
+ style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 13),
366
+ ),
367
+ ],
368
+ ),
369
+ );
370
+ }
371
+ }
372
+
373
+ class _ConfigStatusInfo extends ConsumerWidget {
374
+ @override
375
+ Widget build(BuildContext context, WidgetRef ref) {
376
+ final remoteConfig = ref.watch(remoteConfigServiceProvider);
377
+ final lastFetchTime = remoteConfig.lastFetchTime;
378
+ final status = remoteConfig.lastFetchStatus;
379
+
380
+ final timeAgo = lastFetchTime.year == 1970
381
+ ? 'Never'
382
+ : _getTimeAgo(lastFetchTime);
383
+
384
+ return Column(
385
+ crossAxisAlignment: CrossAxisAlignment.start,
386
+ children: [
387
+ _buildInfoRow('Last Fetch', timeAgo),
388
+ _buildInfoRow('Fetch Status', _formatStatus(status)),
389
+ _buildInfoRow(
390
+ 'Total Parameters',
391
+ remoteConfig.getAllValues().length.toString(),
392
+ ),
393
+ const SizedBox(height: 12),
394
+ SizedBox(
395
+ width: double.infinity,
396
+ child: ElevatedButton.icon(
397
+ onPressed: () async {
398
+ TopNotification.showInfo(
399
+ context,
400
+ message: 'Force fetching (ignoring cache)...',
401
+ );
402
+ final updated = await remoteConfig.forceFetchConfig();
403
+ if (context.mounted) {
404
+ if (updated) {
405
+ TopNotification.showSuccess(
406
+ context,
407
+ message: '✓ Config force updated',
408
+ );
409
+ } else {
410
+ TopNotification.showInfo(context, message: 'ℹ No changes');
411
+ }
412
+ }
413
+ },
414
+ icon: const Icon(Icons.cloud_download),
415
+ label: const Text('Force Fetch Now'),
416
+ ),
417
+ ),
418
+ ],
419
+ );
420
+ }
421
+
422
+ Widget _buildInfoRow(String label, String value) {
423
+ return Padding(
424
+ padding: const EdgeInsets.symmetric(vertical: 4),
425
+ child: Row(
426
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
427
+ children: [
428
+ Text(label),
429
+ Text(value, style: const TextStyle(fontWeight: FontWeight.w500)),
430
+ ],
431
+ ),
432
+ );
433
+ }
434
+
435
+ String _formatStatus(RemoteConfigFetchStatus status) {
436
+ switch (status) {
437
+ case RemoteConfigFetchStatus.success:
438
+ return '✓ Success';
439
+ case RemoteConfigFetchStatus.failure:
440
+ return '✗ Failure';
441
+ case RemoteConfigFetchStatus.throttle:
442
+ return '⏱ Throttled';
443
+ case RemoteConfigFetchStatus.noFetchYet:
444
+ return 'Not Fetched';
445
+ }
446
+ }
447
+
448
+ String _getTimeAgo(DateTime time) {
449
+ final diff = DateTime.now().difference(time);
450
+
451
+ if (diff.inDays > 0) {
452
+ return '${diff.inDays}d ago';
453
+ } else if (diff.inHours > 0) {
454
+ return '${diff.inHours}h ago';
455
+ } else if (diff.inMinutes > 0) {
456
+ return '${diff.inMinutes}m ago';
457
+ } else {
458
+ return 'Just now';
459
+ }
460
+ }
461
+ }