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,224 @@
1
+ When simulating depth on AI glasses using shadows, refer to the following source
2
+ code in `DepthEffect.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.runtime.Immutable
25
+ import androidx.compose.ui.Modifier
26
+ import androidx.compose.ui.draw.ShadowScope
27
+ import androidx.compose.ui.draw.dropShadow
28
+ import androidx.compose.ui.geometry.Offset
29
+ import androidx.compose.ui.graphics.DefaultAlpha
30
+ import androidx.compose.ui.graphics.Shape
31
+ import androidx.compose.ui.graphics.drawscope.ContentDrawScope
32
+ import androidx.compose.ui.graphics.shadow.DropShadowPainter
33
+ import androidx.compose.ui.graphics.shadow.Shadow
34
+ import androidx.compose.ui.graphics.shadow.lerp
35
+ import androidx.compose.ui.node.DrawModifierNode
36
+ import androidx.compose.ui.node.ModifierNodeElement
37
+ import androidx.compose.ui.node.requireGraphicsContext
38
+ import androidx.compose.ui.platform.InspectorInfo
39
+
40
+ /**
41
+ * The depth effect establishes a sense of hierarchy by using shadows to occlude content underneath.
42
+ * It consists of two shadow layers, [layer1] and [layer2]. [layer2] is drawn on top of [layer1]:
43
+ *
44
+ * _________________
45
+ * | _________ |
46
+ * | | content | |
47
+ * | |_________| |
48
+ * | ___________ |
49
+ * | | layer 2 | |
50
+ * | |___________| |
51
+ * | _____________ |
52
+ * | | layer 1 | |
53
+ * | |_____________| |
54
+ * |_________________|
55
+ *
56
+ * [GlimmerTheme.depthEffectLevels] provides theme defined depth effect levels that should be used
57
+ * to add depth to surfaces.
58
+ *
59
+ * Higher level components apply the depth effect automatically when needed. The depth effect can
60
+ * also be configured through [surface]. To manually render depth shadows for advanced use-cases,
61
+ * see the [depthEffect] [Modifier].
62
+ *
63
+ * @property layer1 the 'base' [Shadow] layer, drawn first
64
+ * @property layer2 the second [Shadow] layer, drawn on top of [layer1]
65
+ */
66
+ @Immutable
67
+ public class DepthEffect(public val layer1: Shadow, public val layer2: Shadow) {
68
+ override fun equals(other: Any?): Boolean {
69
+ if (this === other) return true
70
+ if (other !is DepthEffect) return false
71
+
72
+ if (layer1 != other.layer1) return false
73
+ if (layer2 != other.layer2) return false
74
+
75
+ return true
76
+ }
77
+
78
+ override fun hashCode(): Int {
79
+ var result = layer1.hashCode()
80
+ result = 31 * result + layer2.hashCode()
81
+ return result
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Renders shadows for the provided [depthEffect].
87
+ *
88
+ * @param depthEffect Depth effect to render shadows for. If `null`, no shadows will be rendered.
89
+ * @param shape [Shape] of the shadows
90
+ */
91
+ public fun Modifier.depthEffect(depthEffect: DepthEffect?, shape: Shape): Modifier {
92
+ if (depthEffect == null) return this
93
+ return this then DepthEffectElement(depthEffect, shape)
94
+ }
95
+
96
+ /**
97
+ * Renders depth effect shadows by lerping between the provided [from] and [to] depth effects using
98
+ * [progress]. This allows for efficient animation - to render a static depth effect, see the other
99
+ * overload.
100
+ *
101
+ * @param from Depth effect to render shadows for when [progress] is 0.
102
+ * @param to Depth effect to render shadows for when [progress] is 1.
103
+ * @param shape [Shape] of the shadows
104
+ * @param progress progress of the animation between [from] and [to], from 0 to 1. Values may go
105
+ * outside these bounds for overshoot / undershoot.
106
+ */
107
+ // TODO: can be simplified with style API in the future
108
+ internal fun Modifier.depthEffect(
109
+ from: DepthEffect?,
110
+ to: DepthEffect?,
111
+ shape: Shape,
112
+ progress: () -> Float,
113
+ ): Modifier {
114
+ // dropShadow draws the shadow, and then the content on top. So in order to get layer2 to
115
+ // render on top of layer1, we draw layer1 first - this means that layer1's dropShadow will
116
+ // draw its shadow, and then its content on top (since the 'content' includes children
117
+ // modifiers, this includes layer2's shadow).
118
+ return this.dropShadow(shape) {
119
+ val shadow = lerp(from?.layer1, to?.layer1, progress())
120
+ if (shadow != null) {
121
+ updateFrom(shadow)
122
+ }
123
+ }
124
+ .dropShadow(shape) {
125
+ val shadow = lerp(from?.layer2, to?.layer2, progress())
126
+ if (shadow != null) {
127
+ updateFrom(shadow)
128
+ }
129
+ }
130
+ }
131
+
132
+ private fun ShadowScope.updateFrom(shadow: Shadow) {
133
+ this.radius = shadow.radius.toPx()
134
+ this.spread = shadow.spread.toPx()
135
+ this.offset = Offset(shadow.offset.x.toPx(), shadow.offset.y.toPx())
136
+ this.color = shadow.color
137
+ this.brush = shadow.brush
138
+ this.alpha = shadow.alpha
139
+ this.blendMode = shadow.blendMode
140
+ }
141
+
142
+ private class DepthEffectElement(private val depthEffect: DepthEffect, private val shape: Shape) :
143
+ ModifierNodeElement<DepthEffectNode>() {
144
+
145
+ override fun create(): DepthEffectNode = DepthEffectNode(depthEffect, shape)
146
+
147
+ override fun update(node: DepthEffectNode) {
148
+ node.update(depthEffect, shape)
149
+ }
150
+
151
+ override fun equals(other: Any?): Boolean {
152
+ if (this === other) return true
153
+ if (other !is DepthEffectElement) return false
154
+
155
+ if (depthEffect != other.depthEffect) return false
156
+ if (shape != other.shape) return false
157
+
158
+ return true
159
+ }
160
+
161
+ override fun hashCode(): Int {
162
+ var result = depthEffect.hashCode()
163
+ result = 31 * result + shape.hashCode()
164
+ return result
165
+ }
166
+
167
+ override fun InspectorInfo.inspectableProperties() {
168
+ name = "depthEffect"
169
+ properties["depthEffect"] = depthEffect
170
+ properties["shape"] = shape
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Renders shadows for the provided [shape] and [depthEffect].
176
+ *
177
+ * @param depthEffect Depth effect to render shadows for.
178
+ * @param shape [Shape] of the shadows.
179
+ */
180
+ internal class DepthEffectNode(private var depthEffect: DepthEffect, private var shape: Shape) :
181
+ Modifier.Node(), DrawModifierNode {
182
+
183
+ private var layer1ShadowPainter: DropShadowPainter? = null
184
+ private var layer2ShadowPainter: DropShadowPainter? = null
185
+
186
+ fun update(depthEffect: DepthEffect, shape: Shape) {
187
+ if (this.depthEffect.layer1 != depthEffect.layer1) layer1ShadowPainter = null
188
+ if (this.depthEffect.layer2 != depthEffect.layer2) layer2ShadowPainter = null
189
+ if (this.shape != shape) {
190
+ layer1ShadowPainter = null
191
+ layer2ShadowPainter = null
192
+ }
193
+ this.shape = shape
194
+ this.depthEffect = depthEffect
195
+ }
196
+
197
+ override fun ContentDrawScope.draw() {
198
+ drawDepthEffect()
199
+ drawContent()
200
+ }
201
+
202
+ internal fun ContentDrawScope.drawDepthEffect(alpha: Float = DefaultAlpha) {
203
+ // In order to get layer2 to render on top of layer1, we draw layer1 first.
204
+ with(obtainLayer1ShadowPainter()) { draw(size, alpha = alpha) }
205
+ with(obtainLayer2ShadowPainter()) { draw(size, alpha = alpha) }
206
+ }
207
+
208
+ private fun obtainLayer1ShadowPainter(): DropShadowPainter =
209
+ layer1ShadowPainter
210
+ ?: requireGraphicsContext()
211
+ .shadowContext
212
+ .createDropShadowPainter(shape, depthEffect.layer1)
213
+ .also { layer1ShadowPainter = it }
214
+
215
+ private fun obtainLayer2ShadowPainter(): DropShadowPainter =
216
+ layer2ShadowPainter
217
+ ?: requireGraphicsContext()
218
+ .shadowContext
219
+ .createDropShadowPainter(shape, depthEffect.layer2)
220
+ .also { layer2ShadowPainter = it }
221
+ }
222
+ ```
223
+
224
+ <br />
@@ -0,0 +1,105 @@
1
+ When simulating depth on AI glasses using shadows, refer to the following source
2
+ code in `DepthEffectLevels.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.runtime.Immutable
25
+ import androidx.compose.ui.graphics.Color
26
+ import androidx.compose.ui.graphics.shadow.Shadow
27
+ import androidx.compose.ui.unit.dp
28
+
29
+ /**
30
+ * Jetpack Compose Glimmer components can use [DepthEffect] to establish a sense of hierarchy.
31
+ * [DepthEffectLevels] contains different levels of [DepthEffect] to express this hierarchy. Higher
32
+ * levels contain larger shadows, and represent components with a higher z-order than lower levels.
33
+ * In their baseline state (not focused) most components should have no (`null`) [DepthEffect].
34
+ *
35
+ * @property level1 the lowest level of [DepthEffect]. This level will have the smallest shadows.
36
+ * @property level2 a level of [DepthEffect] higher than [level1] and lower than [level3].
37
+ * @property level3 a level of [DepthEffect] higher than [level2] and lower than [level4].
38
+ * @property level4 a level of [DepthEffect] higher than [level3] and lower than [level5].
39
+ * @property level5 the highest level of [DepthEffect]. This level will have the largest shadows.
40
+ * @see DepthEffect
41
+ * @see depthEffect
42
+ */
43
+ @Immutable
44
+ public class DepthEffectLevels(
45
+ public val level1: DepthEffect = DepthEffectLevel1,
46
+ public val level2: DepthEffect = DepthEffectLevel2,
47
+ public val level3: DepthEffect = DepthEffectLevel3,
48
+ public val level4: DepthEffect = DepthEffectLevel4,
49
+ public val level5: DepthEffect = DepthEffectLevel5,
50
+ ) {
51
+ override fun equals(other: Any?): Boolean {
52
+ if (this === other) return true
53
+ if (other !is DepthEffectLevels) return false
54
+
55
+ if (level1 != other.level1) return false
56
+ if (level2 != other.level2) return false
57
+ if (level3 != other.level3) return false
58
+ if (level4 != other.level4) return false
59
+ if (level5 != other.level5) return false
60
+
61
+ return true
62
+ }
63
+
64
+ override fun hashCode(): Int {
65
+ var result = level1.hashCode()
66
+ result = 31 * result + level2.hashCode()
67
+ result = 31 * result + level3.hashCode()
68
+ result = 31 * result + level4.hashCode()
69
+ result = 31 * result + level5.hashCode()
70
+ return result
71
+ }
72
+
73
+ override fun toString(): String {
74
+ return "DepthEffectLevels(level1=$level1, level2=$level2, level3=$level3, level4=$level4, level5=$level5)"
75
+ }
76
+ }
77
+
78
+ private val DepthEffectLevel1 =
79
+ DepthEffect(
80
+ layer1 = Shadow(radius = 12.dp, color = Color.Black, spread = 6.dp, alpha = 0.90f),
81
+ layer2 = Shadow(radius = 6.dp, color = Color.Black, spread = 2.dp),
82
+ )
83
+ private val DepthEffectLevel2 =
84
+ DepthEffect(
85
+ layer1 = Shadow(radius = 23.dp, color = Color.Black, spread = 13.dp, alpha = 0.90f),
86
+ layer2 = Shadow(radius = 8.dp, color = Color.Black, spread = 5.dp),
87
+ )
88
+ private val DepthEffectLevel3 =
89
+ DepthEffect(
90
+ layer1 = Shadow(radius = 34.dp, color = Color.Black, spread = 19.dp, alpha = 0.90f),
91
+ layer2 = Shadow(radius = 9.dp, color = Color.Black, spread = 7.dp),
92
+ )
93
+ private val DepthEffectLevel4 =
94
+ DepthEffect(
95
+ layer1 = Shadow(radius = 45.dp, color = Color.Black, spread = 26.dp, alpha = 0.90f),
96
+ layer2 = Shadow(radius = 11.dp, color = Color.Black, spread = 10.dp),
97
+ )
98
+ private val DepthEffectLevel5 =
99
+ DepthEffect(
100
+ layer1 = Shadow(radius = 56.dp, color = Color.Black, spread = 32.dp, alpha = 0.90f),
101
+ layer2 = Shadow(radius = 12.dp, color = Color.Black, spread = 12.dp),
102
+ )
103
+ ```
104
+
105
+ <br />
@@ -0,0 +1,270 @@
1
+ When creating a `Typography` instance with the Google Sans Flex configuration,
2
+ refer to the following source code in `GoogleSansFlexTypography.kt`:
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
+ @file:Suppress("MentionsGoogle")
23
+
24
+ package androidx.xr.glimmer.googlefonts
25
+
26
+ import androidx.compose.ui.text.TextStyle
27
+ import androidx.compose.ui.text.font.FontFamily
28
+ import androidx.compose.ui.text.font.FontVariation
29
+ import androidx.compose.ui.text.font.FontWeight
30
+ import androidx.compose.ui.text.googlefonts.Font
31
+ import androidx.compose.ui.text.googlefonts.GoogleFont
32
+ import androidx.compose.ui.text.style.LineHeightStyle
33
+ import androidx.compose.ui.unit.sp
34
+ import androidx.xr.glimmer.Typography
35
+
36
+ /**
37
+ * Returns a [Typography] instance configured with Google Sans Flex and customized with the
38
+ * recommended settings for Jetpack Compose Glimmer.
39
+ *
40
+ * Note: Google Sans Flex is a variable font. It is recommended to configure attributes such as
41
+ * weight, slant, and grade by using [FontVariation.Settings] (e.g. [FontVariation.weight]) rather
42
+ * than the [TextStyle] properties.
43
+ *
44
+ * @sample androidx.xr.glimmer.googlefonts.samples.GoogleSansFlexTypographySample
45
+ * @param titleLarge the [TextStyle] for [Typography.titleLarge]
46
+ * @param titleLargeVariationSettings the [FontVariation.Settings] for [Typography.titleLarge].
47
+ * @param titleMedium the [TextStyle] for [Typography.titleMedium].
48
+ * @param titleMediumVariationSettings the [FontVariation.Settings] for [Typography.titleMedium].
49
+ * @param titleSmall the [TextStyle] for [Typography.titleSmall].
50
+ * @param titleSmallVariationSettings the [FontVariation.Settings] for [Typography.titleSmall].
51
+ * @param bodyLarge the [TextStyle] for [Typography.bodyLarge].
52
+ * @param bodyLargeVariationSettings the [FontVariation.Settings] for [Typography.bodyLarge].
53
+ * @param bodyMedium the [TextStyle] for [Typography.bodyMedium].
54
+ * @param bodyMediumVariationSettings the [FontVariation.Settings] for [Typography.bodyMedium].
55
+ * @param bodySmall the [TextStyle] for [Typography.bodySmall].
56
+ * @param bodySmallVariationSettings the [FontVariation.Settings] for [Typography.bodySmall].
57
+ * @param caption the [TextStyle] for [Typography.caption].
58
+ * @param captionVariationSettings the [FontVariation.Settings] for [Typography.caption].
59
+ */
60
+ @Suppress("MentionsGoogle")
61
+ public fun createGoogleSansFlexTypography(
62
+ titleLarge: TextStyle = GoogleSansFlexTypographyDefaults.TitleLarge,
63
+ titleLargeVariationSettings: FontVariation.Settings =
64
+ GoogleSansFlexTypographyDefaults.TitleLargeVariationSettings,
65
+ titleMedium: TextStyle = GoogleSansFlexTypographyDefaults.TitleMedium,
66
+ titleMediumVariationSettings: FontVariation.Settings =
67
+ GoogleSansFlexTypographyDefaults.TitleMediumVariationSettings,
68
+ titleSmall: TextStyle = GoogleSansFlexTypographyDefaults.TitleSmall,
69
+ titleSmallVariationSettings: FontVariation.Settings =
70
+ GoogleSansFlexTypographyDefaults.TitleSmallVariationSettings,
71
+ bodyLarge: TextStyle = GoogleSansFlexTypographyDefaults.BodyLarge,
72
+ bodyLargeVariationSettings: FontVariation.Settings =
73
+ GoogleSansFlexTypographyDefaults.BodyLargeVariationSettings,
74
+ bodyMedium: TextStyle = GoogleSansFlexTypographyDefaults.BodyMedium,
75
+ bodyMediumVariationSettings: FontVariation.Settings =
76
+ GoogleSansFlexTypographyDefaults.BodyMediumVariationSettings,
77
+ bodySmall: TextStyle = GoogleSansFlexTypographyDefaults.BodySmall,
78
+ bodySmallVariationSettings: FontVariation.Settings =
79
+ GoogleSansFlexTypographyDefaults.BodySmallVariationSettings,
80
+ caption: TextStyle = GoogleSansFlexTypographyDefaults.Caption,
81
+ captionVariationSettings: FontVariation.Settings =
82
+ GoogleSansFlexTypographyDefaults.CaptionVariationSettings,
83
+ ): Typography {
84
+ val titleLargeFontFamily = FontFamily(GoogleSansFlexFont, titleLargeVariationSettings)
85
+ val titleMediumFontFamily = FontFamily(GoogleSansFlexFont, titleMediumVariationSettings)
86
+ val titleSmallFontFamily = FontFamily(GoogleSansFlexFont, titleSmallVariationSettings)
87
+ val bodyLargeFontFamily = FontFamily(GoogleSansFlexFont, bodyLargeVariationSettings)
88
+ val bodyMediumFontFamily = FontFamily(GoogleSansFlexFont, bodyMediumVariationSettings)
89
+ val bodySmallFontFamily = FontFamily(GoogleSansFlexFont, bodySmallVariationSettings)
90
+ val captionFontFamily = FontFamily(GoogleSansFlexFont, captionVariationSettings)
91
+
92
+ return Typography(
93
+ titleLarge = titleLarge.copy(fontFamily = titleLargeFontFamily),
94
+ titleMedium = titleMedium.copy(fontFamily = titleMediumFontFamily),
95
+ titleSmall = titleSmall.copy(fontFamily = titleSmallFontFamily),
96
+ bodyLarge = bodyLarge.copy(fontFamily = bodyLargeFontFamily),
97
+ bodyMedium = bodyMedium.copy(fontFamily = bodyMediumFontFamily),
98
+ bodySmall = bodySmall.copy(fontFamily = bodySmallFontFamily),
99
+ caption = caption.copy(fontFamily = captionFontFamily),
100
+ )
101
+ }
102
+
103
+ /** Default variable font configurations for using Google Sans Flex in Jetpack Compose Glimmer */
104
+ @Suppress("MentionsGoogle")
105
+ public object GoogleSansFlexTypographyDefaults {
106
+ private val RoundVariationSetting = FontVariation.Setting("ROND", 100.0f)
107
+
108
+ /** Default [TextStyle] for [Typography.titleLarge]. */
109
+ public val TitleLarge: TextStyle =
110
+ TextStyle(
111
+ fontWeight = FontWeight.Normal,
112
+ fontSize = 30.sp,
113
+ lineHeight = 36.sp,
114
+ letterSpacing = DefaultLetterSpacing,
115
+ lineHeightStyle = DefaultLineHeightStyle,
116
+ )
117
+
118
+ /** Default [FontVariation.Settings] for [Typography.titleLarge]. */
119
+ public val TitleLargeVariationSettings: FontVariation.Settings =
120
+ FontVariation.Settings(
121
+ FontVariation.grade(0),
122
+ FontVariation.weight(750),
123
+ FontVariation.slant(0f),
124
+ FontVariation.width(100f),
125
+ FontVariation.opticalSizing(9.sp),
126
+ RoundVariationSetting,
127
+ )
128
+
129
+ /** Default [TextStyle] for [Typography.titleMedium]. */
130
+ public val TitleMedium: TextStyle =
131
+ TextStyle(
132
+ fontWeight = FontWeight.Normal,
133
+ fontSize = 24.sp,
134
+ lineHeight = 28.sp,
135
+ letterSpacing = DefaultLetterSpacing,
136
+ lineHeightStyle = DefaultLineHeightStyle,
137
+ )
138
+
139
+ /** Default [FontVariation.Settings] for [Typography.titleMedium]. */
140
+ public val TitleMediumVariationSettings: FontVariation.Settings =
141
+ FontVariation.Settings(
142
+ FontVariation.grade(0),
143
+ FontVariation.weight(750),
144
+ FontVariation.slant(0f),
145
+ FontVariation.width(100f),
146
+ FontVariation.opticalSizing(9.sp),
147
+ RoundVariationSetting,
148
+ )
149
+
150
+ /** Default [TextStyle] for [Typography.titleSmall]. */
151
+ public val TitleSmall: TextStyle =
152
+ TextStyle(
153
+ fontWeight = FontWeight.Normal,
154
+ fontSize = 20.sp,
155
+ lineHeight = 28.sp,
156
+ letterSpacing = DefaultLetterSpacing,
157
+ lineHeightStyle = DefaultLineHeightStyle,
158
+ )
159
+
160
+ /** Default [FontVariation.Settings] for [Typography.titleSmall]. */
161
+ public val TitleSmallVariationSettings: FontVariation.Settings =
162
+ FontVariation.Settings(
163
+ FontVariation.grade(0),
164
+ FontVariation.weight(750),
165
+ FontVariation.slant(0f),
166
+ FontVariation.width(100f),
167
+ FontVariation.opticalSizing(9.sp),
168
+ RoundVariationSetting,
169
+ )
170
+
171
+ /** Default [TextStyle] for [Typography.bodyLarge]. */
172
+ public val BodyLarge: TextStyle =
173
+ TextStyle(
174
+ fontWeight = FontWeight.Normal,
175
+ fontSize = 30.sp,
176
+ lineHeight = 36.sp,
177
+ letterSpacing = DefaultLetterSpacing,
178
+ lineHeightStyle = DefaultLineHeightStyle,
179
+ )
180
+
181
+ /** Default [FontVariation.Settings] for [Typography.bodyLarge]. */
182
+ public val BodyLargeVariationSettings: FontVariation.Settings =
183
+ FontVariation.Settings(
184
+ FontVariation.grade(0),
185
+ FontVariation.weight(520),
186
+ FontVariation.slant(0f),
187
+ FontVariation.width(100f),
188
+ FontVariation.opticalSizing(9.sp),
189
+ RoundVariationSetting,
190
+ )
191
+
192
+ /** Default [TextStyle] for [Typography.bodyMedium]. */
193
+ public val BodyMedium: TextStyle =
194
+ TextStyle(
195
+ fontWeight = FontWeight.Normal,
196
+ fontSize = 24.sp,
197
+ lineHeight = 36.sp,
198
+ letterSpacing = DefaultLetterSpacing,
199
+ lineHeightStyle = DefaultLineHeightStyle,
200
+ )
201
+
202
+ /** Default [FontVariation.Settings] for [Typography.bodyMedium]. */
203
+ public val BodyMediumVariationSettings: FontVariation.Settings =
204
+ FontVariation.Settings(
205
+ FontVariation.grade(0),
206
+ FontVariation.weight(520),
207
+ FontVariation.slant(0f),
208
+ FontVariation.width(100f),
209
+ FontVariation.opticalSizing(9.sp),
210
+ RoundVariationSetting,
211
+ )
212
+
213
+ /** Default [TextStyle] for [Typography.bodySmall]. */
214
+ public val BodySmall: TextStyle =
215
+ TextStyle(
216
+ fontWeight = FontWeight.Normal,
217
+ fontSize = 20.sp,
218
+ lineHeight = 28.sp,
219
+ letterSpacing = DefaultLetterSpacing,
220
+ lineHeightStyle = DefaultLineHeightStyle,
221
+ )
222
+
223
+ /** Default [FontVariation.Settings] for [Typography.bodySmall]. */
224
+ public val BodySmallVariationSettings: FontVariation.Settings =
225
+ FontVariation.Settings(
226
+ FontVariation.grade(0),
227
+ FontVariation.weight(520),
228
+ FontVariation.slant(0f),
229
+ FontVariation.width(100f),
230
+ FontVariation.opticalSizing(9.sp),
231
+ RoundVariationSetting,
232
+ )
233
+
234
+ /** Default [TextStyle] for [Typography.caption]. */
235
+ public val Caption: TextStyle =
236
+ TextStyle(
237
+ fontWeight = FontWeight.Normal,
238
+ fontSize = 18.sp,
239
+ lineHeight = 24.sp,
240
+ letterSpacing = DefaultLetterSpacing,
241
+ lineHeightStyle = DefaultLineHeightStyle,
242
+ )
243
+
244
+ /** Default [FontVariation.Settings] for [Typography.caption]. */
245
+ public val CaptionVariationSettings: FontVariation.Settings =
246
+ FontVariation.Settings(
247
+ FontVariation.grade(0),
248
+ FontVariation.weight(650),
249
+ FontVariation.slant(0f),
250
+ FontVariation.width(100f),
251
+ FontVariation.opticalSizing(9.sp),
252
+ RoundVariationSetting,
253
+ )
254
+ }
255
+
256
+ private val GoogleSansFlexFont = GoogleFont("Google Sans Flex")
257
+
258
+ private val DefaultLetterSpacing = 0.sp
259
+
260
+ private val DefaultLineHeightStyle: LineHeightStyle =
261
+ LineHeightStyle(
262
+ alignment = LineHeightStyle.Alignment.Proportional,
263
+ trim = LineHeightStyle.Trim.FirstLineTop,
264
+ )
265
+
266
+ private fun FontFamily(font: GoogleFont, variationSettings: FontVariation.Settings): FontFamily =
267
+ FontFamily(Font(googleFont = font, variationSettings = variationSettings))
268
+ ```
269
+
270
+ <br />