reis-mobile 0.3.6 → 0.4.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 (463) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +24 -0
  4. package/README.md +175 -168
  5. package/THIRD_PARTY_NOTICES.md +224 -4
  6. package/agents/android-architect.md +89 -0
  7. package/agents/android-performance-engineer.md +92 -0
  8. package/agents/android-test-engineer.md +97 -0
  9. package/agents/flutter-test-engineer.md +2 -0
  10. package/agents/ios-architect.md +93 -0
  11. package/agents/ios-performance-engineer.md +92 -0
  12. package/agents/ios-test-engineer.md +95 -0
  13. package/agents/lead-mobile.md +10 -1
  14. package/agents/mobile-staff-engineer.md +1 -1
  15. package/agents/rn-architect.md +94 -0
  16. package/agents/rn-performance-engineer.md +92 -0
  17. package/agents/rn-test-engineer.md +98 -0
  18. package/bin/reis-mobile.mjs +59 -17
  19. package/commands/debate.md +10 -1
  20. package/commands/debug.md +60 -0
  21. package/commands/reis-mobile.md +7 -2
  22. package/core/config/project.mjs +59 -0
  23. package/core/registry/frontmatter.mjs +15 -4
  24. package/core/registry/registry.mjs +21 -1
  25. package/core/router/intents.mjs +2 -0
  26. package/core/router/router.mjs +10 -5
  27. package/package.json +1 -1
  28. package/skills/android-adaptive/SKILL.md +304 -0
  29. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +112 -0
  30. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +69 -0
  31. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +81 -0
  32. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +170 -0
  33. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +415 -0
  34. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +51 -0
  35. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +73 -0
  36. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +170 -0
  37. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +333 -0
  38. package/skills/android-adaptive/references/android/develop/ui/compose/tooling/debug.md +114 -0
  39. package/skills/android-adaptive/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
  40. package/skills/android-agp-9-upgrade/SKILL.md +106 -0
  41. package/skills/android-agp-9-upgrade/references/android/build/migrate-to-built-in-kotlin.md +416 -0
  42. package/skills/android-agp-9-upgrade/references/android/build/releases/agp-9-0-0-release-notes.md +554 -0
  43. package/skills/android-agp-9-upgrade/references/buildconfig.md +54 -0
  44. package/skills/android-agp-9-upgrade/references/ksp-kapt.md +39 -0
  45. package/skills/android-agp-9-upgrade/references/paparazzi-gradle-9.md +30 -0
  46. package/skills/android-agp-9-upgrade/references/recipes.md +62 -0
  47. package/skills/android-appfunctions/SKILL.md +74 -0
  48. package/skills/android-appfunctions/references/adb-interaction-testing.md +95 -0
  49. package/skills/android-appfunctions/references/context.md +26 -0
  50. package/skills/android-appfunctions/references/feature-discovery-analysis.md +71 -0
  51. package/skills/android-appfunctions/references/implementation-configuration.md +282 -0
  52. package/skills/android-appfunctions/references/kdoc-refinement-optimization.md +75 -0
  53. package/skills/android-appfunctions/references/migrate-to-service-entry-point.md +226 -0
  54. package/skills/android-camerax/SKILL.md +135 -0
  55. package/skills/android-camerax/references/camera1-to-camerax.md +198 -0
  56. package/skills/android-camerax/references/camera2-to-camerax.md +193 -0
  57. package/skills/android-camerax/references/expert-blueprints.md +58 -0
  58. package/skills/android-camerax/references/foldables.md +83 -0
  59. package/skills/android-camerax/references/immutability.md +60 -0
  60. package/skills/android-camerax/references/low-light.md +124 -0
  61. package/skills/android-camerax/references/mlkit-spatial.md +75 -0
  62. package/skills/android-camerax/references/modern-apis.md +42 -0
  63. package/skills/android-camerax/references/testing.md +69 -0
  64. package/skills/android-camerax/references/thermals.md +85 -0
  65. package/skills/android-camerax/references/wear-os.md +76 -0
  66. package/skills/android-camerax/references/xr.md +54 -0
  67. package/skills/android-cli/SKILL.md +474 -0
  68. package/skills/android-cli/references/interact.md +113 -0
  69. package/skills/android-cli/references/journeys.md +120 -0
  70. package/skills/android-code-review/SKILL.md +58 -0
  71. package/skills/android-display-glasses-with-jetpack-compose-glimmer/SKILL.md +340 -0
  72. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +67 -0
  73. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md +388 -0
  74. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md +139 -0
  75. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md +148 -0
  76. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md +107 -0
  77. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md +90 -0
  78. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md +69 -0
  79. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md +82 -0
  80. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md +213 -0
  81. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-samples-source.md +176 -0
  82. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-source.md +203 -0
  83. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-samples-source.md +296 -0
  84. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-source.md +515 -0
  85. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffect-source.md +224 -0
  86. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffectlevels-source.md +105 -0
  87. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmersansflextypography-source.md +270 -0
  88. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmertheme-source.md +182 -0
  89. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/icon-source.md +388 -0
  90. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconbutton-source.md +126 -0
  91. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconsizes-source.md +78 -0
  92. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/list-source.md +27 -0
  93. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/listitem-source.md +272 -0
  94. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/liststate-source.md +427 -0
  95. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/material-hct-source.md +217 -0
  96. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/projectedcontext-source.md +265 -0
  97. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stack-source.md +368 -0
  98. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackitemscope-source.md +440 -0
  99. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackstate-source.md +325 -0
  100. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/surface-source.md +1211 -0
  101. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-samples-source.md +101 -0
  102. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-source.md +131 -0
  103. package/skills/android-edge-to-edge/SKILL.md +429 -0
  104. package/skills/android-engage-sdk-integration/SKILL.md +130 -0
  105. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/faq.md +439 -0
  106. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/food.md +1149 -0
  107. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/healthandfitness.md +1055 -0
  108. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/listen.md +1050 -0
  109. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/otherverticals.md +1301 -0
  110. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/read.md +910 -0
  111. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/shopping.md +1224 -0
  112. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/social.md +719 -0
  113. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/travel.md +1413 -0
  114. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/continue-watching/index.md +19 -0
  115. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/entitlements.md +353 -0
  116. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/getting-started.md +202 -0
  117. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/recommendations.md +471 -0
  118. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/watch.md +1081 -0
  119. package/skills/android-engage-sdk-integration/references/clusters.md +154 -0
  120. package/skills/android-engage-sdk-integration/references/common.md +519 -0
  121. package/skills/android-engage-sdk-integration/references/patterns.md +527 -0
  122. package/skills/android-engage-sdk-integration/references/requests.md +260 -0
  123. package/skills/android-engage-sdk-integration/references/schemas/food.md +509 -0
  124. package/skills/android-engage-sdk-integration/references/schemas/listen.md +842 -0
  125. package/skills/android-engage-sdk-integration/references/schemas/other.md +220 -0
  126. package/skills/android-engage-sdk-integration/references/schemas/read.md +412 -0
  127. package/skills/android-engage-sdk-integration/references/schemas/shopping.md +357 -0
  128. package/skills/android-engage-sdk-integration/references/schemas/social.md +228 -0
  129. package/skills/android-engage-sdk-integration/references/schemas/travel.md +923 -0
  130. package/skills/android-engage-sdk-integration/references/schemas/tv.md +1226 -0
  131. package/skills/android-engage-sdk-integration/references/schemas/watch.md +1137 -0
  132. package/skills/android-engage-sdk-integration/references/troubleshooting.md +39 -0
  133. package/skills/android-gradle-build-debug/SKILL.md +71 -0
  134. package/skills/android-intent-security/SKILL.md +550 -0
  135. package/skills/android-leanback-to-compose-tv-migration/SKILL.md +743 -0
  136. package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/get-started/navigation.md +372 -0
  137. package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/browse.md +243 -0
  138. package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/index.md +153 -0
  139. package/skills/android-media3-cast-integration/SKILL.md +236 -0
  140. package/skills/android-media3-cast-integration/references/android/media/media3/cast/create-castplayer.md +390 -0
  141. package/skills/android-media3-cast-integration/references/android/media/media3/cast/customize-castoptions.md +93 -0
  142. package/skills/android-media3-cast-integration/references/android/media/media3/cast/index.md +21 -0
  143. package/skills/android-migrate-xml-views-to-jetpack-compose/SKILL.md +127 -0
  144. package/skills/android-migrate-xml-views-to-jetpack-compose/references/analysis-of-the-project-and-layout.md +42 -0
  145. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +171 -0
  146. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md +299 -0
  147. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md +286 -0
  148. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +197 -0
  149. package/skills/android-migrate-xml-views-to-jetpack-compose/references/identify-optimal-xml-candidate.md +31 -0
  150. package/skills/android-migrate-xml-views-to-jetpack-compose/references/xml-layout-migration.md +86 -0
  151. package/skills/android-ml-kit-genai-prompt-api/SKILL.md +124 -0
  152. package/skills/android-ml-kit-genai-prompt-api/references/get-started.md +272 -0
  153. package/skills/android-ml-kit-genai-prompt-api/references/prefix-caching.md +146 -0
  154. package/skills/android-ml-kit-genai-prompt-api/references/prompt-design.md +55 -0
  155. package/skills/android-ml-kit-genai-prompt-api/references/prompt-optimization.md +74 -0
  156. package/skills/android-ml-kit-genai-prompt-api/references/structured-output.md +219 -0
  157. package/skills/android-ml-kit-genai-prompt-api/references/system-instructions.md +71 -0
  158. package/skills/android-navigation-3/SKILL.md +122 -0
  159. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/index.md +51 -0
  160. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/migration-guide.md +670 -0
  161. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/animations.md +147 -0
  162. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basic.md +89 -0
  163. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +85 -0
  164. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +90 -0
  165. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +195 -0
  166. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/common-ui.md +200 -0
  167. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +182 -0
  168. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional.md +230 -0
  169. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +176 -0
  170. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +140 -0
  171. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +184 -0
  172. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/dialog.md +107 -0
  173. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +185 -0
  174. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
  175. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +145 -0
  176. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +283 -0
  177. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +287 -0
  178. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +468 -0
  179. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +371 -0
  180. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-event.md +273 -0
  181. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-state.md +266 -0
  182. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +435 -0
  183. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +244 -0
  184. package/skills/android-navigation-3/references/android/guide/navigation/type-safe-destinations.md +129 -0
  185. package/skills/android-navigation-event/SKILL.md +312 -0
  186. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/dispatcher.md +134 -0
  187. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/handle-back.md +217 -0
  188. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/index.md +83 -0
  189. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/setup.md +32 -0
  190. package/skills/android-play-billing-library-version-upgrade/SKILL.md +96 -0
  191. package/skills/android-play-billing-library-version-upgrade/references/android/google/play/billing/release-notes.md +1240 -0
  192. package/skills/android-play-billing-library-version-upgrade/references/migration-logic.md +78 -0
  193. package/skills/android-play-billing-library-version-upgrade/references/version-checklist.md +54 -0
  194. package/skills/android-play-policy-insights/SKILL.md +172 -0
  195. package/skills/android-play-policy-insights/resources/common_mandates.md +100 -0
  196. package/skills/android-play-policy-insights/resources/compliance_report_template.md +59 -0
  197. package/skills/android-play-policy-insights/resources/critic.md +86 -0
  198. package/skills/android-play-policy-insights/resources/goal_data_safety.md +212 -0
  199. package/skills/android-play-policy-insights/resources/goal_permissions_and_apis.md +459 -0
  200. package/skills/android-play-policy-insights/resources/goal_user_account.md +106 -0
  201. package/skills/android-play-policy-insights/resources/policies.json +321 -0
  202. package/skills/android-play-policy-insights/resources/scanner_config.json +843 -0
  203. package/skills/android-play-policy-insights/scripts/generate_report.py +860 -0
  204. package/skills/android-play-policy-insights/scripts/orchestrator.py +1313 -0
  205. package/skills/android-play-policy-insights/scripts/play_store_scraper.py +410 -0
  206. package/skills/android-play-policy-insights/scripts/scanner.py +261 -0
  207. package/skills/android-play-policy-insights/scripts/template_engine.py +243 -0
  208. package/skills/android-profiler/SKILL.md +60 -0
  209. package/skills/android-profiler/analysis/analysis_orchestrator.md +32 -0
  210. package/skills/android-profiler/analysis/workflows/perfetto-sql/perfetto_sql.md +28 -0
  211. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +121 -0
  212. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +51 -0
  213. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +7 -0
  214. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +56 -0
  215. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +51 -0
  216. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +46 -0
  217. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +41 -0
  218. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +55 -0
  219. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +33 -0
  220. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +172 -0
  221. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/triage.md +94 -0
  222. package/skills/android-profiler/recording/recording_orchestrator.md +36 -0
  223. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +148 -0
  224. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +43 -0
  225. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +35 -0
  226. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +21 -0
  227. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +37 -0
  228. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +45 -0
  229. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +21 -0
  230. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +33 -0
  231. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +102 -0
  232. package/skills/android-profiler/references/env_setup.md +15 -0
  233. package/skills/android-profiler/references/perfetto/setup.md +29 -0
  234. package/skills/android-profiler/references/perfetto/sql.md +327 -0
  235. package/skills/android-r8-analyzer/SKILL.md +72 -0
  236. package/skills/android-r8-analyzer/references/CONFIGURATION-ANALYZER.md +287 -0
  237. package/skills/android-r8-analyzer/references/CONFIGURATION.md +44 -0
  238. package/skills/android-r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
  239. package/skills/android-r8-analyzer/references/REDUNDANT-RULES.md +222 -0
  240. package/skills/android-r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
  241. package/skills/android-r8-analyzer/references/REPORT_FORMAT.md +51 -0
  242. package/skills/android-r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +252 -0
  243. package/skills/android-r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
  244. package/skills/android-restore-credentials/SKILL.md +359 -0
  245. package/skills/android-restore-credentials/references/android/guide/topics/manifest/application-element.md +832 -0
  246. package/skills/android-restore-credentials/references/android/identity/passkeys/create-passkeys.md +327 -0
  247. package/skills/android-restore-credentials/references/android/identity/passkeys/sign-in-with-passkeys.md +219 -0
  248. package/skills/android-styles/SKILL.md +229 -0
  249. package/skills/android-styles/references/android/develop/ui/compose/designsystems/custom.md +459 -0
  250. package/skills/android-styles/references/android/develop/ui/compose/styles/fundamentals.md +421 -0
  251. package/skills/android-styles/references/android/develop/ui/compose/styles/state-animations.md +461 -0
  252. package/skills/android-styles/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +48 -0
  253. package/skills/android-styles/references/android/develop/ui/compose/styles/theming.md +269 -0
  254. package/skills/android-verified-email/SKILL.md +432 -0
  255. package/skills/android-verified-email/references/android/identity/credential-manager/index.md +67 -0
  256. package/skills/android-verified-email/references/android/identity/digital-credentials/credential-verifier.md +166 -0
  257. package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification-implementation.md +313 -0
  258. package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification.md +158 -0
  259. package/skills/android-verified-email/references/android/identity/digital-credentials/index.md +112 -0
  260. package/skills/android-verified-email/references/android/identity/passkeys/create-passkeys.md +327 -0
  261. package/skills/android-verified-email/references/android/identity/sign-in/credential-manager-webview.md +84 -0
  262. package/skills/android-wear-compose-m3/SKILL.md +365 -0
  263. package/skills/android-wear-compose-m3/references/android/training/wearables/compose/migrate-to-material3.md +677 -0
  264. package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md +123 -0
  265. package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md.txt +123 -0
  266. package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md +430 -0
  267. package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md.txt +430 -0
  268. package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md +99 -0
  269. package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md.txt +99 -0
  270. package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md +141 -0
  271. package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md.txt +141 -0
  272. package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md +56 -0
  273. package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md.txt +56 -0
  274. package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md +153 -0
  275. package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md.txt +153 -0
  276. package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md +131 -0
  277. package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md.txt +131 -0
  278. package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md +169 -0
  279. package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md.txt +169 -0
  280. package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md +282 -0
  281. package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md.txt +282 -0
  282. package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md +335 -0
  283. package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md.txt +335 -0
  284. package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md +377 -0
  285. package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md.txt +377 -0
  286. package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md +165 -0
  287. package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md.txt +165 -0
  288. package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md +91 -0
  289. package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md.txt +91 -0
  290. package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md +496 -0
  291. package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md.txt +496 -0
  292. package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md +470 -0
  293. package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md.txt +470 -0
  294. package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md +67 -0
  295. package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md.txt +67 -0
  296. package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md +162 -0
  297. package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md.txt +162 -0
  298. package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md +78 -0
  299. package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md.txt +78 -0
  300. package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md +131 -0
  301. package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md.txt +131 -0
  302. package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md +74 -0
  303. package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md.txt +74 -0
  304. package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md +63 -0
  305. package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md.txt +63 -0
  306. package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md +60 -0
  307. package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md.txt +60 -0
  308. package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md +125 -0
  309. package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md.txt +125 -0
  310. package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md +116 -0
  311. package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md.txt +116 -0
  312. package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md +68 -0
  313. package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md.txt +68 -0
  314. package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md +50 -0
  315. package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md.txt +50 -0
  316. package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md +177 -0
  317. package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md.txt +177 -0
  318. package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md +651 -0
  319. package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md.txt +651 -0
  320. package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md +57 -0
  321. package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md.txt +57 -0
  322. package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md +110 -0
  323. package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md.txt +110 -0
  324. package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md +204 -0
  325. package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md.txt +204 -0
  326. package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md +139 -0
  327. package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md.txt +139 -0
  328. package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md +111 -0
  329. package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md.txt +111 -0
  330. package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md +184 -0
  331. package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md.txt +184 -0
  332. package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md +263 -0
  333. package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md.txt +263 -0
  334. package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md +105 -0
  335. package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md.txt +105 -0
  336. package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md +146 -0
  337. package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md.txt +146 -0
  338. package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md +97 -0
  339. package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md.txt +97 -0
  340. package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md +66 -0
  341. package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md.txt +66 -0
  342. package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md +86 -0
  343. package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md.txt +86 -0
  344. package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md +148 -0
  345. package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md.txt +148 -0
  346. package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md +166 -0
  347. package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md.txt +166 -0
  348. package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md +172 -0
  349. package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md.txt +172 -0
  350. package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md +367 -0
  351. package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md.txt +367 -0
  352. package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md +66 -0
  353. package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md.txt +66 -0
  354. package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md +115 -0
  355. package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md.txt +115 -0
  356. package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md +71 -0
  357. package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md.txt +71 -0
  358. package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md +151 -0
  359. package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md.txt +151 -0
  360. package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md +65 -0
  361. package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md.txt +65 -0
  362. package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md +246 -0
  363. package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md.txt +246 -0
  364. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md +89 -0
  365. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +89 -0
  366. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md +309 -0
  367. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md.txt +309 -0
  368. package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +205 -0
  369. package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +205 -0
  370. package/skills/{architecture-feature-first → flutter-architecture-feature-first}/SKILL.md +1 -1
  371. package/skills/{bloc → flutter-bloc}/SKILL.md +1 -1
  372. package/skills/flutter-build-debug/SKILL.md +66 -0
  373. package/skills/{code-review → flutter-code-review}/SKILL.md +1 -1
  374. package/skills/{dart-3-updates → flutter-dart-3-updates}/SKILL.md +1 -1
  375. package/skills/{dart-fix-runtime-errors → flutter-dart-fix-runtime-errors}/SKILL.md +1 -1
  376. package/skills/{dart-resolve-package-conflicts → flutter-dart-resolve-package-conflicts}/SKILL.md +1 -1
  377. package/skills/{dart-run-static-analysis → flutter-dart-run-static-analysis}/SKILL.md +1 -1
  378. package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/SKILL.md +1 -1
  379. package/skills/{effective-dart → flutter-effective-dart}/SKILL.md +1 -1
  380. package/skills/{provider → flutter-provider}/SKILL.md +1 -1
  381. package/skills/{riverpod → flutter-riverpod}/SKILL.md +1 -1
  382. package/skills/ios-cocoapods-debug/SKILL.md +65 -0
  383. package/skills/ios-code-review/SKILL.md +56 -0
  384. package/skills/ios-xcode-build-debug/SKILL.md +66 -0
  385. package/skills/{detect-mobile-stack → mobile-detect-stack}/SKILL.md +1 -1
  386. package/skills/mobile-firebase/SKILL.md +54 -0
  387. package/skills/mobile-firebase/references/android/ai-logic.md +31 -0
  388. package/skills/mobile-firebase/references/android/analytics.md +33 -0
  389. package/skills/mobile-firebase/references/android/app-check.md +36 -0
  390. package/skills/mobile-firebase/references/android/auth.md +44 -0
  391. package/skills/mobile-firebase/references/android/crashlytics.md +31 -0
  392. package/skills/mobile-firebase/references/android/firestore.md +44 -0
  393. package/skills/mobile-firebase/references/android/functions.md +33 -0
  394. package/skills/mobile-firebase/references/android/in-app-messaging.md +28 -0
  395. package/skills/mobile-firebase/references/android/messaging.md +41 -0
  396. package/skills/mobile-firebase/references/android/realtime-database.md +50 -0
  397. package/skills/mobile-firebase/references/android/remote-config.md +43 -0
  398. package/skills/mobile-firebase/references/android/sql-connect.md +31 -0
  399. package/skills/mobile-firebase/references/android/storage.md +39 -0
  400. package/skills/mobile-firebase/references/android.md +30 -0
  401. package/skills/{firebase-ai/SKILL.md → mobile-firebase/references/flutter/ai-logic.md} +2 -8
  402. package/skills/{firebase-analytics/SKILL.md → mobile-firebase/references/flutter/analytics.md} +2 -8
  403. package/skills/{firebase-app-check/SKILL.md → mobile-firebase/references/flutter/app-check.md} +2 -8
  404. package/skills/{firebase-auth/SKILL.md → mobile-firebase/references/flutter/auth.md} +2 -8
  405. package/skills/{firebase-crashlytics/SKILL.md → mobile-firebase/references/flutter/crashlytics.md} +2 -8
  406. package/skills/{firebase-cloud-firestore/SKILL.md → mobile-firebase/references/flutter/firestore.md} +2 -8
  407. package/skills/{firebase-cloud-functions/SKILL.md → mobile-firebase/references/flutter/functions.md} +2 -8
  408. package/skills/{firebase-in-app-messaging/SKILL.md → mobile-firebase/references/flutter/in-app-messaging.md} +2 -8
  409. package/skills/{firebase-messaging/SKILL.md → mobile-firebase/references/flutter/messaging.md} +2 -8
  410. package/skills/{firebase-database/SKILL.md → mobile-firebase/references/flutter/realtime-database.md} +2 -8
  411. package/skills/{firebase-remote-config/SKILL.md → mobile-firebase/references/flutter/remote-config.md} +2 -8
  412. package/skills/{flutterfire-configure/SKILL.md → mobile-firebase/references/flutter/setup-flutterfire.md} +1 -8
  413. package/skills/{firebase-data-connect/SKILL.md → mobile-firebase/references/flutter/sql-connect.md} +2 -8
  414. package/skills/{firebase-storage/SKILL.md → mobile-firebase/references/flutter/storage.md} +2 -8
  415. package/skills/mobile-firebase/references/flutter.md +36 -0
  416. package/skills/mobile-firebase/references/ios/ai-logic.md +30 -0
  417. package/skills/mobile-firebase/references/ios/analytics.md +33 -0
  418. package/skills/mobile-firebase/references/ios/app-check.md +36 -0
  419. package/skills/mobile-firebase/references/ios/auth.md +48 -0
  420. package/skills/mobile-firebase/references/ios/crashlytics.md +34 -0
  421. package/skills/mobile-firebase/references/ios/firestore.md +53 -0
  422. package/skills/mobile-firebase/references/ios/functions.md +35 -0
  423. package/skills/mobile-firebase/references/ios/in-app-messaging.md +26 -0
  424. package/skills/mobile-firebase/references/ios/messaging.md +45 -0
  425. package/skills/mobile-firebase/references/ios/realtime-database.md +49 -0
  426. package/skills/mobile-firebase/references/ios/remote-config.md +44 -0
  427. package/skills/mobile-firebase/references/ios/sql-connect.md +33 -0
  428. package/skills/mobile-firebase/references/ios/storage.md +36 -0
  429. package/skills/mobile-firebase/references/ios.md +28 -0
  430. package/skills/mobile-firebase/references/react-native/ai-logic.md +32 -0
  431. package/skills/mobile-firebase/references/react-native/analytics.md +43 -0
  432. package/skills/mobile-firebase/references/react-native/app-check.md +35 -0
  433. package/skills/mobile-firebase/references/react-native/auth.md +50 -0
  434. package/skills/mobile-firebase/references/react-native/crashlytics.md +36 -0
  435. package/skills/mobile-firebase/references/react-native/firestore.md +45 -0
  436. package/skills/mobile-firebase/references/react-native/functions.md +28 -0
  437. package/skills/mobile-firebase/references/react-native/in-app-messaging.md +27 -0
  438. package/skills/mobile-firebase/references/react-native/messaging.md +46 -0
  439. package/skills/mobile-firebase/references/react-native/realtime-database.md +46 -0
  440. package/skills/mobile-firebase/references/react-native/remote-config.md +32 -0
  441. package/skills/mobile-firebase/references/react-native/sql-connect.md +11 -0
  442. package/skills/mobile-firebase/references/react-native/storage.md +30 -0
  443. package/skills/mobile-firebase/references/react-native.md +29 -0
  444. package/skills/mobile-test/SKILL.md +63 -0
  445. package/skills/mobile-test/references/android/setup/GUIDE.md +183 -0
  446. package/skills/mobile-test/references/android/setup/references/android/develop/ui/compose/testing/common-patterns.md +181 -0
  447. package/skills/mobile-test/references/android/setup/references/android/studio/preview/compose-screenshot-testing.md +255 -0
  448. package/skills/mobile-test/references/android/setup/references/android/training/dependency-injection/hilt-testing.md +447 -0
  449. package/skills/mobile-test/references/android.md +83 -0
  450. package/skills/{dart-collect-coverage/SKILL.md → mobile-test/references/flutter/coverage.md} +2 -11
  451. package/skills/{dart-generate-test-mocks/SKILL.md → mobile-test/references/flutter/generate-mocks.md} +2 -11
  452. package/skills/{flutter-add-integration-test/SKILL.md → mobile-test/references/flutter/integration-tests.md} +2 -11
  453. package/skills/{dart-migrate-to-checks-package/SKILL.md → mobile-test/references/flutter/migrate-to-checks.md} +2 -13
  454. package/skills/{mockito/SKILL.md → mobile-test/references/flutter/mockito.md} +1 -8
  455. package/skills/{mocktail/SKILL.md → mobile-test/references/flutter/mocktail.md} +1 -8
  456. package/skills/{patrol-e2e-testing/SKILL.md → mobile-test/references/flutter/patrol.md} +1 -8
  457. package/skills/{testing/SKILL.md → mobile-test/references/flutter/testing-guidelines.md} +1 -8
  458. package/skills/{dart-add-unit-test/SKILL.md → mobile-test/references/flutter/unit-tests.md} +2 -11
  459. package/skills/{flutter-add-widget-test/SKILL.md → mobile-test/references/flutter/widget-tests.md} +2 -11
  460. package/skills/mobile-test/references/flutter.md +44 -0
  461. package/skills/mobile-test/references/ios.md +79 -0
  462. package/skills/mobile-test/references/react-native.md +62 -0
  463. /package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/examples/json_patterns.dart +0 -0
