biucingcli 0.9.1__py3-none-any.whl

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 (269) hide show
  1. biucingcli/__init__.py +5 -0
  2. biucingcli/cli.py +849 -0
  3. biucingcli/template_data/android/template/.editorconfig +9 -0
  4. biucingcli/template_data/android/template/.gitignore +26 -0
  5. biucingcli/template_data/android/template/.mise.toml +3 -0
  6. biucingcli/template_data/android/template/Brewfile +6 -0
  7. biucingcli/template_data/android/template/Makefile +103 -0
  8. biucingcli/template_data/android/template/README.md +163 -0
  9. biucingcli/template_data/android/template/app/build.gradle.kts +178 -0
  10. biucingcli/template_data/android/template/app/proguard-rules.pro +1 -0
  11. biucingcli/template_data/android/template/app/src/androidTest/java/app/HomeRouteUiTest.kt +21 -0
  12. biucingcli/template_data/android/template/app/src/main/AndroidManifest.xml +18 -0
  13. biucingcli/template_data/android/template/app/src/main/java/app/MainActivity.kt +36 -0
  14. biucingcli/template_data/android/template/app/src/main/res/values/strings.xml +4 -0
  15. biucingcli/template_data/android/template/app/src/main/res/values/themes.xml +8 -0
  16. biucingcli/template_data/android/template/app/src/test/java/app/AppSmokeTest.kt +19 -0
  17. biucingcli/template_data/android/template/build.gradle.kts +27 -0
  18. biucingcli/template_data/android/template/core/designsystem/build.gradle.kts +33 -0
  19. biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/Components.kt +75 -0
  20. biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/DesignTokens.kt +23 -0
  21. biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/Theme.kt +110 -0
  22. biucingcli/template_data/android/template/core/model/build.gradle.kts +26 -0
  23. biucingcli/template_data/android/template/core/model/src/main/java/model/Greeting.kt +6 -0
  24. biucingcli/template_data/android/template/core/model/src/test/java/model/GreetingTest.kt +16 -0
  25. biucingcli/template_data/android/template/core/network/build.gradle.kts +26 -0
  26. biucingcli/template_data/android/template/core/network/src/main/java/network/AppEnvironment.kt +17 -0
  27. biucingcli/template_data/android/template/core/testing/build.gradle.kts +27 -0
  28. biucingcli/template_data/android/template/core/testing/src/main/java/testing/FakeAppEnvironmentProvider.kt +13 -0
  29. biucingcli/template_data/android/template/docs/release-delivery.md +68 -0
  30. biucingcli/template_data/android/template/docs/release-signing.properties.example +20 -0
  31. biucingcli/template_data/android/template/fastlane/.env.example +22 -0
  32. biucingcli/template_data/android/template/fastlane/Appfile +1 -0
  33. biucingcli/template_data/android/template/fastlane/Fastfile +121 -0
  34. biucingcli/template_data/android/template/feature/home/build.gradle.kts +35 -0
  35. biucingcli/template_data/android/template/feature/home/src/main/java/home/HomeRoute.kt +38 -0
  36. biucingcli/template_data/android/template/feature/settings/build.gradle.kts +34 -0
  37. biucingcli/template_data/android/template/feature/settings/src/main/java/settings/SettingsRoute.kt +35 -0
  38. biucingcli/template_data/android/template/gradle/libs.versions.toml +35 -0
  39. biucingcli/template_data/android/template/gradle/verification-metadata.xml +3462 -0
  40. biucingcli/template_data/android/template/gradle/wrapper/gradle-wrapper.jar +0 -0
  41. biucingcli/template_data/android/template/gradle/wrapper/gradle-wrapper.jar.sha256 +1 -0
  42. biucingcli/template_data/android/template/gradle/wrapper/gradle-wrapper.properties +10 -0
  43. biucingcli/template_data/android/template/gradle.properties +4 -0
  44. biucingcli/template_data/android/template/gradlew +252 -0
  45. biucingcli/template_data/android/template/gradlew.bat +94 -0
  46. biucingcli/template_data/android/template/scripts/artifact-info +11 -0
  47. biucingcli/template_data/android/template/scripts/bootstrap +17 -0
  48. biucingcli/template_data/android/template/scripts/doctor +133 -0
  49. biucingcli/template_data/android/template/scripts/setup-android-sdk +23 -0
  50. biucingcli/template_data/android/template/scripts/sync-gradle-wrapper +19 -0
  51. biucingcli/template_data/android/template/scripts/verify-gradle-supply-chain +61 -0
  52. biucingcli/template_data/android/template/scripts/verify-release-artifact +104 -0
  53. biucingcli/template_data/android/template/settings.gradle.kts +25 -0
  54. biucingcli/template_data/android/template.json +146 -0
  55. biucingcli/template_data/apple/template/.gitignore +28 -0
  56. biucingcli/template_data/apple/template/.mise.toml +4 -0
  57. biucingcli/template_data/apple/template/.swiftformat +10 -0
  58. biucingcli/template_data/apple/template/.swiftlint.yml +33 -0
  59. biucingcli/template_data/apple/template/App/Config/ProjectDescriptionHelpers/Module.swift +6 -0
  60. biucingcli/template_data/apple/template/App/Config/XCConfig/Base.xcconfig +4 -0
  61. biucingcli/template_data/apple/template/App/Project.swift +66 -0
  62. biucingcli/template_data/apple/template/App/Targets/App/Resources/.gitkeep +1 -0
  63. biucingcli/template_data/apple/template/App/Targets/App/Sources/AppEntry.swift +9 -0
  64. biucingcli/template_data/apple/template/App/Targets/App/Sources/HomeView.swift +18 -0
  65. biucingcli/template_data/apple/template/App/Targets/App/Sources/HomeViewModel.swift +38 -0
  66. biucingcli/template_data/apple/template/App/Targets/AppTests/Sources/AppTests.swift +59 -0
  67. biucingcli/template_data/apple/template/Brewfile +8 -0
  68. biucingcli/template_data/apple/template/Makefile +128 -0
  69. biucingcli/template_data/apple/template/Packages/AppServices/Package.swift +20 -0
  70. biucingcli/template_data/apple/template/Packages/AppServices/Sources/AppServices/StarterMetadata.swift +52 -0
  71. biucingcli/template_data/apple/template/Packages/DesignSystem/Package.swift +20 -0
  72. biucingcli/template_data/apple/template/Packages/DesignSystem/Sources/DesignSystem/Theme.swift +8 -0
  73. biucingcli/template_data/apple/template/README.md +133 -0
  74. biucingcli/template_data/apple/template/Tuist.swift +8 -0
  75. biucingcli/template_data/apple/template/Workspace.swift +11 -0
  76. biucingcli/template_data/apple/template/docs/release-delivery.md +55 -0
  77. biucingcli/template_data/apple/template/fastlane/.env.example +20 -0
  78. biucingcli/template_data/apple/template/fastlane/Appfile +3 -0
  79. biucingcli/template_data/apple/template/fastlane/Fastfile +126 -0
  80. biucingcli/template_data/apple/template/fastlane/Matchfile +7 -0
  81. biucingcli/template_data/apple/template/scripts/bootstrap +9 -0
  82. biucingcli/template_data/apple/template/scripts/doctor +163 -0
  83. biucingcli/template_data/apple/template/scripts/setup-xcode +6 -0
  84. biucingcli/template_data/apple/template/scripts/test-destination +42 -0
  85. biucingcli/template_data/apple/template/scripts/verify-release-identity +88 -0
  86. biucingcli/template_data/apple/template.json +110 -0
  87. biucingcli/template_data/frontend/template/.dockerignore +8 -0
  88. biucingcli/template_data/frontend/template/.env.example +1 -0
  89. biucingcli/template_data/frontend/template/.gitignore +7 -0
  90. biucingcli/template_data/frontend/template/.npmrc +1 -0
  91. biucingcli/template_data/frontend/template/.prettierignore +2 -0
  92. biucingcli/template_data/frontend/template/.prettierrc.json +4 -0
  93. biucingcli/template_data/frontend/template/Dockerfile +25 -0
  94. biucingcli/template_data/frontend/template/Dockerfile.dev +35 -0
  95. biucingcli/template_data/frontend/template/Dockerfile.dev.full +40 -0
  96. biucingcli/template_data/frontend/template/Makefile +137 -0
  97. biucingcli/template_data/frontend/template/README.md +146 -0
  98. biucingcli/template_data/frontend/template/compose.dev.yaml +29 -0
  99. biucingcli/template_data/frontend/template/eslint.config.js +27 -0
  100. biucingcli/template_data/frontend/template/index.html +12 -0
  101. biucingcli/template_data/frontend/template/nginx.conf +11 -0
  102. biucingcli/template_data/frontend/template/package.json +50 -0
  103. biucingcli/template_data/frontend/template/playwright.production.config.ts +21 -0
  104. biucingcli/template_data/frontend/template/playwright.smoke.config.ts +19 -0
  105. biucingcli/template_data/frontend/template/pnpm-lock.yaml +4054 -0
  106. biucingcli/template_data/frontend/template/public/.gitkeep +1 -0
  107. biucingcli/template_data/frontend/template/scripts/browser-smoke-production +55 -0
  108. biucingcli/template_data/frontend/template/scripts/doctor +46 -0
  109. biucingcli/template_data/frontend/template/src/App.test.tsx +18 -0
  110. biucingcli/template_data/frontend/template/src/App.tsx +5 -0
  111. biucingcli/template_data/frontend/template/src/components/MetricCard.tsx +14 -0
  112. biucingcli/template_data/frontend/template/src/components/TaskPanel.tsx +32 -0
  113. biucingcli/template_data/frontend/template/src/config/env.ts +3 -0
  114. biucingcli/template_data/frontend/template/src/hooks/useProjectOverview.ts +24 -0
  115. biucingcli/template_data/frontend/template/src/index.css +208 -0
  116. biucingcli/template_data/frontend/template/src/main.tsx +11 -0
  117. biucingcli/template_data/frontend/template/src/pages/HomePage.tsx +60 -0
  118. biucingcli/template_data/frontend/template/src/router/AppRouter.tsx +14 -0
  119. biucingcli/template_data/frontend/template/src/services/api/client.ts +33 -0
  120. biucingcli/template_data/frontend/template/src/services/projectOverview.ts +39 -0
  121. biucingcli/template_data/frontend/template/src/test/setup.ts +1 -0
  122. biucingcli/template_data/frontend/template/src/types/projectOverview.ts +22 -0
  123. biucingcli/template_data/frontend/template/src/vite-env.d.ts +9 -0
  124. biucingcli/template_data/frontend/template/tests/browser-smoke.spec.ts +16 -0
  125. biucingcli/template_data/frontend/template/tests/production-browser-smoke.spec.ts +22 -0
  126. biucingcli/template_data/frontend/template/tsconfig.json +21 -0
  127. biucingcli/template_data/frontend/template/vite.config.ts +12 -0
  128. biucingcli/template_data/frontend/template.json +81 -0
  129. biucingcli/template_data/harmonyos/template/.gitignore +21 -0
  130. biucingcli/template_data/harmonyos/template/.mise.toml +2 -0
  131. biucingcli/template_data/harmonyos/template/AppScope/app.json5 +10 -0
  132. biucingcli/template_data/harmonyos/template/AppScope/resources/base/element/string.json +8 -0
  133. biucingcli/template_data/harmonyos/template/AppScope/resources/base/media/background.svg +3 -0
  134. biucingcli/template_data/harmonyos/template/AppScope/resources/base/media/foreground.svg +4 -0
  135. biucingcli/template_data/harmonyos/template/AppScope/resources/base/media/layered_image.json +6 -0
  136. biucingcli/template_data/harmonyos/template/Makefile +106 -0
  137. biucingcli/template_data/harmonyos/template/README.md +152 -0
  138. biucingcli/template_data/harmonyos/template/build-profile.json5 +36 -0
  139. biucingcli/template_data/harmonyos/template/code-linter.json5 +12 -0
  140. biucingcli/template_data/harmonyos/template/docs/release-signing.local.properties.example +14 -0
  141. biucingcli/template_data/harmonyos/template/entry/build-profile.json5 +9 -0
  142. biucingcli/template_data/harmonyos/template/entry/hvigorfile.ts +6 -0
  143. biucingcli/template_data/harmonyos/template/entry/oh-package.json5 +9 -0
  144. biucingcli/template_data/harmonyos/template/entry/src/main/ets/core/config/AppConfig.ets +10 -0
  145. biucingcli/template_data/harmonyos/template/entry/src/main/ets/core/designsystem/Tokens.ets +28 -0
  146. biucingcli/template_data/harmonyos/template/entry/src/main/ets/entryability/EntryAbility.ets +29 -0
  147. biucingcli/template_data/harmonyos/template/entry/src/main/ets/pages/Index.ets +47 -0
  148. biucingcli/template_data/harmonyos/template/entry/src/main/ets/pages/Settings.ets +96 -0
  149. biucingcli/template_data/harmonyos/template/entry/src/main/module.json5 +34 -0
  150. biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/element/color.json +24 -0
  151. biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/element/string.json +12 -0
  152. biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/media/app_icon.svg +5 -0
  153. biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/profile/main_pages.json +6 -0
  154. biucingcli/template_data/harmonyos/template/entry/src/test/List.test.ets +11 -0
  155. biucingcli/template_data/harmonyos/template/hvigor/hvigor-config.json5 +8 -0
  156. biucingcli/template_data/harmonyos/template/hvigorfile.ts +6 -0
  157. biucingcli/template_data/harmonyos/template/oh-package-lock.json5 +19 -0
  158. biucingcli/template_data/harmonyos/template/oh-package.json5 +13 -0
  159. biucingcli/template_data/harmonyos/template/scripts/artifact-info +31 -0
  160. biucingcli/template_data/harmonyos/template/scripts/bootstrap +38 -0
  161. biucingcli/template_data/harmonyos/template/scripts/doctor +147 -0
  162. biucingcli/template_data/harmonyos/template/scripts/lint +105 -0
  163. biucingcli/template_data/harmonyos/template/scripts/release-build +199 -0
  164. biucingcli/template_data/harmonyos/template/scripts/release-preflight +109 -0
  165. biucingcli/template_data/harmonyos/template/scripts/test +28 -0
  166. biucingcli/template_data/harmonyos/template/scripts/verify-release-artifact +173 -0
  167. biucingcli/template_data/harmonyos/template/scripts/verify-supply-chain +70 -0
  168. biucingcli/template_data/harmonyos/template.json +134 -0
  169. biucingcli/template_data/microservice/template/.air.toml +11 -0
  170. biucingcli/template_data/microservice/template/.dockerignore +5 -0
  171. biucingcli/template_data/microservice/template/.gitignore +4 -0
  172. biucingcli/template_data/microservice/template/.mise.toml +3 -0
  173. biucingcli/template_data/microservice/template/Brewfile +7 -0
  174. biucingcli/template_data/microservice/template/Dockerfile +44 -0
  175. biucingcli/template_data/microservice/template/Dockerfile.dev +50 -0
  176. biucingcli/template_data/microservice/template/Makefile +145 -0
  177. biucingcli/template_data/microservice/template/README.md +191 -0
  178. biucingcli/template_data/microservice/template/api/buf.gen.yaml +11 -0
  179. biucingcli/template_data/microservice/template/api/buf.yaml +11 -0
  180. biucingcli/template_data/microservice/template/api/proto/service/v1/service.proto +18 -0
  181. biucingcli/template_data/microservice/template/cmd/server/main.go +81 -0
  182. biucingcli/template_data/microservice/template/compose.dev.yaml +49 -0
  183. biucingcli/template_data/microservice/template/configs/config.yaml +18 -0
  184. biucingcli/template_data/microservice/template/deploy/compose.yaml +35 -0
  185. biucingcli/template_data/microservice/template/deploy/otel-collector.yaml +15 -0
  186. biucingcli/template_data/microservice/template/go.mod +53 -0
  187. biucingcli/template_data/microservice/template/go.sum +138 -0
  188. biucingcli/template_data/microservice/template/internal/config/config.go +112 -0
  189. biucingcli/template_data/microservice/template/internal/config/config_test.go +92 -0
  190. biucingcli/template_data/microservice/template/internal/handler/health.go +25 -0
  191. biucingcli/template_data/microservice/template/internal/handler/ping.go +25 -0
  192. biucingcli/template_data/microservice/template/internal/model/health.go +8 -0
  193. biucingcli/template_data/microservice/template/internal/model/ping.go +7 -0
  194. biucingcli/template_data/microservice/template/internal/repository/.gitkeep +1 -0
  195. biucingcli/template_data/microservice/template/internal/router/router.go +26 -0
  196. biucingcli/template_data/microservice/template/internal/runtime/server.go +116 -0
  197. biucingcli/template_data/microservice/template/internal/runtime/server_test.go +161 -0
  198. biucingcli/template_data/microservice/template/internal/service/health.go +26 -0
  199. biucingcli/template_data/microservice/template/internal/service/ping.go +23 -0
  200. biucingcli/template_data/microservice/template/internal/telemetry/telemetry.go +56 -0
  201. biucingcli/template_data/microservice/template/internal/transport/grpc.go +51 -0
  202. biucingcli/template_data/microservice/template/internal/transport/ping.go +28 -0
  203. biucingcli/template_data/microservice/template/scripts/bootstrap +29 -0
  204. biucingcli/template_data/microservice/template/scripts/doctor +115 -0
  205. biucingcli/template_data/microservice/template/tests/server_test.go +153 -0
  206. biucingcli/template_data/microservice/template.json +114 -0
  207. biucingcli/template_data/web-service/template/.air.toml +11 -0
  208. biucingcli/template_data/web-service/template/.dockerignore +5 -0
  209. biucingcli/template_data/web-service/template/.gitignore +5 -0
  210. biucingcli/template_data/web-service/template/.mise.toml +2 -0
  211. biucingcli/template_data/web-service/template/Brewfile +5 -0
  212. biucingcli/template_data/web-service/template/Dockerfile +41 -0
  213. biucingcli/template_data/web-service/template/Dockerfile.dev +45 -0
  214. biucingcli/template_data/web-service/template/Makefile +113 -0
  215. biucingcli/template_data/web-service/template/README.md +164 -0
  216. biucingcli/template_data/web-service/template/cmd/server/main.go +50 -0
  217. biucingcli/template_data/web-service/template/compose.dev.yaml +28 -0
  218. biucingcli/template_data/web-service/template/compose.yaml +14 -0
  219. biucingcli/template_data/web-service/template/configs/config.yaml +10 -0
  220. biucingcli/template_data/web-service/template/go.mod +36 -0
  221. biucingcli/template_data/web-service/template/go.sum +89 -0
  222. biucingcli/template_data/web-service/template/internal/config/config.go +84 -0
  223. biucingcli/template_data/web-service/template/internal/config/config_test.go +88 -0
  224. biucingcli/template_data/web-service/template/internal/handler/health.go +25 -0
  225. biucingcli/template_data/web-service/template/internal/handler/ping.go +25 -0
  226. biucingcli/template_data/web-service/template/internal/handler/user.go +40 -0
  227. biucingcli/template_data/web-service/template/internal/model/health.go +6 -0
  228. biucingcli/template_data/web-service/template/internal/model/ping.go +7 -0
  229. biucingcli/template_data/web-service/template/internal/model/user.go +7 -0
  230. biucingcli/template_data/web-service/template/internal/repository/.gitkeep +1 -0
  231. biucingcli/template_data/web-service/template/internal/repository/user.go +37 -0
  232. biucingcli/template_data/web-service/template/internal/router/router.go +28 -0
  233. biucingcli/template_data/web-service/template/internal/runtime/server.go +76 -0
  234. biucingcli/template_data/web-service/template/internal/runtime/server_test.go +139 -0
  235. biucingcli/template_data/web-service/template/internal/service/health.go +22 -0
  236. biucingcli/template_data/web-service/template/internal/service/ping.go +23 -0
  237. biucingcli/template_data/web-service/template/internal/service/user.go +27 -0
  238. biucingcli/template_data/web-service/template/scripts/bootstrap +23 -0
  239. biucingcli/template_data/web-service/template/scripts/doctor +83 -0
  240. biucingcli/template_data/web-service/template/tests/server_test.go +160 -0
  241. biucingcli/template_data/web-service/template.json +88 -0
  242. biucingcli/template_data/worker/template/.dockerignore +3 -0
  243. biucingcli/template_data/worker/template/.gitignore +2 -0
  244. biucingcli/template_data/worker/template/.mise.toml +2 -0
  245. biucingcli/template_data/worker/template/Brewfile +1 -0
  246. biucingcli/template_data/worker/template/Dockerfile +19 -0
  247. biucingcli/template_data/worker/template/Dockerfile.dev +9 -0
  248. biucingcli/template_data/worker/template/Makefile +105 -0
  249. biucingcli/template_data/worker/template/README.md +164 -0
  250. biucingcli/template_data/worker/template/cmd/worker/main.go +41 -0
  251. biucingcli/template_data/worker/template/compose.dev.yaml +29 -0
  252. biucingcli/template_data/worker/template/configs/config.json +11 -0
  253. biucingcli/template_data/worker/template/go.mod +3 -0
  254. biucingcli/template_data/worker/template/go.sum +1 -0
  255. biucingcli/template_data/worker/template/internal/config/config.go +108 -0
  256. biucingcli/template_data/worker/template/internal/config/config_test.go +86 -0
  257. biucingcli/template_data/worker/template/internal/runtime/runner.go +199 -0
  258. biucingcli/template_data/worker/template/internal/runtime/runner_test.go +215 -0
  259. biucingcli/template_data/worker/template/internal/task/heartbeat.go +19 -0
  260. biucingcli/template_data/worker/template/scripts/bootstrap +6 -0
  261. biucingcli/template_data/worker/template/scripts/doctor +41 -0
  262. biucingcli/template_data/worker/template/tests/worker_test.go +44 -0
  263. biucingcli/template_data/worker/template.json +100 -0
  264. biucingcli/templates.py +902 -0
  265. biucingcli-0.9.1.dist-info/METADATA +204 -0
  266. biucingcli-0.9.1.dist-info/RECORD +269 -0
  267. biucingcli-0.9.1.dist-info/WHEEL +5 -0
  268. biucingcli-0.9.1.dist-info/entry_points.txt +2 -0
  269. biucingcli-0.9.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,75 @@
