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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +24 -0
- package/README.md +175 -168
- package/THIRD_PARTY_NOTICES.md +224 -4
- package/agents/android-architect.md +89 -0
- package/agents/android-performance-engineer.md +92 -0
- package/agents/android-test-engineer.md +97 -0
- package/agents/flutter-test-engineer.md +2 -0
- package/agents/ios-architect.md +93 -0
- package/agents/ios-performance-engineer.md +92 -0
- package/agents/ios-test-engineer.md +95 -0
- package/agents/lead-mobile.md +10 -1
- package/agents/mobile-staff-engineer.md +1 -1
- package/agents/rn-architect.md +94 -0
- package/agents/rn-performance-engineer.md +92 -0
- package/agents/rn-test-engineer.md +98 -0
- package/bin/reis-mobile.mjs +59 -17
- package/commands/debate.md +10 -1
- package/commands/debug.md +60 -0
- package/commands/reis-mobile.md +7 -2
- package/core/config/project.mjs +59 -0
- package/core/registry/frontmatter.mjs +15 -4
- package/core/registry/registry.mjs +21 -1
- package/core/router/intents.mjs +2 -0
- package/core/router/router.mjs +10 -5
- package/package.json +1 -1
- package/skills/android-adaptive/SKILL.md +304 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +112 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +69 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +81 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +170 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +415 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +51 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +73 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +170 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +333 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/tooling/debug.md +114 -0
- package/skills/android-adaptive/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/skills/android-agp-9-upgrade/SKILL.md +106 -0
- package/skills/android-agp-9-upgrade/references/android/build/migrate-to-built-in-kotlin.md +416 -0
- package/skills/android-agp-9-upgrade/references/android/build/releases/agp-9-0-0-release-notes.md +554 -0
- package/skills/android-agp-9-upgrade/references/buildconfig.md +54 -0
- package/skills/android-agp-9-upgrade/references/ksp-kapt.md +39 -0
- package/skills/android-agp-9-upgrade/references/paparazzi-gradle-9.md +30 -0
- package/skills/android-agp-9-upgrade/references/recipes.md +62 -0
- package/skills/android-appfunctions/SKILL.md +74 -0
- package/skills/android-appfunctions/references/adb-interaction-testing.md +95 -0
- package/skills/android-appfunctions/references/context.md +26 -0
- package/skills/android-appfunctions/references/feature-discovery-analysis.md +71 -0
- package/skills/android-appfunctions/references/implementation-configuration.md +282 -0
- package/skills/android-appfunctions/references/kdoc-refinement-optimization.md +75 -0
- package/skills/android-appfunctions/references/migrate-to-service-entry-point.md +226 -0
- package/skills/android-camerax/SKILL.md +135 -0
- package/skills/android-camerax/references/camera1-to-camerax.md +198 -0
- package/skills/android-camerax/references/camera2-to-camerax.md +193 -0
- package/skills/android-camerax/references/expert-blueprints.md +58 -0
- package/skills/android-camerax/references/foldables.md +83 -0
- package/skills/android-camerax/references/immutability.md +60 -0
- package/skills/android-camerax/references/low-light.md +124 -0
- package/skills/android-camerax/references/mlkit-spatial.md +75 -0
- package/skills/android-camerax/references/modern-apis.md +42 -0
- package/skills/android-camerax/references/testing.md +69 -0
- package/skills/android-camerax/references/thermals.md +85 -0
- package/skills/android-camerax/references/wear-os.md +76 -0
- package/skills/android-camerax/references/xr.md +54 -0
- package/skills/android-cli/SKILL.md +474 -0
- package/skills/android-cli/references/interact.md +113 -0
- package/skills/android-cli/references/journeys.md +120 -0
- package/skills/android-code-review/SKILL.md +58 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/SKILL.md +340 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +67 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md +388 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md +139 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md +148 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md +107 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md +90 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md +69 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md +82 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md +213 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-samples-source.md +176 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-source.md +203 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-samples-source.md +296 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-source.md +515 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffect-source.md +224 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffectlevels-source.md +105 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmersansflextypography-source.md +270 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmertheme-source.md +182 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/icon-source.md +388 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconbutton-source.md +126 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconsizes-source.md +78 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/list-source.md +27 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/listitem-source.md +272 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/liststate-source.md +427 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/material-hct-source.md +217 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/projectedcontext-source.md +265 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stack-source.md +368 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackitemscope-source.md +440 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackstate-source.md +325 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/surface-source.md +1211 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-samples-source.md +101 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-source.md +131 -0
- package/skills/android-edge-to-edge/SKILL.md +429 -0
- package/skills/android-engage-sdk-integration/SKILL.md +130 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/faq.md +439 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/food.md +1149 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/healthandfitness.md +1055 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/listen.md +1050 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/otherverticals.md +1301 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/read.md +910 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/shopping.md +1224 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/social.md +719 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/travel.md +1413 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/continue-watching/index.md +19 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/entitlements.md +353 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/getting-started.md +202 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/recommendations.md +471 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/watch.md +1081 -0
- package/skills/android-engage-sdk-integration/references/clusters.md +154 -0
- package/skills/android-engage-sdk-integration/references/common.md +519 -0
- package/skills/android-engage-sdk-integration/references/patterns.md +527 -0
- package/skills/android-engage-sdk-integration/references/requests.md +260 -0
- package/skills/android-engage-sdk-integration/references/schemas/food.md +509 -0
- package/skills/android-engage-sdk-integration/references/schemas/listen.md +842 -0
- package/skills/android-engage-sdk-integration/references/schemas/other.md +220 -0
- package/skills/android-engage-sdk-integration/references/schemas/read.md +412 -0
- package/skills/android-engage-sdk-integration/references/schemas/shopping.md +357 -0
- package/skills/android-engage-sdk-integration/references/schemas/social.md +228 -0
- package/skills/android-engage-sdk-integration/references/schemas/travel.md +923 -0
- package/skills/android-engage-sdk-integration/references/schemas/tv.md +1226 -0
- package/skills/android-engage-sdk-integration/references/schemas/watch.md +1137 -0
- package/skills/android-engage-sdk-integration/references/troubleshooting.md +39 -0
- package/skills/android-gradle-build-debug/SKILL.md +71 -0
- package/skills/android-intent-security/SKILL.md +550 -0
- package/skills/android-leanback-to-compose-tv-migration/SKILL.md +743 -0
- package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/get-started/navigation.md +372 -0
- package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/browse.md +243 -0
- package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/index.md +153 -0
- package/skills/android-media3-cast-integration/SKILL.md +236 -0
- package/skills/android-media3-cast-integration/references/android/media/media3/cast/create-castplayer.md +390 -0
- package/skills/android-media3-cast-integration/references/android/media/media3/cast/customize-castoptions.md +93 -0
- package/skills/android-media3-cast-integration/references/android/media/media3/cast/index.md +21 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/SKILL.md +127 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/analysis-of-the-project-and-layout.md +42 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +171 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md +299 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md +286 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +197 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/identify-optimal-xml-candidate.md +31 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/xml-layout-migration.md +86 -0
- package/skills/android-ml-kit-genai-prompt-api/SKILL.md +124 -0
- package/skills/android-ml-kit-genai-prompt-api/references/get-started.md +272 -0
- package/skills/android-ml-kit-genai-prompt-api/references/prefix-caching.md +146 -0
- package/skills/android-ml-kit-genai-prompt-api/references/prompt-design.md +55 -0
- package/skills/android-ml-kit-genai-prompt-api/references/prompt-optimization.md +74 -0
- package/skills/android-ml-kit-genai-prompt-api/references/structured-output.md +219 -0
- package/skills/android-ml-kit-genai-prompt-api/references/system-instructions.md +71 -0
- package/skills/android-navigation-3/SKILL.md +122 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/index.md +51 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/migration-guide.md +670 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/animations.md +147 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basic.md +89 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +85 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +90 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +195 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/common-ui.md +200 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +182 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional.md +230 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +176 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +140 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +184 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/dialog.md +107 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +185 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +145 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +283 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +287 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +468 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +371 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-event.md +273 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-state.md +266 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +435 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +244 -0
- package/skills/android-navigation-3/references/android/guide/navigation/type-safe-destinations.md +129 -0
- package/skills/android-navigation-event/SKILL.md +312 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/dispatcher.md +134 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/handle-back.md +217 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/index.md +83 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/setup.md +32 -0
- package/skills/android-play-billing-library-version-upgrade/SKILL.md +96 -0
- package/skills/android-play-billing-library-version-upgrade/references/android/google/play/billing/release-notes.md +1240 -0
- package/skills/android-play-billing-library-version-upgrade/references/migration-logic.md +78 -0
- package/skills/android-play-billing-library-version-upgrade/references/version-checklist.md +54 -0
- package/skills/android-play-policy-insights/SKILL.md +172 -0
- package/skills/android-play-policy-insights/resources/common_mandates.md +100 -0
- package/skills/android-play-policy-insights/resources/compliance_report_template.md +59 -0
- package/skills/android-play-policy-insights/resources/critic.md +86 -0
- package/skills/android-play-policy-insights/resources/goal_data_safety.md +212 -0
- package/skills/android-play-policy-insights/resources/goal_permissions_and_apis.md +459 -0
- package/skills/android-play-policy-insights/resources/goal_user_account.md +106 -0
- package/skills/android-play-policy-insights/resources/policies.json +321 -0
- package/skills/android-play-policy-insights/resources/scanner_config.json +843 -0
- package/skills/android-play-policy-insights/scripts/generate_report.py +860 -0
- package/skills/android-play-policy-insights/scripts/orchestrator.py +1313 -0
- package/skills/android-play-policy-insights/scripts/play_store_scraper.py +410 -0
- package/skills/android-play-policy-insights/scripts/scanner.py +261 -0
- package/skills/android-play-policy-insights/scripts/template_engine.py +243 -0
- package/skills/android-profiler/SKILL.md +60 -0
- package/skills/android-profiler/analysis/analysis_orchestrator.md +32 -0
- package/skills/android-profiler/analysis/workflows/perfetto-sql/perfetto_sql.md +28 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +121 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +51 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +7 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +56 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +51 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +46 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +41 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +55 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +33 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +172 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/triage.md +94 -0
- package/skills/android-profiler/recording/recording_orchestrator.md +36 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +148 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +43 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +35 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +21 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +37 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +45 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +21 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +33 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +102 -0
- package/skills/android-profiler/references/env_setup.md +15 -0
- package/skills/android-profiler/references/perfetto/setup.md +29 -0
- package/skills/android-profiler/references/perfetto/sql.md +327 -0
- package/skills/android-r8-analyzer/SKILL.md +72 -0
- package/skills/android-r8-analyzer/references/CONFIGURATION-ANALYZER.md +287 -0
- package/skills/android-r8-analyzer/references/CONFIGURATION.md +44 -0
- package/skills/android-r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
- package/skills/android-r8-analyzer/references/REDUNDANT-RULES.md +222 -0
- package/skills/android-r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
- package/skills/android-r8-analyzer/references/REPORT_FORMAT.md +51 -0
- package/skills/android-r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +252 -0
- package/skills/android-r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
- package/skills/android-restore-credentials/SKILL.md +359 -0
- package/skills/android-restore-credentials/references/android/guide/topics/manifest/application-element.md +832 -0
- package/skills/android-restore-credentials/references/android/identity/passkeys/create-passkeys.md +327 -0
- package/skills/android-restore-credentials/references/android/identity/passkeys/sign-in-with-passkeys.md +219 -0
- package/skills/android-styles/SKILL.md +229 -0
- package/skills/android-styles/references/android/develop/ui/compose/designsystems/custom.md +459 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/fundamentals.md +421 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/state-animations.md +461 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +48 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/theming.md +269 -0
- package/skills/android-verified-email/SKILL.md +432 -0
- package/skills/android-verified-email/references/android/identity/credential-manager/index.md +67 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/credential-verifier.md +166 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification-implementation.md +313 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification.md +158 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/index.md +112 -0
- package/skills/android-verified-email/references/android/identity/passkeys/create-passkeys.md +327 -0
- package/skills/android-verified-email/references/android/identity/sign-in/credential-manager-webview.md +84 -0
- package/skills/android-wear-compose-m3/SKILL.md +365 -0
- package/skills/android-wear-compose-m3/references/android/training/wearables/compose/migrate-to-material3.md +677 -0
- package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md +123 -0
- package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md.txt +123 -0
- package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md +430 -0
- package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md.txt +430 -0
- package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md +99 -0
- package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md.txt +99 -0
- package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md +141 -0
- package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md.txt +141 -0
- package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md +56 -0
- package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md.txt +56 -0
- package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md +153 -0
- package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md.txt +153 -0
- package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md +131 -0
- package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md.txt +131 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md +169 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md.txt +169 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md +282 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md.txt +282 -0
- package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md +335 -0
- package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md.txt +335 -0
- package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md +377 -0
- package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md.txt +377 -0
- package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md +165 -0
- package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md.txt +165 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md +91 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md.txt +91 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md +496 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md.txt +496 -0
- package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md +470 -0
- package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md.txt +470 -0
- package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md +67 -0
- package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md.txt +67 -0
- package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md +162 -0
- package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md.txt +162 -0
- package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md +78 -0
- package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md.txt +78 -0
- package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md +131 -0
- package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md.txt +131 -0
- package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md +74 -0
- package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md.txt +74 -0
- package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md +63 -0
- package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md.txt +63 -0
- package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md +60 -0
- package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md.txt +60 -0
- package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md +125 -0
- package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md.txt +125 -0
- package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md +116 -0
- package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md.txt +116 -0
- package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md +68 -0
- package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md.txt +68 -0
- package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md +50 -0
- package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md.txt +50 -0
- package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md +177 -0
- package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md.txt +177 -0
- package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md +651 -0
- package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md.txt +651 -0
- package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md +57 -0
- package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md.txt +57 -0
- package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md +110 -0
- package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md.txt +110 -0
- package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md +204 -0
- package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md.txt +204 -0
- package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md +139 -0
- package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md.txt +139 -0
- package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md +111 -0
- package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md.txt +111 -0
- package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md +184 -0
- package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md.txt +184 -0
- package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md +263 -0
- package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md.txt +263 -0
- package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md +105 -0
- package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md.txt +105 -0
- package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md +146 -0
- package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md.txt +146 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md +97 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md.txt +97 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md +66 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md.txt +66 -0
- package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md +86 -0
- package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md.txt +86 -0
- package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md +148 -0
- package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md.txt +148 -0
- package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md +166 -0
- package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md.txt +166 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md +172 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md.txt +172 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md +367 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md.txt +367 -0
- package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md +66 -0
- package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md.txt +66 -0
- package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md +115 -0
- package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md.txt +115 -0
- package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md +71 -0
- package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md.txt +71 -0
- package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md +151 -0
- package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md.txt +151 -0
- package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md +65 -0
- package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md.txt +65 -0
- package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md +246 -0
- package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md.txt +246 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md +89 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +89 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md +309 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md.txt +309 -0
- package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +205 -0
- package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +205 -0
- package/skills/{architecture-feature-first → flutter-architecture-feature-first}/SKILL.md +1 -1
- package/skills/{bloc → flutter-bloc}/SKILL.md +1 -1
- package/skills/flutter-build-debug/SKILL.md +66 -0
- package/skills/{code-review → flutter-code-review}/SKILL.md +1 -1
- package/skills/{dart-3-updates → flutter-dart-3-updates}/SKILL.md +1 -1
- package/skills/{dart-fix-runtime-errors → flutter-dart-fix-runtime-errors}/SKILL.md +1 -1
- package/skills/{dart-resolve-package-conflicts → flutter-dart-resolve-package-conflicts}/SKILL.md +1 -1
- package/skills/{dart-run-static-analysis → flutter-dart-run-static-analysis}/SKILL.md +1 -1
- package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/SKILL.md +1 -1
- package/skills/{effective-dart → flutter-effective-dart}/SKILL.md +1 -1
- package/skills/{provider → flutter-provider}/SKILL.md +1 -1
- package/skills/{riverpod → flutter-riverpod}/SKILL.md +1 -1
- package/skills/ios-cocoapods-debug/SKILL.md +65 -0
- package/skills/ios-code-review/SKILL.md +56 -0
- package/skills/ios-xcode-build-debug/SKILL.md +66 -0
- package/skills/{detect-mobile-stack → mobile-detect-stack}/SKILL.md +1 -1
- package/skills/mobile-firebase/SKILL.md +54 -0
- package/skills/mobile-firebase/references/android/ai-logic.md +31 -0
- package/skills/mobile-firebase/references/android/analytics.md +33 -0
- package/skills/mobile-firebase/references/android/app-check.md +36 -0
- package/skills/mobile-firebase/references/android/auth.md +44 -0
- package/skills/mobile-firebase/references/android/crashlytics.md +31 -0
- package/skills/mobile-firebase/references/android/firestore.md +44 -0
- package/skills/mobile-firebase/references/android/functions.md +33 -0
- package/skills/mobile-firebase/references/android/in-app-messaging.md +28 -0
- package/skills/mobile-firebase/references/android/messaging.md +41 -0
- package/skills/mobile-firebase/references/android/realtime-database.md +50 -0
- package/skills/mobile-firebase/references/android/remote-config.md +43 -0
- package/skills/mobile-firebase/references/android/sql-connect.md +31 -0
- package/skills/mobile-firebase/references/android/storage.md +39 -0
- package/skills/mobile-firebase/references/android.md +30 -0
- package/skills/{firebase-ai/SKILL.md → mobile-firebase/references/flutter/ai-logic.md} +2 -8
- package/skills/{firebase-analytics/SKILL.md → mobile-firebase/references/flutter/analytics.md} +2 -8
- package/skills/{firebase-app-check/SKILL.md → mobile-firebase/references/flutter/app-check.md} +2 -8
- package/skills/{firebase-auth/SKILL.md → mobile-firebase/references/flutter/auth.md} +2 -8
- package/skills/{firebase-crashlytics/SKILL.md → mobile-firebase/references/flutter/crashlytics.md} +2 -8
- package/skills/{firebase-cloud-firestore/SKILL.md → mobile-firebase/references/flutter/firestore.md} +2 -8
- package/skills/{firebase-cloud-functions/SKILL.md → mobile-firebase/references/flutter/functions.md} +2 -8
- package/skills/{firebase-in-app-messaging/SKILL.md → mobile-firebase/references/flutter/in-app-messaging.md} +2 -8
- package/skills/{firebase-messaging/SKILL.md → mobile-firebase/references/flutter/messaging.md} +2 -8
- package/skills/{firebase-database/SKILL.md → mobile-firebase/references/flutter/realtime-database.md} +2 -8
- package/skills/{firebase-remote-config/SKILL.md → mobile-firebase/references/flutter/remote-config.md} +2 -8
- package/skills/{flutterfire-configure/SKILL.md → mobile-firebase/references/flutter/setup-flutterfire.md} +1 -8
- package/skills/{firebase-data-connect/SKILL.md → mobile-firebase/references/flutter/sql-connect.md} +2 -8
- package/skills/{firebase-storage/SKILL.md → mobile-firebase/references/flutter/storage.md} +2 -8
- package/skills/mobile-firebase/references/flutter.md +36 -0
- package/skills/mobile-firebase/references/ios/ai-logic.md +30 -0
- package/skills/mobile-firebase/references/ios/analytics.md +33 -0
- package/skills/mobile-firebase/references/ios/app-check.md +36 -0
- package/skills/mobile-firebase/references/ios/auth.md +48 -0
- package/skills/mobile-firebase/references/ios/crashlytics.md +34 -0
- package/skills/mobile-firebase/references/ios/firestore.md +53 -0
- package/skills/mobile-firebase/references/ios/functions.md +35 -0
- package/skills/mobile-firebase/references/ios/in-app-messaging.md +26 -0
- package/skills/mobile-firebase/references/ios/messaging.md +45 -0
- package/skills/mobile-firebase/references/ios/realtime-database.md +49 -0
- package/skills/mobile-firebase/references/ios/remote-config.md +44 -0
- package/skills/mobile-firebase/references/ios/sql-connect.md +33 -0
- package/skills/mobile-firebase/references/ios/storage.md +36 -0
- package/skills/mobile-firebase/references/ios.md +28 -0
- package/skills/mobile-firebase/references/react-native/ai-logic.md +32 -0
- package/skills/mobile-firebase/references/react-native/analytics.md +43 -0
- package/skills/mobile-firebase/references/react-native/app-check.md +35 -0
- package/skills/mobile-firebase/references/react-native/auth.md +50 -0
- package/skills/mobile-firebase/references/react-native/crashlytics.md +36 -0
- package/skills/mobile-firebase/references/react-native/firestore.md +45 -0
- package/skills/mobile-firebase/references/react-native/functions.md +28 -0
- package/skills/mobile-firebase/references/react-native/in-app-messaging.md +27 -0
- package/skills/mobile-firebase/references/react-native/messaging.md +46 -0
- package/skills/mobile-firebase/references/react-native/realtime-database.md +46 -0
- package/skills/mobile-firebase/references/react-native/remote-config.md +32 -0
- package/skills/mobile-firebase/references/react-native/sql-connect.md +11 -0
- package/skills/mobile-firebase/references/react-native/storage.md +30 -0
- package/skills/mobile-firebase/references/react-native.md +29 -0
- package/skills/mobile-test/SKILL.md +63 -0
- package/skills/mobile-test/references/android/setup/GUIDE.md +183 -0
- package/skills/mobile-test/references/android/setup/references/android/develop/ui/compose/testing/common-patterns.md +181 -0
- package/skills/mobile-test/references/android/setup/references/android/studio/preview/compose-screenshot-testing.md +255 -0
- package/skills/mobile-test/references/android/setup/references/android/training/dependency-injection/hilt-testing.md +447 -0
- package/skills/mobile-test/references/android.md +83 -0
- package/skills/{dart-collect-coverage/SKILL.md → mobile-test/references/flutter/coverage.md} +2 -11
- package/skills/{dart-generate-test-mocks/SKILL.md → mobile-test/references/flutter/generate-mocks.md} +2 -11
- package/skills/{flutter-add-integration-test/SKILL.md → mobile-test/references/flutter/integration-tests.md} +2 -11
- package/skills/{dart-migrate-to-checks-package/SKILL.md → mobile-test/references/flutter/migrate-to-checks.md} +2 -13
- package/skills/{mockito/SKILL.md → mobile-test/references/flutter/mockito.md} +1 -8
- package/skills/{mocktail/SKILL.md → mobile-test/references/flutter/mocktail.md} +1 -8
- package/skills/{patrol-e2e-testing/SKILL.md → mobile-test/references/flutter/patrol.md} +1 -8
- package/skills/{testing/SKILL.md → mobile-test/references/flutter/testing-guidelines.md} +1 -8
- package/skills/{dart-add-unit-test/SKILL.md → mobile-test/references/flutter/unit-tests.md} +2 -11
- package/skills/{flutter-add-widget-test/SKILL.md → mobile-test/references/flutter/widget-tests.md} +2 -11
- package/skills/mobile-test/references/flutter.md +44 -0
- package/skills/mobile-test/references/ios.md +79 -0
- package/skills/mobile-test/references/react-native.md +62 -0
- /package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/examples/json_patterns.dart +0 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
Use `Modifier.flex` to control how an item changes size, order, and is aligned
|
|
2
|
+
inside a `FlexBox`.
|
|
3
|
+
|
|
4
|
+
## Item size
|
|
5
|
+
|
|
6
|
+
Use the `basis`, `grow`, and `shrink` functions to control an item's size.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
```kotlin
|
|
10
|
+
FlexBox {
|
|
11
|
+
RedRoundedBox(
|
|
12
|
+
modifier = Modifier.flex {
|
|
13
|
+
basis(FlexBasis.Auto)
|
|
14
|
+
grow(1.0f)
|
|
15
|
+
shrink(0.5f)
|
|
16
|
+
}
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
<br />
|
|
22
|
+
|
|
23
|
+
### Set initial size
|
|
24
|
+
|
|
25
|
+
Use `basis` to specify the item's initial size before any extra space is
|
|
26
|
+
distributed. You can think of this as the item's *preferred* size.
|
|
27
|
+
|
|
28
|
+
|---|---|---|---|
|
|
29
|
+
| **Value type** | **Behavior** | **Code snippet** Note: The boxes have a maximum intrinsic size of `100dp` | **Example using container width `600dp`** |
|
|
30
|
+
| `Auto` (default) | Use the item's maximum intrinsic size. For example, a `Text` composable's maximum intrinsic width is the width of all its text on a single line - no wrapping. | ```kotlin FlexBox { RedRoundedBox( Modifier.flex { basis(FlexBasis.Auto) } ) BlueRoundedBox( Modifier.flex { basis(FlexBasis.Auto) } ) } ``` |  |
|
|
31
|
+
| Fixed `dp` | A fixed size in Dp. | ```kotlin FlexBox { RedRoundedBox( Modifier.flex { basis(200.dp) } ) BlueRoundedBox( Modifier.flex { basis(100.dp) } ) } ``` |  |
|
|
32
|
+
| Percentage | A percentage of the container size. | ```kotlin FlexBox { RedRoundedBox( Modifier.flex { basis(0.7f) } ) BlueRoundedBox( Modifier.flex { basis(0.3f) } ) } ``` |  |
|
|
33
|
+
|
|
34
|
+
If the basis value is less than the item's intrinsic minimum size, the intrinsic
|
|
35
|
+
minimum size is used instead. For example, if a `Text` item that contains a word
|
|
36
|
+
requires `50dp` to display, but also has `basis = 10.dp`, a
|
|
37
|
+
value of `50dp` is used.
|
|
38
|
+
|
|
39
|
+
### Grow items when there's space
|
|
40
|
+
|
|
41
|
+
Use `grow` to specify how much an item grows when there is extra space. This is
|
|
42
|
+
space remaining in the `FlexBox` container after all the items' `basis` values
|
|
43
|
+
have been added up. The `grow` value indicates *how much* of the extra space a
|
|
44
|
+
given child will receive, relative to its siblings. By default, items won't
|
|
45
|
+
grow.
|
|
46
|
+
|
|
47
|
+
The following example shows a `FlexBox` with three child items. Each has a basis
|
|
48
|
+
value of `100dp`. The first child has a positive `grow` value. Since there is
|
|
49
|
+
only one child with a `grow` value, the actual value is irrelevant - as long as
|
|
50
|
+
it's positive, the child receives all the extra space.
|
|
51
|
+
|
|
52
|
+
The images show the `FlexBox` behavior when its container size is `600dp`.
|
|
53
|
+
|
|
54
|
+
|---|---|
|
|
55
|
+
| ```kotlin FlexBox { RedRoundedBox( title = "400dp", modifier = Modifier.flex { grow(1f) } ) BlueRoundedBox(title = "100dp") GreenRoundedBox(title = "100dp") } ``` | Each child has a basis value of `100dp`. There is `300dp` of extra space.  Child 1 grows by `300dp` to fill the extra space.  |
|
|
56
|
+
|
|
57
|
+
In the following example, the container size and `basis` size are the same. The
|
|
58
|
+
difference is that each child has a different `grow` value.
|
|
59
|
+
|
|
60
|
+
|---|---|
|
|
61
|
+
| ```kotlin FlexBox { RedRoundedBox( title = "150dp", modifier = Modifier.flex { grow(1f) } ) BlueRoundedBox( title = "200dp", modifier = Modifier.flex { grow(2f) } ) GreenRoundedBox( title = "250dp", modifier = Modifier.flex { grow(3f) } ) } ``` | Each child has a basis value of `100dp`. There is `300dp` of extra space.  The total grow value is 6. Child 1 grows by (1 / 6) \* 300 = `50dp` Child 2 grows by (2 / 6) \* 300 = `100dp` Child 3 grows by (3 / 6) \* 300 = `150dp`  |
|
|
62
|
+
|
|
63
|
+
### Shrink items when there's insufficient space
|
|
64
|
+
|
|
65
|
+
Use `shrink` to specify how much an item shrinks when the `FlexBox` container
|
|
66
|
+
has insufficient space for all the items. `shrink` works the same way as `grow`
|
|
67
|
+
except that, instead of distributing *extra space* to items, the *space deficit*
|
|
68
|
+
is distributed to items. The `shrink` value specifies how much of the space
|
|
69
|
+
deficit the item receives, or rather, how much the item will shrink by. By
|
|
70
|
+
default, items have a `shrink` value of `1f`, meaning they shrink equally.
|
|
71
|
+
|
|
72
|
+
The following example shows two `Text` composables with the same text. The first
|
|
73
|
+
child has a shrink value of `1f`, meaning it shrinks to absorb all the space
|
|
74
|
+
deficit.
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
```kotlin
|
|
78
|
+
FlexBox {
|
|
79
|
+
Text(
|
|
80
|
+
"The quick brown fox",
|
|
81
|
+
fontSize = 36.sp,
|
|
82
|
+
modifier = Modifier
|
|
83
|
+
.background(PastelRed)
|
|
84
|
+
.flex { shrink(1f) }
|
|
85
|
+
)
|
|
86
|
+
Text(
|
|
87
|
+
"The quick brown fox",
|
|
88
|
+
fontSize = 36.sp,
|
|
89
|
+
modifier = Modifier
|
|
90
|
+
.background(PastelBlue)
|
|
91
|
+
.flex { shrink(0f) }
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
<br />
|
|
97
|
+
|
|
98
|
+
As the container size shrinks, Child 1 shrinks.
|
|
99
|
+
|
|
100
|
+
|---|---|
|
|
101
|
+
| **Container size** | **FlexBox UI** |
|
|
102
|
+
| `700dp` |  |
|
|
103
|
+
| `500dp` |  |
|
|
104
|
+
| `450dp` |  |
|
|
105
|
+
|
|
106
|
+
## Item alignment
|
|
107
|
+
|
|
108
|
+
Use `alignSelf` to control how an item is aligned to the cross axis. This
|
|
109
|
+
overrides the [`alignItems` property](https://developer.android.com/develop/ui/compose/layouts/adaptive/flexbox/container-behavior#align-distribute) of the container for this item. It
|
|
110
|
+
has all the same possible values, with the addition of `Auto` which inherits the
|
|
111
|
+
behavior of the `FlexBox` container.
|
|
112
|
+
|
|
113
|
+
For example, this `FlexBox` has `alignItems` set to `Start` and five children
|
|
114
|
+
which override the cross axis alignment.
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
```kotlin
|
|
118
|
+
FlexBox(
|
|
119
|
+
config = {
|
|
120
|
+
alignItems(FlexAlignItems.Start)
|
|
121
|
+
}
|
|
122
|
+
) {
|
|
123
|
+
RedRoundedBox()
|
|
124
|
+
BlueRoundedBox(modifier = Modifier.flex { alignSelf(FlexAlignSelf.Center) })
|
|
125
|
+
GreenRoundedBox(modifier = Modifier.flex { alignSelf(FlexAlignSelf.End) })
|
|
126
|
+
PinkRoundedBox(modifier = Modifier.flex { alignSelf(FlexAlignSelf.Stretch) })
|
|
127
|
+
OrangeRoundedBox(modifier = Modifier.flex { alignSelf(FlexAlignSelf.Baseline) })
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
<br />
|
|
132
|
+
|
|
133
|
+

|
|
134
|
+
|
|
135
|
+
## Item order
|
|
136
|
+
|
|
137
|
+
By default, `FlexBox` lays out items in the order that they are declared in
|
|
138
|
+
code. Override this behavior using `order`.
|
|
139
|
+
|
|
140
|
+
The default value for `order` is zero, and `FlexBox` sorts items based on this
|
|
141
|
+
value in ascending order. Any items that have the same `order` value are
|
|
142
|
+
laid out in the same order they are declared in. Use negative and positive
|
|
143
|
+
`order` values to move items to the start or end of a layout without changing
|
|
144
|
+
where they are declared.
|
|
145
|
+
|
|
146
|
+
The following example shows two child items. The first has the default `order`
|
|
147
|
+
of zero, and the second has an order of `-1`. After sorting, Child 1 appears
|
|
148
|
+
after Child 2.
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
```kotlin
|
|
152
|
+
FlexBox {
|
|
153
|
+
// Declared first, but will be placed after visually
|
|
154
|
+
RedRoundedBox(
|
|
155
|
+
title = "World"
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
// Declared second, but will be placed first visually
|
|
159
|
+
BlueRoundedBox(
|
|
160
|
+
title = "Hello",
|
|
161
|
+
modifier = Modifier.flex {
|
|
162
|
+
order(-1)
|
|
163
|
+
}
|
|
164
|
+
)
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
<br />
|
|
169
|
+
|
|
170
|
+

|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
You can define a Grid container configuration to create flexible layouts
|
|
2
|
+
that respond to different screen sizes and content types.
|
|
3
|
+
This page describes how to do the following:
|
|
4
|
+
|
|
5
|
+
- [Define a grid](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid/container-properties#grid-definition): Set up the basic structure of rows and columns.
|
|
6
|
+
- [Place items in a grid](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid/container-properties#item-placement): Understand how items are placed into grid cells and how to change flow direction.
|
|
7
|
+
- [Manage track sizing](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid/container-properties#grid-track-size): Use fixed, percentage, flexible, and intrinsic sizing to set track sizes.
|
|
8
|
+
- [Set gaps](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid/container-properties#grid-gap): Manage the "gutters" between rows and columns.
|
|
9
|
+
|
|
10
|
+
## Define a grid
|
|
11
|
+
|
|
12
|
+
A grid consists of columns and rows.
|
|
13
|
+
The [`Grid`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/Grid.composable#Grid(kotlin.Function1,androidx.compose.ui.Modifier,kotlin.Function1)) composable has a `config` parameter
|
|
14
|
+
that accepts a lambda to define the columns and rows
|
|
15
|
+
within [`GridConfigurationScope`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridConfigurationScope).
|
|
16
|
+
The following example defines a grid that has three rows and two columns,
|
|
17
|
+
each with a fixed size specified in [`Dp`](https://developer.android.com/reference/kotlin/androidx/compose/ui/unit/Dp):
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
```kotlin
|
|
21
|
+
Grid(
|
|
22
|
+
config = {
|
|
23
|
+
repeat(2) {
|
|
24
|
+
column(160.dp)
|
|
25
|
+
}
|
|
26
|
+
repeat(3) {
|
|
27
|
+
row(90.dp)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
) {
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
<br />
|
|
35
|
+
|
|
36
|
+
## Place items in a grid
|
|
37
|
+
|
|
38
|
+
`Grid` takes the UI elements
|
|
39
|
+
in the `content` lambda and places them into grid cells.
|
|
40
|
+
The grid lays out items regardless of
|
|
41
|
+
whether you have explicitly defined the rows and columns.
|
|
42
|
+
By default,
|
|
43
|
+
`Grid` tries to place a UI element in the available grid cell in the row;
|
|
44
|
+
if it can't, it places it in an available grid cell in the next row.
|
|
45
|
+
If there are no empty cells, `Grid` creates a new row.
|
|
46
|
+
|
|
47
|
+
In the following example, the grid has six grid cells
|
|
48
|
+
and places a card into each one (Figure 1).
|
|
49
|
+
Each grid cell is `160dp` x `90dp`,
|
|
50
|
+
making the total grid size `320dp` x `270dp`.
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
```kotlin
|
|
54
|
+
Grid(
|
|
55
|
+
config = {
|
|
56
|
+
repeat(2) {
|
|
57
|
+
column(160.dp)
|
|
58
|
+
}
|
|
59
|
+
repeat(3) {
|
|
60
|
+
row(90.dp)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
) {
|
|
64
|
+
Card1()
|
|
65
|
+
Card2()
|
|
66
|
+
Card3()
|
|
67
|
+
Card4()
|
|
68
|
+
Card5()
|
|
69
|
+
Card6()
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
<br />
|
|
74
|
+
|
|
75
|
+
 **Figure 1**. Six cards are placed in a grid that has three rows and two columns.
|
|
76
|
+
|
|
77
|
+
To change this default behavior to filling by column,
|
|
78
|
+
set the [`flow`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridConfigurationScope#flow()) property to [`GridFlow.Column`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridFlow#Column()).
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
```kotlin
|
|
82
|
+
Grid(
|
|
83
|
+
config = {
|
|
84
|
+
repeat(2) {
|
|
85
|
+
column(160.dp)
|
|
86
|
+
}
|
|
87
|
+
repeat(3) {
|
|
88
|
+
row(90.dp)
|
|
89
|
+
}
|
|
90
|
+
gap(8.dp)
|
|
91
|
+
flow = GridFlow.Column // Grid tries to place items to fill the column
|
|
92
|
+
},
|
|
93
|
+
) {
|
|
94
|
+
Card1()
|
|
95
|
+
Card2()
|
|
96
|
+
Card3()
|
|
97
|
+
Card4()
|
|
98
|
+
Card5()
|
|
99
|
+
Card6()
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
<br />
|
|
104
|
+
|
|
105
|
+
 **Figure 2** . `GridFlow.Row` (left) and `GridFlow.Column` (right).
|
|
106
|
+
|
|
107
|
+
## Manage track sizing
|
|
108
|
+
|
|
109
|
+
Rows and columns are collectively referred to as a [grid track](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid#grid-track).
|
|
110
|
+
You can specify the size of a grid track using one of the following methods:
|
|
111
|
+
|
|
112
|
+
- **Fixed** (`Dp`): Allocates a specific size (e.g., `column(180.dp)`).
|
|
113
|
+
- **Percentage** (`Float`): Allocates a percentage of the total available space from `0.0f` to `1.0f` (e.g., `row(0.5f)` for 50%).
|
|
114
|
+
- **Flexible** ([`Fr`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/Fr)): Distributes remaining space proportionally after fixed and percentage tracks are calculated. For example, if two rows are set to `1.fr` and `3.fr`, the latter receives 75% of the remaining height.
|
|
115
|
+
- **Intrinsic** : Sizes the track based on the content inside it. For more information, see [Determine grid track size intrinsically](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid/container-properties#intrisic-grid-track-size).
|
|
116
|
+
|
|
117
|
+
The following example uses the different track sizing options
|
|
118
|
+
to define the row heights:
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
```kotlin
|
|
122
|
+
Grid(
|
|
123
|
+
config = {
|
|
124
|
+
column(1f)
|
|
125
|
+
|
|
126
|
+
row(100.dp)
|
|
127
|
+
row(0.2f)
|
|
128
|
+
row(1.fr)
|
|
129
|
+
row(GridTrackSize.Auto)
|
|
130
|
+
},
|
|
131
|
+
modifier = Modifier.height(480.dp)
|
|
132
|
+
) {
|
|
133
|
+
PastelRedCard("Fixed(100.dp)")
|
|
134
|
+
PastelGreenCard("Percentage(0.2f)")
|
|
135
|
+
PastelBlueCard("Flex(1.fr)")
|
|
136
|
+
PastelYellowCard("Auto")
|
|
137
|
+
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
<br />
|
|
142
|
+
|
|
143
|
+
 **Figure 3** . Row heights defined using the four primary track sizing options in `Grid`.
|
|
144
|
+
|
|
145
|
+
### Set the minimum size for flexible grid tracks
|
|
146
|
+
|
|
147
|
+
When a grid container has no remaining space,
|
|
148
|
+
a standard flexible track can shrink to `0.dp`.
|
|
149
|
+
To prevent this and ensure content isn't crushed,
|
|
150
|
+
use [`GridTrackSize.MinMax`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridTrackSize#MinMax(androidx.compose.ui.unit.Dp,androidx.compose.foundation.layout.Fr))
|
|
151
|
+
to enforce an explicit minimum size while keeping the track flexible.
|
|
152
|
+
|
|
153
|
+
The following example allocates at least `100.dp` to the first row:
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
```kotlin
|
|
157
|
+
Grid(
|
|
158
|
+
config = {
|
|
159
|
+
column(1f)
|
|
160
|
+
// The first row has a minimum height of 100.dp and can expand to
|
|
161
|
+
// the half of the remaining space.
|
|
162
|
+
row(GridTrackSize.MinMax(100.dp, 1.fr))
|
|
163
|
+
// The second row takes the half of the remaining space.
|
|
164
|
+
row(1.fr)
|
|
165
|
+
// The third row has a fixed height of 200.dp.
|
|
166
|
+
row(200.dp)
|
|
167
|
+
},
|
|
168
|
+
modifier = Modifier.size(360.dp) // Total grid height is 360.dp
|
|
169
|
+
) {
|
|
170
|
+
PastelRedCard("MinMax(100.dp, 1.fr)")
|
|
171
|
+
PastelGreenCard("Flex(1.fr)")
|
|
172
|
+
PastelBlueCard("Fixed(200.dp)")
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
<br />
|
|
177
|
+
|
|
178
|
+
 **Figure 4** . The first row has at least `100.dp` height.
|
|
179
|
+
|
|
180
|
+
### Set the minimum grid track size to place lazy lists
|
|
181
|
+
|
|
182
|
+
Standard flexible tracks automatically query the intrinsic sizes of
|
|
183
|
+
their children to establish a base size.
|
|
184
|
+
However, Jetpack Compose prohibits querying the intrinsic sizes of
|
|
185
|
+
[`SubcomposeLayout`](https://developer.android.com/reference/kotlin/androidx/compose/ui/layout/SubcomposeLayout.composable#SubcomposeLayout(androidx.compose.ui.Modifier,kotlin.Function2)), which backs components,
|
|
186
|
+
such as [`LazyColumn`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/lazy/LazyColumn.composable) and [`LazyRow`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/lazy/LazyRow.composable).
|
|
187
|
+
|
|
188
|
+
Placing a lazy list inside a standard flexible track causes
|
|
189
|
+
an [`IllegalStateException`](https://developer.android.com/reference/java/lang/IllegalStateException) crash.
|
|
190
|
+
To safely place lazy lists inside a flexible grid track,
|
|
191
|
+
use `MinMax` with an explicit minimum size (such as `0.dp`)
|
|
192
|
+
to bypass the intrinsic measurement pass.
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
```kotlin
|
|
196
|
+
Grid(
|
|
197
|
+
config = {
|
|
198
|
+
column(1f)
|
|
199
|
+
// The first row's height is determined by the height of the Text composable.
|
|
200
|
+
row(GridTrackSize.Auto)
|
|
201
|
+
// The second row occupies the remaining space, allowing the LazyColumn to scroll.
|
|
202
|
+
row(GridTrackSize.MinMax(0.dp, 1.fr))
|
|
203
|
+
|
|
204
|
+
gap(8.dp)
|
|
205
|
+
},
|
|
206
|
+
modifier = Modifier.size(width = 170.dp, height = 240.dp)
|
|
207
|
+
) {
|
|
208
|
+
Text("LazyColumn in a Grid")
|
|
209
|
+
// The LazyColumn is placed in the second row, filling the remaining space.
|
|
210
|
+
LazyColumn(verticalArrangement = Arrangement.spacedBy(4.dp)) {
|
|
211
|
+
items(100) { number ->
|
|
212
|
+
PastelGreenCard("Card $number")
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
<br />
|
|
219
|
+
|
|
220
|
+
 **Figure 5** . `LazyColumn` in a grid cell.
|
|
221
|
+
|
|
222
|
+
### Determine grid track size intrinsically
|
|
223
|
+
|
|
224
|
+
You can use [intrinsic sizing](https://developer.android.com/develop/ui/compose/layouts/intrinsic-measurements) for a `Grid`
|
|
225
|
+
when you want the layout to adapt to the content,
|
|
226
|
+
rather than forcing it into a fixed container.
|
|
227
|
+
The grid track size is determined with the following values:
|
|
228
|
+
|
|
229
|
+
- [`GridTrackSize.MaxContent`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridTrackSize#MaxContent()): Use the content's maximum intrinsic size (e.g., the width is determined by the full length of the text in a text block with no wrapping).
|
|
230
|
+
- [`GridTrackSize.MinContent`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridTrackSize#MinContent()): Use the content's minimum intrinsic size (e.g., the width is determined by the longest single word in a text block).
|
|
231
|
+
- [`GridTrackSize.Auto`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridTrackSize#Auto()): Use a flexible size for a track that adapts based on available space. It behaves like `MaxContent` by default, but shrinks and wraps its content to fit within the parent container.
|
|
232
|
+
|
|
233
|
+
The following example places two texts side by side.
|
|
234
|
+
The column size for the first text is determined
|
|
235
|
+
by the required minimum width to display the text,
|
|
236
|
+
and the second column width depends on the required maximum width of the text.
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
```kotlin
|
|
240
|
+
Grid(
|
|
241
|
+
config = {
|
|
242
|
+
column(GridTrackSize.MinContent)
|
|
243
|
+
column(GridTrackSize.MaxContent)
|
|
244
|
+
row(1.0f)
|
|
245
|
+
},
|
|
246
|
+
modifier = Modifier.width(480.dp)
|
|
247
|
+
) {
|
|
248
|
+
Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras imperdiet.")
|
|
249
|
+
Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras imperdiet.")
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
<br />
|
|
254
|
+
|
|
255
|
+
 **Figure 5**. Intrinsic sizes specified in the columns.
|
|
256
|
+
|
|
257
|
+
## Set gaps between rows and columns
|
|
258
|
+
|
|
259
|
+
Once your grid tracks are sized,
|
|
260
|
+
you can modify the [grid gap](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid#grid-gap) to refine the spacing between the tracks.
|
|
261
|
+
You can specify the column gap with the [`columnGap`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridConfigurationScope#columnGap(androidx.compose.ui.unit.Dp)) function,
|
|
262
|
+
and the row gap with [`rowGap`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridConfigurationScope#rowGap(androidx.compose.ui.unit.Dp)). In the following example,
|
|
263
|
+
there is a `16dp` gap between each row,
|
|
264
|
+
and an `8dp` gap between each column (Figure 5).
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
```kotlin
|
|
268
|
+
Grid(
|
|
269
|
+
config = {
|
|
270
|
+
repeat(2) {
|
|
271
|
+
column(160.dp)
|
|
272
|
+
}
|
|
273
|
+
repeat(3) {
|
|
274
|
+
row(90.dp)
|
|
275
|
+
}
|
|
276
|
+
rowGap(16.dp)
|
|
277
|
+
columnGap(8.dp)
|
|
278
|
+
}
|
|
279
|
+
) {
|
|
280
|
+
Card1()
|
|
281
|
+
Card2()
|
|
282
|
+
Card3()
|
|
283
|
+
Card4()
|
|
284
|
+
Card5()
|
|
285
|
+
Card6()
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
<br />
|
|
290
|
+
|
|
291
|
+
 **Figure 6**. Gaps between rows and columns.
|
|
292
|
+
|
|
293
|
+
You can also use the convenience function [`gap`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridConfigurationScope#gap(androidx.compose.ui.unit.Dp))
|
|
294
|
+
to define gaps of the same column and row size,
|
|
295
|
+
and to define column and gap sizes separately using a single function.
|
|
296
|
+
The following code adds `8dp` gaps to the grid:
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
```kotlin
|
|
300
|
+
Grid(
|
|
301
|
+
config = {
|
|
302
|
+
repeat(2) {
|
|
303
|
+
column(160.dp)
|
|
304
|
+
}
|
|
305
|
+
repeat(3) {
|
|
306
|
+
row(90.dp)
|
|
307
|
+
}
|
|
308
|
+
gap(8.dp) // Equivalent to columnGap(8.dp) and rowGap(8.dp)
|
|
309
|
+
}
|
|
310
|
+
) {
|
|
311
|
+
Card1()
|
|
312
|
+
Card2()
|
|
313
|
+
Card3()
|
|
314
|
+
Card4()
|
|
315
|
+
Card5()
|
|
316
|
+
Card6()
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
<br />
|
|
321
|
+
|
|
322
|
+
## Define grid areas with named areas
|
|
323
|
+
|
|
324
|
+
Named areas allow you to attach names to groups of grid cells,
|
|
325
|
+
which are called [grid areas](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid#grid-area).
|
|
326
|
+
You can use these names instead of [coordinate indexes](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid/item-properties#position)
|
|
327
|
+
when placing UI elements in the grid.
|
|
328
|
+
|
|
329
|
+
Using named areas has two main benefits to code readability:
|
|
330
|
+
|
|
331
|
+
- When defining the grid layout, the purpose and placement of the expected content is clear.
|
|
332
|
+
- When adding the content, the purpose of that content is clear.
|
|
333
|
+
|
|
334
|
+
To organize complex layouts clearly, you can decouple your physical grid
|
|
335
|
+
structure from child placement by defining semantic grid areas.
|
|
336
|
+
|
|
337
|
+
Inside the `config` lambda, use the [`area`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridConfigurationScope#area(kotlin.Any,kotlin.Int,kotlin.Int,kotlin.Int,kotlin.Int)) function in
|
|
338
|
+
`GridConfigurationScope` to register named areas in the grid.
|
|
339
|
+
You can then assign child composables to these areas
|
|
340
|
+
using the [`gridItem`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridScope#(androidx.compose.ui.Modifier).gridItem(kotlin.Any,androidx.compose.ui.Alignment)) modifier
|
|
341
|
+
with the corresponding area identifier. The `area` function maps
|
|
342
|
+
a semantic identifier (such as an `enum` class value or a string key) to
|
|
343
|
+
a set of physical grid coordinates. Grid lines and indexes are **1-based**
|
|
344
|
+
(that is, the first row is `1`, and the first column is `1`).
|
|
345
|
+
|
|
346
|
+
For example, you define a grid that has four area IDs:
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
```kotlin
|
|
350
|
+
/**
|
|
351
|
+
* An enum representing the IDs for named areas within the grid.
|
|
352
|
+
*/
|
|
353
|
+
enum class GridAreaNames {
|
|
354
|
+
Area1,
|
|
355
|
+
Area2,
|
|
356
|
+
Area3,
|
|
357
|
+
Area4
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
<br />
|
|
362
|
+
|
|
363
|
+
Provide the name for the area using the `areaId` parameter along with the area's
|
|
364
|
+
cell coordinates and spans.
|
|
365
|
+
The `gridItem` modifier uses the `areaId` as a key
|
|
366
|
+
to assign each child item to its designated grid area,
|
|
367
|
+
as shown in the following example:
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
```kotlin
|
|
371
|
+
Grid(
|
|
372
|
+
config = {
|
|
373
|
+
// Define a single column that takes all available width.
|
|
374
|
+
repeat(2) { column(0.5f) }
|
|
375
|
+
|
|
376
|
+
// Define four rows, each taking 25% of the total height.
|
|
377
|
+
repeat(4) { row(0.25f) }
|
|
378
|
+
|
|
379
|
+
// Define named grid areas by associating an areaId with specific row and column indices.
|
|
380
|
+
// Row and column indices are 1-based.
|
|
381
|
+
area(areaId = GridAreaNames.Area1, row = 1, column = 1, columnSpan = 2)
|
|
382
|
+
area(areaId = GridAreaNames.Area2, row = 2, column = 1, rowSpan = 3)
|
|
383
|
+
area(areaId = GridAreaNames.Area3, rows = 2..3, columns = 2..2)
|
|
384
|
+
area(areaId = GridAreaNames.Area4, row = 4, column = 2)
|
|
385
|
+
|
|
386
|
+
gap(4.dp)
|
|
387
|
+
},
|
|
388
|
+
modifier = Modifier.size(360.dp)
|
|
389
|
+
) {
|
|
390
|
+
PastelRedCard(
|
|
391
|
+
"Area 1",
|
|
392
|
+
// Use Modifier.gridItem(areaId) to place this composable into the
|
|
393
|
+
// grid area defined with the matching ID in the config block.
|
|
394
|
+
modifier = Modifier.gridItem(areaId = GridAreaNames.Area1)
|
|
395
|
+
)
|
|
396
|
+
PastelGreenCard(
|
|
397
|
+
"Area 2",
|
|
398
|
+
modifier = Modifier.gridItem(areaId = GridAreaNames.Area2)
|
|
399
|
+
)
|
|
400
|
+
PastelBlueCard(
|
|
401
|
+
"Area 3",
|
|
402
|
+
modifier = Modifier.gridItem(areaId = GridAreaNames.Area3)
|
|
403
|
+
)
|
|
404
|
+
PastelYellowCard(
|
|
405
|
+
"Area 4",
|
|
406
|
+
modifier = Modifier.gridItem(areaId = GridAreaNames.Area4)
|
|
407
|
+
)
|
|
408
|
+
}
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
<br />
|
|
412
|
+
|
|
413
|
+
By using named areas, you can reorganize or adjust the physical layout grid (for
|
|
414
|
+
example, changing rows, columns, or track sizes) in the `config` lambda
|
|
415
|
+
without needing to modify the order or parameters of the child composables.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
This page describes how to implement basic [`Grid`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/Grid.composable#Grid(kotlin.Function1,androidx.compose.ui.Modifier,kotlin.Function1)) layouts.
|
|
2
|
+
|
|
3
|
+
## Set up project
|
|
4
|
+
|
|
5
|
+
1. Add the [`androidx.compose.foundation.layout`](https://developer.android.com/jetpack/androidx/versions) library to your project's
|
|
6
|
+
`lib.versions.toml`.
|
|
7
|
+
|
|
8
|
+
[versions]
|
|
9
|
+
compose = "1.13.0-alpha02"
|
|
10
|
+
|
|
11
|
+
[libraries]
|
|
12
|
+
androidx-compose-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout", version.ref = "compose" }
|
|
13
|
+
|
|
14
|
+
2. Add the library dependency to your app's `build.gradle.kts`.
|
|
15
|
+
|
|
16
|
+
dependencies {
|
|
17
|
+
implementation(libs.androidx.compose.foundation.layout)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
## Create a basic grid
|
|
21
|
+
|
|
22
|
+
The following example creates a basic 2x3 grid,
|
|
23
|
+
with the columns and rows having a fixed size of `100.dp`.
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
```kotlin
|
|
27
|
+
Grid(
|
|
28
|
+
config = {
|
|
29
|
+
repeat(2) {
|
|
30
|
+
column(100.dp)
|
|
31
|
+
}
|
|
32
|
+
repeat(3) {
|
|
33
|
+
row(100.dp)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
) {
|
|
37
|
+
Card1(containerColor = PastelRed)
|
|
38
|
+
Card2(containerColor = PastelGreen)
|
|
39
|
+
Card3(containerColor = PastelBlue)
|
|
40
|
+
Card4(containerColor = PastelPink)
|
|
41
|
+
Card5(containerColor = PastelOrange)
|
|
42
|
+
Card6(containerColor = PastelYellow)
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
<br />
|
|
47
|
+
|
|
48
|
+
 **Figure 1**. A basic grid consists of rows and columns with fixed size.
|
|
49
|
+
|
|
50
|
+
To learn how to implement more advanced grids,
|
|
51
|
+
see [Set container properties](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid/container-properties) and [Set item properties](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid/item-properties).
|