@@ -0,0 +1,182 @@
1
+ When implementing Glimmer styles, refer to the following source code in
2
+ `GlimmerTheme.kt`:
3
+
4
+
5
+ ```kotlin
6
+ /*
7
+ * Copyright 2025 The Android Open Source Project
8
+ *
9
+ * Licensed under the Apache License, Version 2.0 (the "License");
10
+ * you may not use this file except in compliance with the License.
11
+ * You may obtain a copy of the License at
12
+ *
13
+ * http://www.apache.org/licenses/LICENSE-2.0
14
+ *
15
+ * Unless required by applicable law or agreed to in writing, software
16
+ * distributed under the License is distributed on an "AS IS" BASIS,
17
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ * See the License for the specific language governing permissions and
19
+ * limitations under the License.
20
+ */
21
+
22
+ package androidx.xr.glimmer
23
+
24
+ import androidx.compose.foundation.BorderStroke
25
+ import androidx.compose.foundation.IndicationNodeFactory
26
+ import androidx.compose.foundation.LocalIndication
27
+ import androidx.compose.foundation.interaction.InteractionSource
28
+ import androidx.compose.runtime.Composable
29
+ import androidx.compose.runtime.CompositionLocal
30
+ import androidx.compose.runtime.CompositionLocalProvider
31
+ import androidx.compose.runtime.Immutable
32
+ import androidx.compose.runtime.ProvidableCompositionLocal
33
+ import androidx.compose.runtime.ReadOnlyComposable
34
+ import androidx.compose.runtime.staticCompositionLocalOf
35
+ import androidx.compose.ui.Modifier
36
+ import androidx.compose.ui.node.DelegatableNode
37
+ import androidx.xr.glimmer.GlimmerTheme.Companion.colors
38
+ import androidx.xr.glimmer.GlimmerTheme.Companion.depthEffectLevels
39
+ import androidx.xr.glimmer.GlimmerTheme.Companion.iconSizes
40
+ import androidx.xr.glimmer.GlimmerTheme.Companion.shapes
41
+
42
+ /**
43
+ * Jetpack Compose Glimmer contains different theme subsystems to allow visual customization across
44
+ * an application.
45
+ *
46
+ * Components use properties provided here when retrieving default values.
47
+ *
48
+ * Any values that are not set will inherit the current value from the theme, falling back to the
49
+ * defaults if there is no parent GlimmerTheme. This allows using a GlimmerTheme at the top of your
50
+ * application, and then separate GlimmerTheme(s) for different screens / parts of your UI,
51
+ * overriding only the parts of the theme definition that need to change.
52
+ *
53
+ * @param colors [Colors] used by components within this hierarchy
54
+ * @param typography [Typography] used by components within this hierarchy
55
+ * @param componentSpacingValues [ComponentSpacingValues] used by components within this hierarchy
56
+ * @param content The content that can retrieve values from this theme
57
+ */
58
+ @Composable
59
+ public fun GlimmerTheme(
60
+ colors: Colors = GlimmerTheme.colors,
61
+ typography: Typography = GlimmerTheme.typography,
62
+ componentSpacingValues: ComponentSpacingValues = GlimmerTheme.componentSpacingValues,
63
+ content: @Composable () -> Unit,
64
+ ) {
65
+ val theme = GlimmerTheme(colors, typography, componentSpacingValues)
66
+ CompositionLocalProvider(
67
+ _localGlimmerTheme provides theme,
68
+ // TODO: b/413429405
69
+ LocalIndication provides NoIndication,
70
+ LocalTextStyle provides typography.bodySmall,
71
+ LocalIconSize provides theme.iconSizes.medium,
72
+ content = content,
73
+ )
74
+ }
75
+
76
+ /**
77
+ * Jetpack Compose Glimmer contains different theme subsystems to allow visual customization across
78
+ * an application.
79
+ *
80
+ * Components use properties provided here when retrieving default values.
81
+ *
82
+ * @property colors [Colors] used by Jetpack Compose Glimmer components
83
+ * @property typography [Typography] used by Jetpack Compose Glimmer components. It is recommended
84
+ * to use `createGoogleSansFlexTypography()` from `androidx.xr.glimmer:glimmer-google-fonts` to
85
+ * create this.
86
+ * @property componentSpacingValues [ComponentSpacingValues] used by Jetpack Compose Glimmer
87
+ * components
88
+ * @property shapes [Shapes] used by Jetpack Compose Glimmer components
89
+ * @property depthEffectLevels [DepthEffectLevels] used by Jetpack Compose Glimmer components
90
+ * @property iconSizes [IconSizes] used by icons
91
+ */
92
+ @Immutable
93
+ public class GlimmerTheme(
94
+ public val colors: Colors = Colors(),
95
+ public val typography: Typography = Typography(),
96
+ public val componentSpacingValues: ComponentSpacingValues = ComponentSpacingValues(),
97
+ ) {
98
+ public val shapes: Shapes = _shapes
99
+ public val depthEffectLevels: DepthEffectLevels = _depthEffectLevels
100
+ public val iconSizes: IconSizes = _iconSizes
101
+
102
+ public companion object {
103
+ /** Retrieves the current [Colors] at the call site's position in the hierarchy. */
104
+ public val colors: Colors
105
+ @Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.colors
106
+
107
+ /** Retrieves the current [Typography] at the call site's position in the hierarchy. */
108
+ public val typography: Typography
109
+ @Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.typography
110
+
111
+ /**
112
+ * Retrieves the current [ComponentSpacingValues] at the call site's position in the
113
+ * hierarchy.
114
+ */
115
+ public val componentSpacingValues: ComponentSpacingValues
116
+ @Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.componentSpacingValues
117
+
118
+ /** Retrieves the current [Shapes] at the call site's position in the hierarchy. */
119
+ public val shapes: Shapes
120
+ @Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.shapes
121
+
122
+ /**
123
+ * Retrieves the current [DepthEffectLevels] at the call site's position in the hierarchy.
124
+ */
125
+ public val depthEffectLevels: DepthEffectLevels
126
+ @Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.depthEffectLevels
127
+
128
+ /** Retrieves the current [IconSizes] at the call site's position in the hierarchy. */
129
+ public val iconSizes: IconSizes
130
+ @Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.iconSizes
131
+
132
+ /**
133
+ * [CompositionLocal] providing [GlimmerTheme] throughout the hierarchy. You can use
134
+ * properties in the companion object to access specific subsystems, for example [colors].
135
+ * To provide a new value for this, use [GlimmerTheme]. This API is exposed to allow
136
+ * retrieving values from inside CompositionLocalConsumerModifierNode implementations - in
137
+ * most cases you should use [colors] and other properties directly.
138
+ */
139
+ public val LocalGlimmerTheme: CompositionLocal<GlimmerTheme>
140
+ get() = _localGlimmerTheme
141
+
142
+ /**
143
+ * Cached Shapes instance to be used across [GlimmerTheme] instances - currently shapes are
144
+ * not user-configurable.
145
+ */
146
+ private val _shapes = Shapes()
147
+
148
+ /**
149
+ * Cached [DepthEffectLevels] instance to be used across [GlimmerTheme] instances -
150
+ * currently depth effect levels are not user-configurable.
151
+ */
152
+ private val _depthEffectLevels = DepthEffectLevels()
153
+
154
+ /**
155
+ * Cached IconSizes instance to be used across [GlimmerTheme] instances - currently icon
156
+ * sizes are not user-configurable.
157
+ */
158
+ internal val _iconSizes = IconSizes()
159
+ }
160
+
161
+ internal var defaultSurfaceBorderCached: BorderStroke? = null
162
+ }
163
+
164
+ private object NoIndication : IndicationNodeFactory {
165
+ override fun create(interactionSource: InteractionSource): DelegatableNode {
166
+ return object : Modifier.Node() {}
167
+ }
168
+
169
+ override fun equals(other: Any?): Boolean = other === this
170
+
171
+ override fun hashCode(): Int = -5
172
+ }
173
+
174
+ /** Use [GlimmerTheme.LocalGlimmerTheme] to access this publicly. */
175
+ @Suppress("CompositionLocalNaming")
176
+ private val _localGlimmerTheme: ProvidableCompositionLocal<GlimmerTheme> =
177
+ staticCompositionLocalOf {
178
+ GlimmerTheme()
179
+ }
180
+ ```
181
+
182
+ <br />
@@ -0,0 +1,388 @@
1
+ When creating a Glimmer Icon component, refer to the following source code in
2
+ `Icon.kt`:
3
+
4
+
5
+ ```kotlin
6
+ /*
7
+ * Copyright 2025 The Android Open Source Project
8
+ *
9
+ * Licensed under the Apache License, Version 2.0 (the "License");
10
+ * you may not use this file except in compliance with the License.
11
+ * You may obtain a copy of the License at
12
+ *
13
+ * http://www.apache.org/licenses/LICENSE-2.0
14
+ *
15
+ * Unless required by applicable law or agreed to in writing, software
16
+ * distributed under the License is distributed on an "AS IS" BASIS,
17
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ * See the License for the specific language governing permissions and
19
+ * limitations under the License.
20
+ */
21
+
22
+ package androidx.xr.glimmer
23
+
24
+ import androidx.compose.foundation.layout.Box
25
+ import androidx.compose.foundation.layout.size
26
+ import androidx.compose.runtime.Composable
27
+ import androidx.compose.runtime.ProvidableCompositionLocal
28
+ import androidx.compose.runtime.compositionLocalOf
29
+ import androidx.compose.runtime.remember
30
+ import androidx.compose.runtime.structuralEqualityPolicy
31
+ import androidx.compose.ui.Modifier
32
+ import androidx.compose.ui.draw.CacheDrawModifierNode
33
+ import androidx.compose.ui.draw.paint
34
+ import androidx.compose.ui.graphics.Color
35
+ import androidx.compose.ui.graphics.ColorFilter
36
+ import androidx.compose.ui.graphics.ColorProducer
37
+ import androidx.compose.ui.graphics.ImageBitmap
38
+ import androidx.compose.ui.graphics.isSpecified
39
+ import androidx.compose.ui.graphics.layer.drawLayer
40
+ import androidx.compose.ui.graphics.painter.BitmapPainter
41
+ import androidx.compose.ui.graphics.painter.Painter
42
+ import androidx.compose.ui.graphics.toolingGraphicsLayer
43
+ import androidx.compose.ui.graphics.vector.ImageVector
44
+ import androidx.compose.ui.graphics.vector.rememberVectorPainter
45
+ import androidx.compose.ui.layout.ContentScale
46
+ import androidx.compose.ui.node.DelegatingNode
47
+ import androidx.compose.ui.node.ModifierNodeElement
48
+ import androidx.compose.ui.node.invalidateDraw
49
+ import androidx.compose.ui.semantics.Role
50
+ import androidx.compose.ui.semantics.contentDescription
51
+ import androidx.compose.ui.semantics.role
52
+ import androidx.compose.ui.semantics.semantics
53
+ import androidx.compose.ui.unit.Dp
54
+
55
+ /**
56
+ * An icon component that draws [imageVector], with a default size of [LocalIconSize], and applies a
57
+ * content color tint. Icon is an opinionated component designed to be used with single-color icons
58
+ * so that they can be tinted correctly for the component they are placed in. The recommended icon
59
+ * sizes can be retrieved using [GlimmerTheme.Companion.iconSizes]. A size can be set explicitly
60
+ * using [size], and components can use [LocalIconSize] to set the preferred size for any Icons
61
+ * inside the component. The content color used to tint this icon is provided by [surface]. To set a
62
+ * custom tint color, use the Icon overload with a tint parameter. For multicolored icons and icons
63
+ * that should not be tinted, use the overload and set [Color.Unspecified] as the tint color. For
64
+ * generic images that should not be tinted, and should not use the provided icon size, use the
65
+ * generic [androidx.compose.foundation.Image] instead.
66
+ *
67
+ * @param imageVector [ImageVector] to draw inside this icon
68
+ * @param contentDescription text used by accessibility services to describe what this icon
69
+ * represents. This should always be provided unless this icon is used for decorative purposes,
70
+ * and does not represent a meaningful action that a user can take. This text should be localized,
71
+ * such as by using [androidx.compose.ui.res.stringResource] or similar
72
+ * @param modifier the [Modifier] to be applied to this icon
73
+ * @see LocalIconSize
74
+ * @see GlimmerTheme.Companion.iconSizes
75
+ */
76
+ @Composable
77
+ public fun Icon(
78
+ imageVector: ImageVector,
79
+ contentDescription: String?,
80
+ modifier: Modifier = Modifier,
81
+ ) {
82
+ Icon(
83
+ painter = rememberVectorPainter(imageVector),
84
+ contentDescription = contentDescription,
85
+ modifier = modifier,
86
+ )
87
+ }
88
+
89
+ /**
90
+ * An icon component that draws [imageVector], with a default size of [LocalIconSize], and applies a
91
+ * tint of [tint]. Icon is an opinionated component designed to be used with single-color icons so
92
+ * that they can be tinted correctly for the component they are placed in. The recommended icon
93
+ * sizes can be retrieved using [GlimmerTheme.Companion.iconSizes]. A size can be set explicitly
94
+ * using [size], and components can use [LocalIconSize] to set the preferred size for any Icons
95
+ * inside the component. Use the other overload of Icon without a [tint] parameter to apply the
96
+ * recommended content color provided by a [surface]. For multicolored icons and icons that should
97
+ * not be tinted, set [tint] to [Color.Unspecified]. For generic images that should not be tinted,
98
+ * and should not use the provided icon size, use the generic [androidx.compose.foundation.Image]
99
+ * instead.
100
+ *
101
+ * @param imageVector [ImageVector] to draw inside this icon
102
+ * @param tint tint to be applied to [imageVector]. If [Color.Unspecified] is provided, then no tint
103
+ * is applied.
104
+ * @param contentDescription text used by accessibility services to describe what this icon
105
+ * represents. This should always be provided unless this icon is used for decorative purposes,
106
+ * and does not represent a meaningful action that a user can take. This text should be localized,
107
+ * such as by using [androidx.compose.ui.res.stringResource] or similar
108
+ * @param modifier the [Modifier] to be applied to this icon
109
+ * @see LocalIconSize
110
+ * @see GlimmerTheme.Companion.iconSizes
111
+ */
112
+ @Composable
113
+ public fun Icon(
114
+ imageVector: ImageVector,
115
+ tint: Color,
116
+ contentDescription: String?,
117
+ modifier: Modifier = Modifier,
118
+ ) {
119
+ Icon(
120
+ painter = rememberVectorPainter(imageVector),
121
+ tint =
122
+ if (tint.isSpecified) {
123
+ { tint }
124
+ } else null,
125
+ contentDescription = contentDescription,
126
+ modifier = modifier,
127
+ )
128
+ }
129
+
130
+ /**
131
+ * An icon component that draws [bitmap], with a default size of [LocalIconSize], and applies a
132
+ * content color tint. Icon is an opinionated component designed to be used with single-color icons
133
+ * so that they can be tinted correctly for the component they are placed in. The recommended icon
134
+ * sizes can be retrieved using [GlimmerTheme.Companion.iconSizes]. A size can be set explicitly
135
+ * using [size], and components can use [LocalIconSize] to set the preferred size for any Icons
136
+ * inside the component. The content color used to tint this icon is provided by [surface]. To set a
137
+ * custom tint color, use the Icon overload with a tint parameter. For multicolored icons and icons
138
+ * that should not be tinted, use the overload and set [Color.Unspecified] as the tint color. For
139
+ * generic images that should not be tinted, and should not use the provided icon size, use the
140
+ * generic [androidx.compose.foundation.Image] instead.
141
+ *
142
+ * @param bitmap [ImageBitmap] to draw inside this icon
143
+ * @param contentDescription text used by accessibility services to describe what this icon
144
+ * represents. This should always be provided unless this icon is used for decorative purposes,
145
+ * and does not represent a meaningful action that a user can take. This text should be localized,
146
+ * such as by using [androidx.compose.ui.res.stringResource] or similar
147
+ * @param modifier the [Modifier] to be applied to this icon
148
+ * @see LocalIconSize
149
+ * @see GlimmerTheme.Companion.iconSizes
150
+ */
151
+ @Composable
152
+ public fun Icon(bitmap: ImageBitmap, contentDescription: String?, modifier: Modifier = Modifier) {
153
+ val painter = remember(bitmap) { BitmapPainter(bitmap) }
154
+ Icon(painter = painter, contentDescription = contentDescription, modifier = modifier)
155
+ }
156
+
157
+ /**
158
+ * An icon component that draws [bitmap], with a default size of [LocalIconSize], and applies a tint
159
+ * of [tint]. Icon is an opinionated component designed to be used with single-color icons so that
160
+ * they can be tinted correctly for the component they are placed in. The recommended icon sizes can
161
+ * be retrieved using [GlimmerTheme.Companion.iconSizes]. A size can be set explicitly using [size],
162
+ * and components can use [LocalIconSize] to set the preferred size for any Icons inside the
163
+ * component. Use the other overload of Icon without a [tint] parameter to apply the recommended
164
+ * content color provided by a [surface]. For multicolored icons and icons that should not be
165
+ * tinted, set [tint] to [Color.Unspecified]. For generic images that should not be tinted, and
166
+ * should not use the provided icon size, use the generic [androidx.compose.foundation.Image]
167
+ * instead.
168
+ *
169
+ * @param bitmap [ImageBitmap] to draw inside this icon
170
+ * @param tint tint to be applied to [bitmap]. If [Color.Unspecified] is provided, then no tint is
171
+ * applied.
172
+ * @param contentDescription text used by accessibility services to describe what this icon
173
+ * represents. This should always be provided unless this icon is used for decorative purposes,
174
+ * and does not represent a meaningful action that a user can take. This text should be localized,
175
+ * such as by using [androidx.compose.ui.res.stringResource] or similar
176
+ * @param modifier the [Modifier] to be applied to this icon
177
+ * @see LocalIconSize
178
+ * @see GlimmerTheme.Companion.iconSizes
179
+ */
180
+ @Composable
181
+ public fun Icon(
182
+ bitmap: ImageBitmap,
183
+ tint: Color,
184
+ contentDescription: String?,
185
+ modifier: Modifier = Modifier,
186
+ ) {
187
+ val painter = remember(bitmap) { BitmapPainter(bitmap) }
188
+ Icon(
189
+ painter = painter,
190
+ tint =
191
+ if (tint.isSpecified) {
192
+ { tint }
193
+ } else null,
194
+ contentDescription = contentDescription,
195
+ modifier = modifier,
196
+ )
197
+ }
198
+
199
+ /**
200
+ * An icon component that draws [painter], with a default size of [LocalIconSize], and applies a
201
+ * content color tint. Icon is an opinionated component designed to be used with single-color icons
202
+ * so that they can be tinted correctly for the component they are placed in. The recommended icon
203
+ * sizes can be retrieved using [GlimmerTheme.Companion.iconSizes]. A size can be set explicitly
204
+ * using [size], and components can use [LocalIconSize] to set the preferred size for any Icons
205
+ * inside the component. The content color used to tint this icon is provided by [surface]. To set a
206
+ * custom tint color, use the Icon overload with a tint parameter. For multicolored icons and icons
207
+ * that should not be tinted, use the overload and set `null` for the tint parameter. For generic
208
+ * images that should not be tinted, and should not use the provided icon size, use the generic
209
+ * [androidx.compose.foundation.Image] instead.
210
+ *
211
+ * @param painter [Painter] to draw inside this icon
212
+ * @param contentDescription text used by accessibility services to describe what this icon
213
+ * represents. This should always be provided unless this icon is used for decorative purposes,
214
+ * and does not represent a meaningful action that a user can take. This text should be localized,
215
+ * such as by using [androidx.compose.ui.res.stringResource] or similar
216
+ * @param modifier the [Modifier] to be applied to this icon
217
+ * @see LocalIconSize
218
+ * @see GlimmerTheme.Companion.iconSizes
219
+ */
220
+ @Composable
221
+ public fun Icon(painter: Painter, contentDescription: String?, modifier: Modifier = Modifier) {
222
+ Icon(
223
+ painter = painter,
224
+ useContentColor = true,
225
+ tint = null,
226
+ contentDescription = contentDescription,
227
+ modifier = modifier,
228
+ )
229
+ }
230
+
231
+ /**
232
+ * An icon component that draws [painter], with a default size of [LocalIconSize], and applies a
233
+ * tint of [tint]. Icon is an opinionated component designed to be used with single-color icons so
234
+ * that they can be tinted correctly for the component they are placed in. The recommended icon
235
+ * sizes can be retrieved using [GlimmerTheme.Companion.iconSizes]. A size can be set explicitly
236
+ * using [size], and components can use [LocalIconSize] to set the preferred size for any Icons
237
+ * inside the component. Use the other overload of Icon without a [tint] parameter to apply the
238
+ * recommended content color provided by a [surface]. For multicolored icons and icons that should
239
+ * not be tinted, set [tint] to `null`. For generic images that should not be tinted, and should not
240
+ * use the provided icon size, use the generic [androidx.compose.foundation.Image] instead.
241
+ *
242
+ * @param painter [Painter] to draw inside this icon
243
+ * @param tint tint to be applied to [painter]. If null, then no tint is applied.
244
+ * @param contentDescription text used by accessibility services to describe what this icon
245
+ * represents. This should always be provided unless this icon is used for decorative purposes,
246
+ * and does not represent a meaningful action that a user can take. This text should be localized,
247
+ * such as by using [androidx.compose.ui.res.stringResource] or similar
248
+ * @param modifier the [Modifier] to be applied to this icon
249
+ * @see LocalIconSize
250
+ * @see GlimmerTheme.Companion.iconSizes
251
+ */
252
+ @Composable
253
+ public fun Icon(
254
+ painter: Painter,
255
+ tint: ColorProducer?,
256
+ contentDescription: String?,
257
+ modifier: Modifier = Modifier,
258
+ ) {
259
+ Icon(
260
+ painter = painter,
261
+ useContentColor = false,
262
+ tint = tint,
263
+ contentDescription = contentDescription,
264
+ modifier = modifier,
265
+ )
266
+ }
267
+
268
+ /**
269
+ * CompositionLocal containing the preferred size of an icon. This value will be used by [Icon] by
270
+ * default - it can be overridden with a [size] modifier.
271
+ */
272
+ public val LocalIconSize: ProvidableCompositionLocal<Dp> =
273
+ compositionLocalOf(structuralEqualityPolicy()) { GlimmerTheme._iconSizes.medium }
274
+
275
+ @Composable
276
+ private fun Icon(
277
+ painter: Painter,
278
+ useContentColor: Boolean,
279
+ tint: ColorProducer?,
280
+ contentDescription: String?,
281
+ modifier: Modifier,
282
+ ) {
283
+ val colorFilter =
284
+ if (useContentColor || tint != null) {
285
+ IconColorFilterElement(
286
+ useContentColor = useContentColor,
287
+ tint = tint,
288
+ painter = painter,
289
+ )
290
+ } else {
291
+ Modifier
292
+ }
293
+ val semantics =
294
+ if (contentDescription != null) {
295
+ Modifier.semantics {
296
+ this.contentDescription = contentDescription
297
+ this.role = Role.Image
298
+ }
299
+ } else {
300
+ Modifier
301
+ }
302
+ Box(
303
+ modifier
304
+ .toolingGraphicsLayer()
305
+ .size(LocalIconSize.current)
306
+ .then(colorFilter)
307
+ .paint(painter, contentScale = ContentScale.Fit)
308
+ .then(semantics)
309
+ )
310
+ }
311
+
312
+ @Suppress("ModifierNodeInspectableProperties")
313
+ private class IconColorFilterElement(
314
+ private val useContentColor: Boolean,
315
+ private val tint: ColorProducer?,
316
+ private val painter: Painter,
317
+ ) : ModifierNodeElement<IconColorFilterNode>() {
318
+ override fun create() = IconColorFilterNode(useContentColor, tint, painter)
319
+
320
+ override fun update(node: IconColorFilterNode) {
321
+ node.update(useContentColor, tint, painter)
322
+ }
323
+
324
+ override fun equals(other: Any?): Boolean {
325
+ if (this === other) return true
326
+ if (other !is IconColorFilterElement) return false
327
+
328
+ if (useContentColor != other.useContentColor) return false
329
+ if (tint != other.tint) return false
330
+ if (painter != other.painter) return false
331
+
332
+ return true
333
+ }
334
+
335
+ override fun hashCode(): Int {
336
+ var result = useContentColor.hashCode()
337
+ result = 31 * result + (tint?.hashCode() ?: 0)
338
+ result = 31 * result + painter.hashCode()
339
+ return result
340
+ }
341
+ }
342
+
343
+ private class IconColorFilterNode(
344
+ private var useContentColor: Boolean,
345
+ private var tint: ColorProducer?,
346
+ private var painter: Painter,
347
+ ) : DelegatingNode() {
348
+ val cacheDrawNode =
349
+ delegate(
350
+ CacheDrawModifierNode {
351
+ val layer = obtainGraphicsLayer()
352
+ layer.apply { record { drawContent() } }
353
+ var cachedTintColor = Color.Unspecified
354
+ onDrawWithContent {
355
+ val tintColor =
356
+ if (useContentColor) {
357
+ currentContentColor()
358
+ } else {
359
+ tint?.invoke() ?: Color.Unspecified
360
+ }
361
+ if (cachedTintColor != tintColor) {
362
+ cachedTintColor = tintColor
363
+ val cachedColorFilter =
364
+ if (tintColor.isSpecified) ColorFilter.tint(tintColor) else null
365
+ layer.colorFilter = cachedColorFilter
366
+ }
367
+ drawLayer(graphicsLayer = layer)
368
+ }
369
+ }
370
+ )
371
+
372
+ fun update(useContentColor: Boolean, tint: ColorProducer?, painter: Painter) {
373
+ val painterChanged = this.painter != painter
374
+ if (this.useContentColor != useContentColor || this.tint != tint || painterChanged) {
375
+ this.useContentColor = useContentColor
376
+ this.tint = tint
377
+ this.painter = painter
378
+ if (painterChanged) {
379
+ cacheDrawNode.invalidateDrawCache()
380
+ } else {
381
+ cacheDrawNode.invalidateDraw()
382
+ }
383
+ }
384
+ }
385
+ }
386
+ ```
387
+
388
+ <br />
@@ -0,0 +1,126 @@
1
+ When creating a Glimmer Icon component, refer to the following source code in
2
+ `IconButton.kt` for icon buttons:
3
+
4
+
5
+ ```kotlin
6
+ /*
7
+ * Copyright 2026 The Android Open Source Project
8
+ *
9
+ * Licensed under the Apache License, Version 2.0 (the "License");
10
+ * you may not use this file except in compliance with the License.
11
+ * You may obtain a copy of the License at
12
+ *
13
+ * http://www.apache.org/licenses/LICENSE-2.0
14
+ *
15
+ * Unless required by applicable law or agreed to in writing, software
16
+ * distributed under the License is distributed on an "AS IS" BASIS,
17
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ * See the License for the specific language governing permissions and
19
+ * limitations under the License.
20
+ */
21
+
22
+ package androidx.xr.glimmer
23
+
24
+ import androidx.compose.foundation.clickable
25
+ import androidx.compose.foundation.interaction.MutableInteractionSource
26
+ import androidx.compose.foundation.layout.Box
27
+ import androidx.compose.foundation.layout.PaddingValues
28
+ import androidx.compose.foundation.layout.defaultMinSize
29
+ import androidx.compose.foundation.layout.padding
30
+ import androidx.compose.runtime.Composable
31
+ import androidx.compose.runtime.CompositionLocalProvider
32
+ import androidx.compose.runtime.remember
33
+ import androidx.compose.ui.Alignment
34
+ import androidx.compose.ui.Modifier
35
+ import androidx.compose.ui.graphics.Color
36
+ import androidx.compose.ui.graphics.Shape
37
+ import androidx.compose.ui.semantics.Role
38
+ import androidx.compose.ui.semantics.role
39
+ import androidx.compose.ui.semantics.semantics
40
+ import androidx.compose.ui.unit.Dp
41
+ import androidx.compose.ui.unit.dp
42
+
43
+ /**
44
+ * IconButton is a component used for exposing supplementary actions with a single tap.
45
+ *
46
+ * Icon buttons are used when a compact button is required, such as in a toolbar or image list.
47
+ *
48
+ * [content] should typically be an [Icon]. If using a custom icon, note that the typical size for
49
+ * the internal icon is 32 x 32 dp. Container has an overall minimum size of 48 x 48 dp.
50
+ *
51
+ * @param onClick called when this icon button is clicked
52
+ * @param modifier the [Modifier] to be applied to this icon button
53
+ * @param enabled controls the enabled state of this icon button. When `false`, this icon button
54
+ * will not respond to user input
55
+ * @param shape the [Shape] used to clip this icon button
56
+ * @param color background color of this icon button
57
+ * @param contentColor content color used by components inside [content]
58
+ * @param contentPadding the spacing values to apply internally between the container and the
59
+ * content
60
+ * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
61
+ * emitting Interactions for this icon button. You can use this to change the icon button's
62
+ * appearance or preview the icon button in different states. Note that if `null` is provided,
63
+ * interactions will still happen internally.
64
+ * @param content the content of this icon button, typically an [Icon]
65
+ * @sample androidx.xr.glimmer.samples.IconButtonSample
66
+ */
67
+ @Composable
68
+ public fun IconButton(
69
+ onClick: () -> Unit,
70
+ modifier: Modifier = Modifier,
71
+ enabled: Boolean = true,
72
+ shape: Shape = GlimmerTheme.shapes.large,
73
+ color: Color = GlimmerTheme.colors.surface,
74
+ contentColor: Color = calculateContentColor(color),
75
+ contentPadding: PaddingValues = IconButtonDefaults.contentPadding,
76
+ interactionSource: MutableInteractionSource? = null,
77
+ content: @Composable () -> Unit,
78
+ ) {
79
+ val internalInteractionSource = interactionSource ?: remember { MutableInteractionSource() }
80
+
81
+ Box(
82
+ modifier
83
+ .semantics { role = Role.Button }
84
+ .surface(
85
+ enabled = enabled,
86
+ shape = shape,
87
+ color = color,
88
+ contentColor = contentColor,
89
+ depthEffect = null,
90
+ interactionSource = internalInteractionSource,
91
+ )
92
+ .clickable(
93
+ enabled = enabled,
94
+ interactionSource = internalInteractionSource,
95
+ onClick = onClick,
96
+ )
97
+ .defaultMinSize(IconButtonDefaults.minimumSize)
98
+ .padding(contentPadding),
99
+ contentAlignment = Alignment.Center,
100
+ ) {
101
+ CompositionLocalProvider(
102
+ LocalIconSize provides IconButtonDefaults.iconSize,
103
+ content = content,
104
+ )
105
+ }
106
+ }
107
+
108
+ /** Default values used for [IconButton]. */
109
+ public object IconButtonDefaults {
110
+ /** Default content padding for an [IconButton]. */
111
+ @get:Composable
112
+ public val contentPadding: PaddingValues
113
+ get() = PaddingValues(GlimmerTheme.componentSpacingValues.small)
114
+
115
+ /** Minimum size for icon-only buttons: [IconButton], [IconToggleButton]. */
116
+ internal val minimumSize: Dp
117
+ get() = 48.dp
118
+
119
+ /** Default icon size for icon-only buttons: [IconButton], [IconToggleButton]. */
120
+ @get:Composable
121
+ internal val iconSize: Dp
122
+ get() = GlimmerTheme.iconSizes.small
123
+ }
124
+ ```
125
+
126
+ <br />