1
+ package {{PACKAGE_NAME}}.core.designsystem
2
+
3
+ import androidx.compose.foundation.layout.Arrangement
4
+ import androidx.compose.foundation.layout.Column
5
+ import androidx.compose.foundation.layout.Row
6
+ import androidx.compose.foundation.layout.fillMaxWidth
7
+ import androidx.compose.foundation.layout.padding
8
+ import androidx.compose.material3.Card
9
+ import androidx.compose.material3.CardDefaults
10
+ import androidx.compose.material3.MaterialTheme
11
+ import androidx.compose.material3.Surface
12
+ import androidx.compose.material3.Text
13
+ import androidx.compose.runtime.Composable
14
+ import androidx.compose.ui.Modifier
15
+ import androidx.compose.ui.graphics.Color
16
+
17
+ @Composable
18
+ @Suppress("ktlint:standard:function-naming")
19
+ fun AppSectionCard(
20
+ title: String,
21
+ eyebrow: String? = null,
22
+ modifier: Modifier = Modifier,
23
+ content: @Composable () -> Unit,
24
+ ) {
25
+ Card(
26
+ modifier = modifier.fillMaxWidth(),
27
+ colors = CardDefaults.cardColors(
28
+ containerColor = MaterialTheme.colorScheme.surface,
29
+ ),
30
+ ) {
31
+ Column(
32
+ modifier = Modifier.padding(BiucingSpacing.large),
33
+ verticalArrangement = Arrangement.spacedBy(BiucingSpacing.medium),
34
+ ) {
35
+ Column(verticalArrangement = Arrangement.spacedBy(BiucingSpacing.xSmall)) {
36
+ eyebrow?.let {
37
+ Text(
38
+ text = it,
39
+ style = MaterialTheme.typography.labelMedium,
40
+ color = MaterialTheme.colorScheme.primary,
41
+ )
42
+ }
43
+ Text(
44
+ text = title,
45
+ style = MaterialTheme.typography.titleLarge,
46
+ color = MaterialTheme.colorScheme.onSurface,
47
+ )
48
+ }
49
+ content()
50
+ }
51
+ }
52
+ }
53
+
54
+ @Composable
55
+ @Suppress("ktlint:standard:function-naming")
56
+ fun StatusBadge(
57
+ text: String,
58
+ containerColor: Color = MaterialTheme.colorScheme.secondaryContainer,
59
+ contentColor: Color = MaterialTheme.colorScheme.onSecondaryContainer,
60
+ modifier: Modifier = Modifier,
61
+ ) {
62
+ Surface(
63
+ modifier = modifier,
64
+ color = containerColor,
65
+ contentColor = contentColor,
66
+ shape = MaterialTheme.shapes.small,
67
+ ) {
68
+ Row(modifier = Modifier.padding(horizontal = BiucingSpacing.small, vertical = BiucingSpacing.xSmall)) {
69
+ Text(
70
+ text = text,
71
+ style = MaterialTheme.typography.labelLarge,
72
+ )
73
+ }
74
+ }
75
+ }
@@ -0,0 +1,23 @@
1
+ package {{PACKAGE_NAME}}.core.designsystem
2
+
3
+ import androidx.compose.ui.graphics.Color
4
+ import androidx.compose.ui.unit.dp
5
+
6
+ object BiucingColors {
7
+ val Brand = Color(0xFF2151F5)
8
+ val BrandMuted = Color(0xFFDCE4FF)
9
+ val Accent = Color(0xFF0F9D7A)
10
+ val AccentMuted = Color(0xFFD7F6EC)
11
+ val SurfaceWarm = Color(0xFFF7F5EF)
12
+ val SurfaceCool = Color(0xFFF3F6FF)
13
+ val Ink = Color(0xFF172033)
14
+ val Outline = Color(0xFFD0D7E8)
15
+ }
16
+
17
+ object BiucingSpacing {
18
+ val xSmall = 4.dp
19
+ val small = 8.dp
20
+ val medium = 16.dp
21
+ val large = 24.dp
22
+ val xLarge = 32.dp
23
+ }
@@ -0,0 +1,110 @@
1
+ package {{PACKAGE_NAME}}.core.designsystem
2
+
3
+ import androidx.compose.material3.Typography
4
+ import androidx.compose.material3.MaterialTheme
5
+ import androidx.compose.material3.darkColorScheme
6
+ import androidx.compose.material3.lightColorScheme
7
+ import androidx.compose.runtime.Composable
8
+ import androidx.compose.ui.text.TextStyle
9
+ import androidx.compose.ui.text.font.FontWeight
10
+ import androidx.compose.ui.unit.sp
11
+
12
+ private val LightColors = lightColorScheme(
13
+ primary = BiucingColors.Brand,
14
+ onPrimary = androidx.compose.ui.graphics.Color.White,
15
+ secondary = BiucingColors.Accent,
16
+ onSecondary = androidx.compose.ui.graphics.Color.White,
17
+ primaryContainer = BiucingColors.BrandMuted,
18
+ secondaryContainer = BiucingColors.AccentMuted,
19
+ background = BiucingColors.SurfaceWarm,
20
+ surface = androidx.compose.ui.graphics.Color.White,
21
+ surfaceVariant = BiucingColors.SurfaceCool,
22
+ onBackground = BiucingColors.Ink,
23
+ onSurface = BiucingColors.Ink,
24
+ outline = BiucingColors.Outline,
25
+ )
26
+
27
+ private val DarkColors = darkColorScheme(
28
+ primary = ColorPaletteDark.Brand,
29
+ onPrimary = ColorPaletteDark.OnBrand,
30
+ secondary = ColorPaletteDark.Accent,
31
+ onSecondary = ColorPaletteDark.OnAccent,
32
+ primaryContainer = ColorPaletteDark.BrandContainer,
33
+ secondaryContainer = ColorPaletteDark.AccentContainer,
34
+ background = ColorPaletteDark.Background,
35
+ surface = ColorPaletteDark.Surface,
36
+ surfaceVariant = ColorPaletteDark.SurfaceVariant,
37
+ onBackground = ColorPaletteDark.OnBackground,
38
+ onSurface = ColorPaletteDark.OnSurface,
39
+ outline = ColorPaletteDark.Outline,
40
+ )
41
+
42
+ private val BiucingTypography = Typography(
43
+ headlineLarge = TextStyle(
44
+ fontSize = 30.sp,
45
+ lineHeight = 36.sp,
46
+ fontWeight = FontWeight.Bold,
47
+ ),
48
+ headlineMedium = TextStyle(
49
+ fontSize = 24.sp,
50
+ lineHeight = 30.sp,
51
+ fontWeight = FontWeight.SemiBold,
52
+ ),
53
+ titleLarge = TextStyle(
54
+ fontSize = 20.sp,
55
+ lineHeight = 26.sp,
56
+ fontWeight = FontWeight.SemiBold,
57
+ ),
58
+ titleMedium = TextStyle(
59
+ fontSize = 16.sp,
60
+ lineHeight = 22.sp,
61
+ fontWeight = FontWeight.Medium,
62
+ ),
63
+ bodyLarge = TextStyle(
64
+ fontSize = 16.sp,
65
+ lineHeight = 24.sp,
66
+ ),
67
+ bodyMedium = TextStyle(
68
+ fontSize = 14.sp,
69
+ lineHeight = 20.sp,
70
+ ),
71
+ labelLarge = TextStyle(
72
+ fontSize = 13.sp,
73
+ lineHeight = 18.sp,
74
+ fontWeight = FontWeight.SemiBold,
75
+ ),
76
+ labelMedium = TextStyle(
77
+ fontSize = 12.sp,
78
+ lineHeight = 16.sp,
79
+ fontWeight = FontWeight.Medium,
80
+ letterSpacing = 0.4.sp,
81
+ ),
82
+ )
83
+
84
+ private object ColorPaletteDark {
85
+ val Brand = androidx.compose.ui.graphics.Color(0xFFB8C6FF)
86
+ val OnBrand = androidx.compose.ui.graphics.Color(0xFF0F1B4D)
87
+ val Accent = androidx.compose.ui.graphics.Color(0xFF7EE2C3)
88
+ val OnAccent = androidx.compose.ui.graphics.Color(0xFF00382C)
89
+ val BrandContainer = androidx.compose.ui.graphics.Color(0xFF1A2D77)
90
+ val AccentContainer = androidx.compose.ui.graphics.Color(0xFF0F4F40)
91
+ val Background = androidx.compose.ui.graphics.Color(0xFF11131A)
92
+ val Surface = androidx.compose.ui.graphics.Color(0xFF171A22)
93
+ val SurfaceVariant = androidx.compose.ui.graphics.Color(0xFF1F2533)
94
+ val OnBackground = androidx.compose.ui.graphics.Color(0xFFE7EAF4)
95
+ val OnSurface = androidx.compose.ui.graphics.Color(0xFFE7EAF4)
96
+ val Outline = androidx.compose.ui.graphics.Color(0xFF56607A)
97
+ }
98
+
99
+ @Composable
100
+ @Suppress("ktlint:standard:function-naming")
101
+ fun BiucingTheme(
102
+ darkTheme: Boolean = false,
103
+ content: @Composable () -> Unit,
104
+ ) {
105
+ MaterialTheme(
106
+ colorScheme = if (darkTheme) DarkColors else LightColors,
107
+ typography = BiucingTypography,
108
+ content = content,
109
+ )
110
+ }
@@ -0,0 +1,26 @@
1
+ plugins {
2
+ alias(libs.plugins.android.library)
3
+ alias(libs.plugins.kotlin.android)
4
+ }
5
+
6
+ android {
7
+ namespace = "{{PACKAGE_NAME}}.core.model"
8
+ compileSdk = {{COMPILE_SDK}}
9
+
10
+ defaultConfig {
11
+ minSdk = {{MIN_SDK}}
12
+ }
13
+
14
+ compileOptions {
15
+ sourceCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
16
+ targetCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
17
+ }
18
+
19
+ kotlinOptions {
20
+ jvmTarget = "{{JAVA_VERSION}}"
21
+ }
22
+ }
23
+
24
+ dependencies {
25
+ testImplementation(libs.junit4)
26
+ }
@@ -0,0 +1,6 @@
1
+ package {{PACKAGE_NAME}}.core.model
2
+
3
+ data class Greeting(
4
+ val title: String,
5
+ val subtitle: String,
6
+ )
@@ -0,0 +1,16 @@
1
+ package {{PACKAGE_NAME}}.core.model
2
+
3
+ import org.junit.Assert.assertEquals
4
+ import org.junit.Test
5
+
6
+ class GreetingTest {
7
+ @Test
8
+ fun greetingHoldsData() {
9
+ val greeting = Greeting(
10
+ title = "{{DISPLAY_NAME}}",
11
+ subtitle = "Generated by BiucingCLI",
12
+ )
13
+
14
+ assertEquals("{{DISPLAY_NAME}}", greeting.title)
15
+ }
16
+ }
@@ -0,0 +1,26 @@
1
+ plugins {
2
+ alias(libs.plugins.android.library)
3
+ alias(libs.plugins.kotlin.android)
4
+ }
5
+
6
+ android {
7
+ namespace = "{{PACKAGE_NAME}}.core.network"
8
+ compileSdk = {{COMPILE_SDK}}
9
+
10
+ defaultConfig {
11
+ minSdk = {{MIN_SDK}}
12
+ }
13
+
14
+ compileOptions {
15
+ sourceCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
16
+ targetCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
17
+ }
18
+
19
+ kotlinOptions {
20
+ jvmTarget = "{{JAVA_VERSION}}"
21
+ }
22
+ }
23
+
24
+ dependencies {
25
+ testImplementation(libs.junit4)
26
+ }
@@ -0,0 +1,17 @@
1
+ package {{PACKAGE_NAME}}.core.network
2
+
3
+ data class AppEnvironment(
4
+ val apiBaseUrl: String,
5
+ val releaseChannel: String,
6
+ )
7
+
8
+ interface AppEnvironmentProvider {
9
+ fun environment(): AppEnvironment
10
+ }
11
+
12
+ class DefaultAppEnvironmentProvider : AppEnvironmentProvider {
13
+ override fun environment(): AppEnvironment = AppEnvironment(
14
+ apiBaseUrl = "https://api.example.internal",
15
+ releaseChannel = "beta",
16
+ )
17
+ }
@@ -0,0 +1,27 @@
1
+ plugins {
2
+ alias(libs.plugins.android.library)
3
+ alias(libs.plugins.kotlin.android)
4
+ }
5
+
6
+ android {
7
+ namespace = "{{PACKAGE_NAME}}.core.testing"
8
+ compileSdk = {{COMPILE_SDK}}
9
+
10
+ defaultConfig {
11
+ minSdk = {{MIN_SDK}}
12
+ }
13
+
14
+ compileOptions {
15
+ sourceCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
16
+ targetCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
17
+ }
18
+
19
+ kotlinOptions {
20
+ jvmTarget = "{{JAVA_VERSION}}"
21
+ }
22
+ }
23
+
24
+ dependencies {
25
+ api(project(":core:network"))
26
+ testImplementation(libs.junit4)
27
+ }
@@ -0,0 +1,13 @@
1
+ package {{PACKAGE_NAME}}.core.testing
2
+
3
+ import {{PACKAGE_NAME}}.core.network.AppEnvironment
4
+ import {{PACKAGE_NAME}}.core.network.AppEnvironmentProvider
5
+
6
+ class FakeAppEnvironmentProvider(
7
+ private val environment: AppEnvironment = AppEnvironment(
8
+ apiBaseUrl = "https://staging.example.internal",
9
+ releaseChannel = "beta",
10
+ ),
11
+ ) : AppEnvironmentProvider {
12
+ override fun environment(): AppEnvironment = environment
13
+ }
@@ -0,0 +1,68 @@
1
+ # Google Play Release Delivery
2
+
3
+ The generated starter uses fastlane `supply` to validate release inputs, build a signed Android App Bundle (AAB), upload internal test builds, and create a draft production release in Google Play Console.
4
+
5
+ ## One-Time Setup
6
+
7
+ 1. Create `{{APPLICATION_ID}}` in Google Play Console and finish the required app-registration steps.
8
+ 2. Enable the Google Play Developer API for the Google Cloud project that owns the service account.
9
+ 3. Create a service-account JSON key, invite that account in Play Console with the least privileges needed for the intended tracks, and save it locally as `credentials/play-store-service-account.json`.
10
+ 4. Configure an upload keystore through `local.properties` or the `BIUCING_RELEASE_*` CI variables. For Play App Signing, this is the upload key, not the app-signing key managed by Google.
11
+ 5. Copy `fastlane/.env.example` to `fastlane/.env` and replace its placeholder values.
12
+ 6. Verify the credential independently before the first delivery:
13
+
14
+ ```bash
15
+ fastlane run validate_play_store_json_key json_key:credentials/play-store-service-account.json
16
+ ```
17
+
18
+ Google Play requires an app record to exist before API-driven delivery. Complete the first app-registration flow in Play Console before relying on a CI upload.
19
+
20
+ ## Commands
21
+
22
+ ```bash
23
+ make release-doctor
24
+ make verify-supply-chain
25
+ make archive
26
+ make artifact-info
27
+ make verify-release-artifact
28
+ make beta
29
+ make release
30
+ ```
31
+
32
+ - `make release-doctor` verifies the service-account JSON, the four release-signing inputs, upload keystore, private key alias, and any enabled metadata directory.
33
+ - `make verify-supply-chain` validates the pinned Gradle distribution and wrapper JAR, exact dependency versions, and Gradle dependency checksum metadata.
34
+ - `make archive` runs lint and unit tests, validates the signing key, builds a signed `app-release.aab`, then verifies its cryptographic signature and signer certificate without uploading it.
35
+ - `make verify-release-artifact` checks AAB structure and compares the embedded signer SHA-256 fingerprint with the configured upload key. `make artifact-info` performs the same gate before printing the handoff checksum.
36
+ - `make beta` runs the archive lane and uploads the AAB to the `internal` track by default.
37
+ - `make release` runs the archive lane and uploads the AAB to the `production` track as a `draft` by default.
38
+
39
+ Set `PLAY_STORE_BETA_TRACK`, `PLAY_STORE_BETA_RELEASE_STATUS`, `PLAY_STORE_RELEASE_TRACK`, or `PLAY_STORE_RELEASE_STATUS` only when the target promotion and rollout have been reviewed. Valid release statuses include `draft`, `inProgress`, `halted`, and `completed`.
40
+
41
+ ## Store Listing Assets
42
+
43
+ fastlane can upload metadata, changelogs, images, and screenshots from `fastlane/metadata/android`. For an existing app, initialize that tree from Play Console:
44
+
45
+ ```bash
46
+ fastlane supply init
47
+ ```
48
+
49
+ After reviewing the downloaded files, set the relevant `PLAY_STORE_SKIP_*` value to `false`. Keep the defaults while the listing is managed directly in Play Console.
50
+
51
+ Data safety declarations, content rating, target audience, app access instructions, privacy policy, managed publishing choices, and Play Console review answers remain product and compliance decisions. Complete and review them in Play Console before changing a production draft to a live release.
52
+
53
+ ## Local Secrets
54
+
55
+ Keep these out of version control and store them in the CI secret manager:
56
+
57
+ - `fastlane/.env`
58
+ - `credentials/play-store-service-account.json`
59
+ - the upload keystore under `signing/` and its passwords
60
+ - `local.properties` when it contains signing values
61
+
62
+ For direct Gradle use, keep signing values in `~/.gradle/gradle.properties`; never add them to the tracked project-level `gradle.properties`. Keep `.env.example` and signing-property examples as placeholders only.
63
+
64
+ Ignore rules only protect untracked files and do not override `git add -f`. If real credentials have already been committed, revoke or rotate them first, remove them from the index, and assess whether repository history must be rewritten.
65
+
66
+ ## Dependency Verification Maintenance
67
+
68
+ The committed wrapper properties include the Gradle distribution SHA-256, while `gradle-wrapper.jar.sha256` pins the official wrapper executable. Gradle automatically enforces the artifact checksums in `gradle/verification-metadata.xml`. When intentionally upgrading a plugin or dependency, generate new SHA-256 metadata in a clean review branch, inspect the repository coordinates and checksum diff, and only then commit it. A checksum should never be copied from a failed build or an untrusted mirror.
@@ -0,0 +1,20 @@
1
+ # This example must contain placeholders only. Never put real credentials here.
2
+ # Copy these keys into local.properties for local-only signing setup,
3
+ # or export the matching BIUCING_RELEASE_* environment variables in CI.
4
+ #
5
+ # Example:
6
+ # biucing.release.storeFile=signing/release.keystore
7
+ # biucing.release.storePassword=change-me
8
+ # biucing.release.keyAlias=release
9
+ # biucing.release.keyPassword=change-me
10
+ #
11
+ # Environment variable equivalents:
12
+ # BIUCING_RELEASE_STORE_FILE
13
+ # BIUCING_RELEASE_STORE_PASSWORD
14
+ # BIUCING_RELEASE_KEY_ALIAS
15
+ # BIUCING_RELEASE_KEY_PASSWORD
16
+
17
+ biucing.release.storeFile=signing/release.keystore
18
+ biucing.release.storePassword=change-me
19
+ biucing.release.keyAlias=release
20
+ biucing.release.keyPassword=change-me
@@ -0,0 +1,22 @@
1
+ # Google Play Console service-account JSON. Store it in the ignored credentials directory.
2
+ GOOGLE_PLAY_SERVICE_ACCOUNT_JSON=credentials/play-store-service-account.json
3
+
4
+ # Release signing is read from these values or local.properties.
5
+ BIUCING_RELEASE_STORE_FILE=signing/release.keystore
6
+ BIUCING_RELEASE_STORE_PASSWORD=change-me
7
+ BIUCING_RELEASE_KEY_ALIAS=release
8
+ BIUCING_RELEASE_KEY_PASSWORD=change-me
9
+
10
+ # Internal testing is published immediately to the selected test track.
11
+ PLAY_STORE_BETA_TRACK=internal
12
+ PLAY_STORE_BETA_RELEASE_STATUS=completed
13
+
14
+ # Production delivery is intentionally a draft until Play Console review is complete.
15
+ PLAY_STORE_RELEASE_TRACK=production
16
+ PLAY_STORE_RELEASE_STATUS=draft
17
+
18
+ # Set any of these to false after fastlane/metadata/android is populated.
19
+ PLAY_STORE_SKIP_METADATA=true
20
+ PLAY_STORE_SKIP_CHANGELOGS=true
21
+ PLAY_STORE_SKIP_IMAGES=true
22
+ PLAY_STORE_SKIP_SCREENSHOTS=true
@@ -0,0 +1 @@
1
+ package_name("{{APPLICATION_ID}}")
@@ -0,0 +1,121 @@
1
+ default_platform(:android)
2
+
3
+ APP_IDENTIFIER = "{{APPLICATION_ID}}"
4
+ PROJECT_ROOT = File.expand_path("..", __dir__)
5
+ RELEASE_AAB_PATH = File.join(PROJECT_ROOT, "app/build/outputs/bundle/release/app-release.aab")
6
+ METADATA_PATH = File.join(PROJECT_ROOT, "fastlane/metadata/android")
7
+
8
+ def env_true?(name, default: false)
9
+ value = ENV[name]
10
+ return default if value.nil? || value.empty?
11
+
12
+ %w[1 true yes y].include?(value.downcase)
13
+ end
14
+
15
+ def require_env_file(name)
16
+ value = ENV[name]
17
+ UI.user_error!("Set #{name}. See fastlane/.env.example.") if value.to_s.empty?
18
+ path = File.expand_path(value, PROJECT_ROOT)
19
+ UI.user_error!("#{name} does not exist: #{path}") unless File.file?(path)
20
+ path
21
+ end
22
+
23
+ def signing_value(property_name, environment_name)
24
+ ENV[environment_name] || local_properties[property_name]
25
+ end
26
+
27
+ def local_properties
28
+ return @local_properties if defined?(@local_properties)
29
+
30
+ path = File.join(PROJECT_ROOT, "local.properties")
31
+ @local_properties = {}
32
+ return @local_properties unless File.file?(path)
33
+
34
+ File.foreach(path) do |line|
35
+ next if line.start_with?("#") || !line.include?("=")
36
+
37
+ key, value = line.split("=", 2)
38
+ @local_properties[key.strip] = value.strip
39
+ end
40
+ @local_properties
41
+ end
42
+
43
+ def release_signing_ready?
44
+ store_file = signing_value("biucing.release.storeFile", "BIUCING_RELEASE_STORE_FILE")
45
+ values = [
46
+ store_file,
47
+ signing_value("biucing.release.storePassword", "BIUCING_RELEASE_STORE_PASSWORD"),
48
+ signing_value("biucing.release.keyAlias", "BIUCING_RELEASE_KEY_ALIAS"),
49
+ signing_value("biucing.release.keyPassword", "BIUCING_RELEASE_KEY_PASSWORD")
50
+ ]
51
+ return false unless values.all? { |value| !value.to_s.empty? }
52
+
53
+ File.file?(File.expand_path(store_file, PROJECT_ROOT))
54
+ end
55
+
56
+ def play_service_account_json_path
57
+ require_env_file("GOOGLE_PLAY_SERVICE_ACCOUNT_JSON")
58
+ end
59
+
60
+ def metadata_upload_requested?
61
+ !env_true?("PLAY_STORE_SKIP_METADATA", default: true) ||
62
+ !env_true?("PLAY_STORE_SKIP_CHANGELOGS", default: true) ||
63
+ !env_true?("PLAY_STORE_SKIP_IMAGES", default: true) ||
64
+ !env_true?("PLAY_STORE_SKIP_SCREENSHOTS", default: true)
65
+ end
66
+
67
+ def upload_to_google_play(track:, release_status:)
68
+ options = {
69
+ package_name: APP_IDENTIFIER,
70
+ aab: RELEASE_AAB_PATH,
71
+ json_key: play_service_account_json_path,
72
+ track: track,
73
+ release_status: release_status,
74
+ skip_upload_metadata: env_true?("PLAY_STORE_SKIP_METADATA", default: true),
75
+ skip_upload_changelogs: env_true?("PLAY_STORE_SKIP_CHANGELOGS", default: true),
76
+ skip_upload_images: env_true?("PLAY_STORE_SKIP_IMAGES", default: true),
77
+ skip_upload_screenshots: env_true?("PLAY_STORE_SKIP_SCREENSHOTS", default: true)
78
+ }
79
+ options[:metadata_path] = METADATA_PATH if Dir.exist?(METADATA_PATH)
80
+ upload_to_play_store(**options)
81
+ end
82
+
83
+ platform :android do
84
+ desc "Validate Google Play credentials, signing inputs, and metadata configuration"
85
+ lane :release_doctor do
86
+ play_service_account_json_path
87
+ UI.user_error!("Configure all BIUCING_RELEASE_* values or local.properties signing values.") unless release_signing_ready?
88
+ UI.user_error!("Create #{METADATA_PATH} before enabling Play Store metadata uploads.") if metadata_upload_requested? && !Dir.exist?(METADATA_PATH)
89
+ sh("make verify-release-signing")
90
+ UI.success("Google Play credentials, release signing, and metadata configuration are present.")
91
+ end
92
+
93
+ desc "Build a signed Android App Bundle without uploading"
94
+ lane :archive do
95
+ release_doctor
96
+ sh("make lint")
97
+ sh("make test")
98
+ sh("make bundle-release")
99
+ UI.user_error!("No signed Android App Bundle was produced at #{RELEASE_AAB_PATH}.") unless File.file?(RELEASE_AAB_PATH)
100
+ sh("make verify-release-artifact")
101
+ sh("make artifact-info")
102
+ end
103
+
104
+ desc "Build, sign, and upload an internal Google Play test build"
105
+ lane :beta do
106
+ archive
107
+ upload_to_google_play(
108
+ track: ENV.fetch("PLAY_STORE_BETA_TRACK", "internal"),
109
+ release_status: ENV.fetch("PLAY_STORE_BETA_RELEASE_STATUS", "completed")
110
+ )
111
+ end
112
+
113
+ desc "Build, sign, and upload a draft Google Play production release"
114
+ lane :release do
115
+ archive
116
+ upload_to_google_play(
117
+ track: ENV.fetch("PLAY_STORE_RELEASE_TRACK", "production"),
118
+ release_status: ENV.fetch("PLAY_STORE_RELEASE_STATUS", "draft")
119
+ )
120
+ end
121
+ end
@@ -0,0 +1,35 @@
1
+ plugins {
2
+ alias(libs.plugins.android.library)
3
+ alias(libs.plugins.kotlin.android)
4
+ alias(libs.plugins.kotlin.compose)
5
+ }
6
+
7
+ android {
8
+ namespace = "{{PACKAGE_NAME}}.feature.home"
9
+ compileSdk = {{COMPILE_SDK}}
10
+
11
+ defaultConfig {
12
+ minSdk = {{MIN_SDK}}
13
+ }
14
+
15
+ compileOptions {
16
+ sourceCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
17
+ targetCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
18
+ }
19
+
20
+ kotlinOptions {
21
+ jvmTarget = "{{JAVA_VERSION}}"
22
+ }
23
+
24
+ buildFeatures {
25
+ compose = true
26
+ }
27
+ }
28
+
29
+ dependencies {
30
+ implementation(project(":core:designsystem"))
31
+ implementation(project(":core:model"))
32
+
33
+ implementation(platform(libs.androidx.compose.bom))
34
+ implementation(libs.androidx.compose.material3)
35
+ }
@@ -0,0 +1,38 @@
1
+ package {{PACKAGE_NAME}}.feature.home
2
+
3
+ import androidx.compose.foundation.layout.Arrangement
4
+ import androidx.compose.foundation.layout.Column
5
+ import androidx.compose.material3.MaterialTheme
6
+ import androidx.compose.material3.Text
7
+ import androidx.compose.runtime.Composable
8
+ import {{PACKAGE_NAME}}.core.designsystem.AppSectionCard
9
+ import {{PACKAGE_NAME}}.core.designsystem.BiucingSpacing
10
+ import {{PACKAGE_NAME}}.core.designsystem.StatusBadge
11
+ import {{PACKAGE_NAME}}.core.model.Greeting
12
+
13
+ @Composable
14
+ @Suppress("ktlint:standard:function-naming")
15
+ fun HomeRoute() {
16
+ val greeting = Greeting(
17
+ title = "{{DISPLAY_NAME}}",
18
+ subtitle = "Generated by BiucingCLI",
19
+ )
20
+
21
+ AppSectionCard(
22
+ title = greeting.title,
23
+ eyebrow = "Starter Overview",
24
+ ) {
25
+ Column(verticalArrangement = Arrangement.spacedBy(BiucingSpacing.small)) {
26
+ StatusBadge(text = "Compose baseline ready")
27
+ Text(
28
+ text = greeting.subtitle,
29
+ style = MaterialTheme.typography.bodyLarge,
30
+ )
31
+ Text(
32
+ text = "Use the generated design system tokens and starter components as the baseline for new features.",
33
+ style = MaterialTheme.typography.bodyMedium,
34
+ color = MaterialTheme.colorScheme.onSurfaceVariant,
35
+ )
36
+ }
37
+ }
38
+ }