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,344 @@
1
+ import 'package:flutter/material.dart';
2
+ import 'package:flutter_riverpod/flutter_riverpod.dart';
3
+ import 'package:cached_network_image/cached_network_image.dart';
4
+ import '../../providers/admin_provider.dart';
5
+ import '../../models/user_model.dart';
6
+ import '../../widgets/custom_app_bar.dart';
7
+ import 'admin_panel_user_details_screen.dart';
8
+
9
+ class AdminPanelUsersScreen extends ConsumerStatefulWidget {
10
+ const AdminPanelUsersScreen({super.key});
11
+
12
+ @override
13
+ ConsumerState<AdminPanelUsersScreen> createState() =>
14
+ _AdminPanelUsersScreenState();
15
+ }
16
+
17
+ class _AdminPanelUsersScreenState extends ConsumerState<AdminPanelUsersScreen> {
18
+ final TextEditingController _searchController = TextEditingController();
19
+ String _searchQuery = '';
20
+ bool _isSearching = false;
21
+
22
+ @override
23
+ void dispose() {
24
+ _searchController.dispose();
25
+ super.dispose();
26
+ }
27
+
28
+ void _performSearch() {
29
+ setState(() {
30
+ _searchQuery = _searchController.text.trim();
31
+ _isSearching = _searchQuery.isNotEmpty;
32
+ });
33
+ }
34
+
35
+ void _clearSearch() {
36
+ setState(() {
37
+ _searchController.clear();
38
+ _searchQuery = '';
39
+ _isSearching = false;
40
+ });
41
+ }
42
+
43
+ @override
44
+ Widget build(BuildContext context) {
45
+ final theme = Theme.of(context);
46
+
47
+ // Watch the appropriate provider based on search state
48
+ final usersAsync = _isSearching
49
+ ? ref.watch(searchUsersProvider(_searchQuery))
50
+ : ref.watch(allUsersProvider);
51
+
52
+ return Scaffold(
53
+ appBar: const CustomAppBar(title: 'User Management'),
54
+ body: Column(
55
+ children: [
56
+ // Search bar
57
+ Padding(
58
+ padding: const EdgeInsets.all(16.0),
59
+ child: TextField(
60
+ controller: _searchController,
61
+ decoration: InputDecoration(
62
+ hintText: 'Search by email, name, or UID',
63
+ prefixIcon: const Icon(Icons.search),
64
+ suffixIcon: _searchController.text.isNotEmpty
65
+ ? IconButton(
66
+ icon: const Icon(Icons.clear),
67
+ onPressed: _clearSearch,
68
+ )
69
+ : null,
70
+ border: OutlineInputBorder(
71
+ borderRadius: BorderRadius.circular(12),
72
+ ),
73
+ filled: true,
74
+ fillColor: theme.colorScheme.surface,
75
+ ),
76
+ onChanged: (value) {
77
+ // Auto-search on text change with slight delay
78
+ Future.delayed(const Duration(milliseconds: 500), () {
79
+ if (_searchController.text == value) {
80
+ _performSearch();
81
+ }
82
+ });
83
+ },
84
+ onSubmitted: (_) => _performSearch(),
85
+ ),
86
+ ),
87
+
88
+ // User list
89
+ Expanded(
90
+ child: usersAsync.when(
91
+ data: (users) {
92
+ if (users.isEmpty) {
93
+ return Center(
94
+ child: Column(
95
+ mainAxisAlignment: MainAxisAlignment.center,
96
+ children: [
97
+ Icon(
98
+ Icons.people_outline,
99
+ size: 64,
100
+ color: theme.colorScheme.outline,
101
+ ),
102
+ const SizedBox(height: 16),
103
+ Text(
104
+ _isSearching
105
+ ? 'No users found'
106
+ : 'No users available',
107
+ style: theme.textTheme.bodyLarge?.copyWith(
108
+ color: theme.colorScheme.outline,
109
+ ),
110
+ ),
111
+ ],
112
+ ),
113
+ );
114
+ }
115
+
116
+ return RefreshIndicator(
117
+ onRefresh: () async {
118
+ if (_isSearching) {
119
+ ref.invalidate(searchUsersProvider(_searchQuery));
120
+ } else {
121
+ ref.invalidate(allUsersProvider);
122
+ }
123
+ },
124
+ child: ListView.separated(
125
+ padding: const EdgeInsets.symmetric(horizontal: 16),
126
+ itemCount: users.length,
127
+ separatorBuilder: (context, index) =>
128
+ const SizedBox(height: 8),
129
+ itemBuilder: (context, index) {
130
+ final user = users[index];
131
+ return _buildUserCard(user, theme);
132
+ },
133
+ ),
134
+ );
135
+ },
136
+ loading: () => const Center(child: CircularProgressIndicator()),
137
+ error: (error, stack) => Center(
138
+ child: Padding(
139
+ padding: const EdgeInsets.all(24.0),
140
+ child: Column(
141
+ mainAxisAlignment: MainAxisAlignment.center,
142
+ children: [
143
+ Icon(
144
+ Icons.error_outline,
145
+ size: 64,
146
+ color: theme.colorScheme.error,
147
+ ),
148
+ const SizedBox(height: 16),
149
+ Text(
150
+ 'Error loading users',
151
+ style: theme.textTheme.titleMedium,
152
+ ),
153
+ const SizedBox(height: 8),
154
+ Text(
155
+ error.toString(),
156
+ style: theme.textTheme.bodySmall,
157
+ textAlign: TextAlign.center,
158
+ ),
159
+ const SizedBox(height: 16),
160
+ OutlinedButton(
161
+ onPressed: () {
162
+ if (_isSearching) {
163
+ ref.invalidate(searchUsersProvider(_searchQuery));
164
+ } else {
165
+ ref.invalidate(allUsersProvider);
166
+ }
167
+ },
168
+ child: const Text('Retry'),
169
+ ),
170
+ ],
171
+ ),
172
+ ),
173
+ ),
174
+ ),
175
+ ),
176
+ ],
177
+ ),
178
+ );
179
+ }
180
+
181
+ Widget _buildUserCard(UserModel user, ThemeData theme) {
182
+ return Card(
183
+ child: InkWell(
184
+ onTap: () {
185
+ Navigator.push(
186
+ context,
187
+ MaterialPageRoute(
188
+ builder: (context) => AdminPanelUserDetailsScreen(uid: user.uid),
189
+ ),
190
+ );
191
+ },
192
+ borderRadius: BorderRadius.circular(12),
193
+ child: Padding(
194
+ padding: const EdgeInsets.all(12.0),
195
+ child: Row(
196
+ children: [
197
+ // Avatar
198
+ CircleAvatar(
199
+ radius: 28,
200
+ backgroundColor: theme.colorScheme.primaryContainer,
201
+ backgroundImage: user.photoUrl != null
202
+ ? CachedNetworkImageProvider(user.photoUrl!)
203
+ : null,
204
+ child: user.photoUrl == null
205
+ ? Text(
206
+ _getInitials(user.displayName ?? 'U'),
207
+ style: TextStyle(
208
+ color: theme.colorScheme.onPrimaryContainer,
209
+ fontWeight: FontWeight.bold,
210
+ ),
211
+ )
212
+ : null,
213
+ ),
214
+ const SizedBox(width: 12),
215
+
216
+ // User info
217
+ Expanded(
218
+ child: Column(
219
+ crossAxisAlignment: CrossAxisAlignment.start,
220
+ children: [
221
+ Row(
222
+ children: [
223
+ Expanded(
224
+ child: Text(
225
+ user.displayName ?? 'No Name',
226
+ style: theme.textTheme.titleMedium?.copyWith(
227
+ fontWeight: FontWeight.w600,
228
+ ),
229
+ maxLines: 1,
230
+ overflow: TextOverflow.ellipsis,
231
+ ),
232
+ ),
233
+ // Badges
234
+ if (user.isAdmin)
235
+ Container(
236
+ padding: const EdgeInsets.symmetric(
237
+ horizontal: 8,
238
+ vertical: 2,
239
+ ),
240
+ decoration: BoxDecoration(
241
+ color: Colors.purple.withValues(alpha: 0.2),
242
+ borderRadius: BorderRadius.circular(4),
243
+ ),
244
+ child: const Text(
245
+ 'Admin',
246
+ style: TextStyle(
247
+ fontSize: 10,
248
+ color: Colors.purple,
249
+ fontWeight: FontWeight.bold,
250
+ ),
251
+ ),
252
+ ),
253
+ if (user.isPremium)
254
+ Container(
255
+ margin: const EdgeInsets.only(left: 4),
256
+ padding: const EdgeInsets.symmetric(
257
+ horizontal: 8,
258
+ vertical: 2,
259
+ ),
260
+ decoration: BoxDecoration(
261
+ color: Colors.amber.withValues(alpha: 0.2),
262
+ borderRadius: BorderRadius.circular(4),
263
+ ),
264
+ child: const Text(
265
+ 'Premium',
266
+ style: TextStyle(
267
+ fontSize: 10,
268
+ color: Colors.amber,
269
+ fontWeight: FontWeight.bold,
270
+ ),
271
+ ),
272
+ ),
273
+ ],
274
+ ),
275
+ const SizedBox(height: 4),
276
+ Text(
277
+ 'UID: ${_truncateUid(user.uid)}',
278
+ style: theme.textTheme.bodySmall?.copyWith(
279
+ color: theme.textTheme.bodySmall?.color?.withValues(
280
+ alpha: 0.7,
281
+ ),
282
+ ),
283
+ ),
284
+ const SizedBox(height: 4),
285
+ Row(
286
+ children: [
287
+ Icon(
288
+ user.isAnonymous
289
+ ? Icons.person_outline
290
+ : Icons.person,
291
+ size: 14,
292
+ color: theme.textTheme.bodySmall?.color?.withValues(
293
+ alpha: 0.5,
294
+ ),
295
+ ),
296
+ const SizedBox(width: 4),
297
+ Text(
298
+ user.isAnonymous ? 'Anonymous' : 'Registered',
299
+ style: theme.textTheme.bodySmall?.copyWith(
300
+ color:
301
+ theme.textTheme.bodySmall?.color?.withValues(
302
+ alpha: 0.7,
303
+ ),
304
+ ),
305
+ ),
306
+ if (user.countryCode != null) ...[
307
+ const SizedBox(width: 12),
308
+ Text(
309
+ user.countryCode!,
310
+ style: theme.textTheme.bodySmall?.copyWith(
311
+ color:
312
+ theme.textTheme.bodySmall?.color?.withValues(
313
+ alpha: 0.7,
314
+ ),
315
+ ),
316
+ ),
317
+ ],
318
+ ],
319
+ ),
320
+ ],
321
+ ),
322
+ ),
323
+
324
+ // Arrow icon
325
+ const Icon(Icons.chevron_right),
326
+ ],
327
+ ),
328
+ ),
329
+ ),
330
+ );
331
+ }
332
+
333
+ String _getInitials(String name) {
334
+ final parts = name.trim().split(' ');
335
+ if (parts.isEmpty) return 'U';
336
+ if (parts.length == 1) return parts[0][0].toUpperCase();
337
+ return '${parts[0][0]}${parts[1][0]}'.toUpperCase();
338
+ }
339
+
340
+ String _truncateUid(String uid) {
341
+ if (uid.length <= 12) return uid;
342
+ return '${uid.substring(0, 8)}...';
343
+ }
344
+ }
@@ -0,0 +1,266 @@
1
+ import 'package:flutter/material.dart';
2
+ import 'package:flutter_riverpod/flutter_riverpod.dart';
3
+ import 'package:flutter_svg/svg.dart';
4
+ import 'package:lottie/lottie.dart';
5
+ import '../../providers/auth_provider.dart';
6
+ import '../../widgets/top_notification.dart';
7
+ import '../../widgets/app_button.dart';
8
+ import '../../l10n/app_localizations.dart';
9
+ import 'login_screen.dart';
10
+ import 'register_screen.dart';
11
+
12
+ class AuthHomeScreen extends ConsumerStatefulWidget {
13
+ const AuthHomeScreen({super.key});
14
+
15
+ @override
16
+ ConsumerState<AuthHomeScreen> createState() => _AuthHomeScreenState();
17
+ }
18
+
19
+ class _AuthHomeScreenState extends ConsumerState<AuthHomeScreen> {
20
+ bool _isLoading = false;
21
+ final PageController _pageController = PageController();
22
+ int _currentPage = 0;
23
+
24
+ @override
25
+ void dispose() {
26
+ _pageController.dispose();
27
+ super.dispose();
28
+ }
29
+
30
+ Future<void> _handleAnonymousSignIn() async {
31
+ setState(() => _isLoading = true);
32
+
33
+ try {
34
+ await ref.read(authControllerProvider).signInAnonymously();
35
+
36
+ if (mounted) {
37
+ Navigator.of(context).pushReplacementNamed('/home');
38
+ }
39
+ } catch (e) {
40
+ if (mounted) {
41
+ TopNotification.showError(context, message: e.toString());
42
+ }
43
+ } finally {
44
+ if (mounted) {
45
+ setState(() => _isLoading = false);
46
+ }
47
+ }
48
+ }
49
+
50
+ @override
51
+ Widget build(BuildContext context) {
52
+ final theme = Theme.of(context);
53
+ final textTheme = theme.textTheme;
54
+ final colorScheme = theme.colorScheme;
55
+ final l10n = AppLocalizations.of(context)!;
56
+
57
+ return Scaffold(
58
+ backgroundColor: colorScheme.surface,
59
+ body: SafeArea(
60
+ child: SingleChildScrollView(
61
+ child: ConstrainedBox(
62
+ constraints: BoxConstraints(
63
+ minHeight:
64
+ MediaQuery.of(context).size.height -
65
+ MediaQuery.of(context).padding.top -
66
+ MediaQuery.of(context).padding.bottom,
67
+ ),
68
+ child: IntrinsicHeight(
69
+ child: Padding(
70
+ padding: const EdgeInsets.symmetric(horizontal: 24.0),
71
+ child: Column(
72
+ children: [
73
+ const SizedBox(height: 24),
74
+
75
+ // Logo/Title
76
+ SizedBox(
77
+ width: 80,
78
+ height: 80,
79
+ child: Padding(
80
+ padding: const EdgeInsets.all(16.0),
81
+ child: SvgPicture.asset(
82
+ theme.brightness == Brightness.dark
83
+ ? 'assets/icons/logo_dark.svg'
84
+ : 'assets/icons/logo_light.svg',
85
+ ),
86
+ ),
87
+ ),
88
+
89
+ const SizedBox(height: 16),
90
+
91
+ // Slider
92
+ SizedBox(
93
+ height: 400,
94
+ child: PageView(
95
+ controller: _pageController,
96
+ onPageChanged: (index) {
97
+ setState(() {
98
+ _currentPage = index;
99
+ });
100
+ },
101
+ children: [
102
+ _buildSlide(
103
+ colorScheme,
104
+ textTheme,
105
+ l10n.onboardingSlide1Title,
106
+ l10n.onboardingSlide1Description,
107
+ lottieAssetPath: 'assets/lottie/tick.json',
108
+ lottieWidth: 200,
109
+ lottieHeight: 200,
110
+ illustrationContainerHeight: 240,
111
+ ),
112
+ _buildSlide(
113
+ colorScheme,
114
+ textTheme,
115
+ l10n.onboardingSlide2Title,
116
+ l10n.onboardingSlide2Description,
117
+ lottieAssetPath: 'assets/lottie/tick.json',
118
+ lottieWidth: 200,
119
+ lottieHeight: 200,
120
+ illustrationContainerHeight: 240,
121
+ ),
122
+ _buildSlide(
123
+ colorScheme,
124
+ textTheme,
125
+ l10n.onboardingSlide3Title,
126
+ l10n.onboardingSlide3Description,
127
+ lottieAssetPath: 'assets/lottie/tick.json',
128
+ lottieWidth: 200,
129
+ lottieHeight: 200,
130
+ illustrationContainerHeight: 240,
131
+ ),
132
+ ],
133
+ ),
134
+ ),
135
+
136
+ const SizedBox(height: 20),
137
+
138
+ // Page indicators
139
+ Row(
140
+ mainAxisAlignment: MainAxisAlignment.center,
141
+ children: List.generate(3, (index) {
142
+ return Container(
143
+ margin: const EdgeInsets.symmetric(horizontal: 4),
144
+ width: index == _currentPage ? 10 : 8,
145
+ height: index == _currentPage ? 10 : 8,
146
+ decoration: BoxDecoration(
147
+ shape: BoxShape.circle,
148
+ color: index == _currentPage
149
+ ? colorScheme.primary
150
+ : colorScheme.onSurface.withValues(alpha: 0.2),
151
+ ),
152
+ );
153
+ }),
154
+ ),
155
+
156
+ const Spacer(),
157
+
158
+ // Sign Up Button
159
+ AppButton(
160
+ label: l10n.signUpForFree,
161
+ onPressed: _isLoading
162
+ ? null
163
+ : () {
164
+ Navigator.of(context).push(
165
+ MaterialPageRoute(
166
+ builder: (context) => const RegisterScreen(),
167
+ ),
168
+ );
169
+ },
170
+ isFullWidth: true,
171
+ variant: AppButtonVariant.primary,
172
+ isDisabled: _isLoading,
173
+ ),
174
+
175
+ const SizedBox(height: 16),
176
+
177
+ AppButton(
178
+ label: l10n.logIn,
179
+ onPressed: _isLoading
180
+ ? null
181
+ : () {
182
+ Navigator.of(context).push(
183
+ MaterialPageRoute(
184
+ builder: (context) => const LoginScreen(),
185
+ ),
186
+ );
187
+ },
188
+ variant: AppButtonVariant.outlined,
189
+ isFullWidth: true,
190
+ isDisabled: _isLoading,
191
+ ),
192
+
193
+ const SizedBox(height: 8),
194
+
195
+ AppButton(
196
+ label: l10n.continueWithoutAccount,
197
+ onPressed: _isLoading ? null : _handleAnonymousSignIn,
198
+ variant: AppButtonVariant.ghost,
199
+ isFullWidth: true,
200
+ isLoading: _isLoading,
201
+ isDisabled: _isLoading,
202
+ ),
203
+
204
+ const SizedBox(height: 24),
205
+ ],
206
+ ),
207
+ ),
208
+ ),
209
+ ),
210
+ ),
211
+ ),
212
+ );
213
+ }
214
+ }
215
+
216
+ Widget _buildSlide(
217
+ ColorScheme colorScheme,
218
+ TextTheme textTheme,
219
+ String title,
220
+ String description, {
221
+ required String lottieAssetPath,
222
+ required double lottieWidth,
223
+ required double lottieHeight,
224
+ required double illustrationContainerHeight,
225
+ }) {
226
+ return Column(
227
+ mainAxisAlignment: MainAxisAlignment.center,
228
+ children: [
229
+ // Illustration with Lottie
230
+ Container(
231
+ height: illustrationContainerHeight,
232
+ decoration: const BoxDecoration(),
233
+ child: Center(
234
+ child: Lottie.asset(
235
+ lottieAssetPath,
236
+ width: lottieWidth,
237
+ height: lottieHeight,
238
+ fit: BoxFit.contain,
239
+ ),
240
+ ),
241
+ ),
242
+ const SizedBox(height: 32),
243
+ // Title
244
+ Text(
245
+ title,
246
+ style: textTheme.headlineSmall?.copyWith(
247
+ fontWeight: FontWeight.w600,
248
+ color: colorScheme.onSurface,
249
+ ),
250
+ ),
251
+ const SizedBox(height: 12),
252
+ // Description
253
+ Padding(
254
+ padding: const EdgeInsets.symmetric(horizontal: 16.0),
255
+ child: Text(
256
+ description,
257
+ textAlign: TextAlign.center,
258
+ style: textTheme.bodyMedium?.copyWith(
259
+ color: colorScheme.onSurface.withValues(alpha: 0.7),
260
+ height: 1.5,
261
+ ),
262
+ ),
263
+ ),
264
+ ],
265
+ );
266
+ }