Styles

by android42dc2270e960Complete terms in LICENSE.txt7.7K starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 13 days ago

Use this skill to integrate the Jetpack Compose Styles API into an Android project. This skill guides you through upgrading dependencies, setting up component themes, making custom components styleable, and migrating existing layout properties to use unified styles. Migrate custom design system components, replace hard coded parameters with Style attributes, and use Modifier.styleable for interaction states.

AI-generated overview

Guides migrating Android Jetpack Compose custom components and themes to the experimental Styles API.

What it does
This skill walks an agent through adopting the Jetpack Compose Styles API in an Android project: upgrading dependencies, opting in to the experimental compiler flag, defining component styles in a ComponentStyles file, and converting custom composables from individual styling parameters to a Style parameter with Modifier.styleable. It also covers wiring styles into custom themes and validating the migration with screenshot tests and Compose previews. It produces migration guidance and code changes rather than standalone artifacts.
When to use it
Use it when an Android project already uses Jetpack Compose and you want to migrate custom design-system components or custom themes to the Styles API. It is not intended for Material Design component styles or projects without Compose dependencies.
Requirements
Requires an Android project with compileSdk 37 or higher and androidx.compose.foundation:foundation 1.12.0-alpha01 or higher (or Compose BOM 2026.04.01 or higher), plus opt-in to ExperimentalFoundationStyleApi in build.gradle.kts. Optional emulator or screenshot testing framework for visual validation. Ships no scripts; it is instructions plus reference documents.

Limitations

  • Warn the user that this skill is EXPERIMENTAL and requires updating to alpha version of Compose and opting in to the Experimental APIs.
  • This skill only supports custom UI components and custom themes.
  • This skill does not support Material Design component Styles.

Prerequisites

1. Upgrade dependencies

  • The project must use compileSdk version 37 or higher.
  • The project must use androidx.compose.foundation:foundation version 1.12.0-alpha01 or higher.
  • Alternatively, the project must use Compose BOM version 2026.04.01 or higher.
  • The API requires this exact package: import androidx.compose.foundation.style.Style

2. Configure compiler options to enable experimental API

You must opt-in to the experimental API at the project level. Add the following block to your module's build.gradle.kts:

kotlin {    compilerOptions {        jvmTarget = JvmTarget.fromTarget("17")        freeCompilerArgs.add("-opt-in=androidx.compose.foundation.style.ExperimentalFoundationStyleApi")    }}

Core workflows and guides

Refer to the official documentation to complete specific development tasks:

  • Basic Style Usage: To set backgrounds, sizes, and alignments on a component, follow the Compose Styles Fundamentals Guide [blocked].
  • State and Transitions: To configure property changes for state shifts (like pressed or hovered), follow the Animations and State-Based Styling Guide [blocked].
  • Architecture Trade offs: To decide when to use a Style versus a standard Modifier, follow the Styles versus Modifiers Comparison [blocked].
  • Theme Level Integration: To connect style definitions with custom themes, follow Theming with Styles [blocked] and Custom Themes in Compose [blocked].

Step-by-Step Migration Workflow

Step 1: Analyze theme structure

  1. Locate your central theme file (such as Theme.kt).
  2. Identify design tokens. Note references for colors, typography, and shapes (for example, LocalColorScheme, LocalTypography, or LocalShapes).
  3. If the project lacks Jetpack Compose dependencies, stop. Instruct the user to migrate to Jetpack Compose first.
  4. If the project imports androidx.compose.material.MaterialTheme, recommend migrating to Material 3 before proceeding.

Step 2: Establish ComponentStyles

  1. Create a new file named ComponentStyles.kt in your theme directory.

  2. Define a top-level data class to hold your component styles, for example, the Jetsnack one is called JetsnackStyles:

    kotlin
    object ExampleComponentStyles {    val customButtonStyle: Style = {
        }    val customTextFieldStyle: Style = {
        }}
    <br />
  3. Expose this class through your custom theme with a static reference, don't use CompositionLocals here as it's not required.

    kotlin
    @Immutableclass JetsnackTheme(    // other Design system properties) {    companion object {        val colors: CustomThemingWithStyles.JetsnackColors            @Composable @ReadOnlyComposable            get() = LocalJetsnackTheme.current.colors        // ...
            // add helper static reference        val styles: ComponentStyles = ComponentStyles    }}
    <br />
  4. Provide extensions on StyleScope to reference theme tokens directly if they are exposed using CompositionLocals. For example:

    kotlin
    val StyleScope.colors: JetsnackColors    get() = LocalJetsnackTheme.currentValue.colors
    val StyleScope.typography: androidx.compose.material3.Typography    get() = LocalJetsnackTheme.currentValue.typography
    val StyleScope.shapes: Shapes    get() = LocalJetsnackTheme.currentValue.shapes
    <br />

Step 3: Migrate a component to Styles API

For each custom component (for example, CustomButton), complete the following sequence:

  1. Establish a visual baseline (If an emulator is available):
    • If you CANNOT run an Android emulator: Skip this step entirely and proceed to Step 2.
    • If you CAN run an Android emulator: Perform the following to capture a baseline screenshot:
      • Option A: Locate and run an existing screenshot test for the component.
      • Option B (If no test exists): Create a test using the project's existing testing framework, then run it.
      • Option C (If no framework exists): Create a minimal screenshot test using UI Automator or Espresso, then run it.
  2. Remove individual styling parameters : Remove styling parameters such as backgroundColor, shape, textStyle, and contentPadding from the signature - anything that StyleScope supports.
  3. Add the style parameter : Add style: Style = Style to the function signature. Always ensure the default value is exactly Style (e.g., style: Style = Style) and not a specific style default like ChipStyleDefault or any other value.
  4. Declare state tracking : If the component is interactable, create a MutableStyleState using the interaction source. Update state fields (such as isEnabled) inside the Composable to track the state correctly.
  5. Apply styleable modifier : Replace specific layout modifiers on the root element with Modifier.styleable().
  6. Move defaults to ComponentStyles : Move hardcoded values from the component definition to a dedicated Style instance in ComponentStyles.kt.
  7. Validate component: Compare the baseline screenshot image taken at the start with the rendered Compose Preview of the new composable. Ignore string content; focus on layout and styling. Iterate on the Compose code until visual parity is achieved. Once verified, write a Compose UI test for the new composable.
Migration example

Before Migration:

kotlin
@Composablefun CustomButton(    onClick: () -> Unit,    modifier: Modifier = Modifier,    backgroundColor: Color = JetsnackTheme.colors.brandLight,    disabledBackgroundColor: Color = JetsnackTheme.colors.brandSecondary,    shape: Shape = JetsnackTheme.shapes.extraLarge,    textStyle: TextStyle = JetsnackTheme.typography.labelLarge,    enabled: Boolean = true,    content: @Composable RowScope.() -> Unit,) {    val interactionSource = remember { MutableInteractionSource() }    Row(        modifier            .clickable(onClick = onClick, indication = null, interactionSource = interactionSource)            .background(if (enabled) backgroundColor else disabledBackgroundColor, shape)            .defaultMinSize(58.dp, 40.dp),        horizontalArrangement = Arrangement.Center,        verticalAlignment = Alignment.CenterVertically,        content = content,    )}
<br />

After Migration:

kotlin
// Exposed via ComponentStyles.ktobject ComponentStyles {    val buttonStyle = Style {        background(colors.brandLight)        shape(shapes.extraLarge)        minWidth(58.dp)        minHeight(40.dp)        textStyle(typography.labelLarge)        disabled {            background(colors.brandSecondary)        }    }}
@Composablefun CustomButton(    onClick: () -> Unit,    modifier: Modifier = Modifier,    style: Style = Style,    enabled: Boolean = true,    content: @Composable RowScope.() -> Unit,) {    val interactionSource = remember { MutableInteractionSource() }    val styleState = rememberUpdatedStyleState(interactionSource) {        it.isEnabled = enabled    }    Row(        modifier            .clickable(onClick = onClick, indication = null, interactionSource = interactionSource)            .styleable(styleState, JetsnackTheme.styles.buttonStyle, style),        horizontalArrangement = Arrangement.Center,        verticalAlignment = Alignment.CenterVertically,        content = content,    )}
<br />

Step 4: Validate Changes

  1. Build the project. Verify that there are no compilation errors.
  2. Run your module's screenshot tests.
  3. Compare visual outputs of the whole app between the previous and updated components. Verify that no visual layout regressions occur.

Source and attribution

Source:android/skillsinjetpack-compose/theming/stylesat commit42dc227

License: Complete terms in LICENSE.txt

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal

More from android/skills

Wear Compose M3

android

Guides building, updating and migrating Wear OS Compose Material3 apps, with canonical component samples and version rules.

Software Development7.7Kupdated 13 days ago

Display Glasses With Jetpack Compose Glimmer

android

Provides guidelines for developing projected Android XR apps for display glasses using the Jetpack Compose Glimmer UI toolkit. This skill covers foundational Glimmer design principles, workflows for implementing Jetpack Compose Glimmer, and interaction models for the glasses form factor. Use this skill to build an Android XR Augmented Experience app with Jetpack Compose Glimmer that adheres to the Glimmer design system for optimized glasses styling.

Awaiting classification7.7Kupdated 13 days ago

Play Billing Library Version Upgrade

android

Guides upgrading an Android project from a legacy Google Play Billing Library version to the latest stable release.

Software Development7.7Kupdated 13 days ago

Leanback To Compose Tv Migration

android

Provides instructions and architectural patterns for migrating Android TV applications from legacy Leanback UI Toolkit, Android Views, or Support Fragments to Jetpack Compose for TV (androidx.tv). Use this skill for Leanback to Compose migrations, including browse screen, settings screen, authentication screen, login screen, or video playback screen migrations, or when replacing BrowseSupportFragment, LeanbackSettingsFragment, PreferenceFragment, BaseLeanbackPreferenceFragmentCompat, VideoSupportFragment, GuidedStepSupportFragment, SearchSupportFragment, VerticalGridSupportFragment, Presenter, ArrayObjectAdapter, or CursorMapper with modern Compose equivalents, implementing immersive carousels with focus memory, Media3 video playback with PlayerSurface, or custom 10-foot hero layouts.

Awaiting classification7.7Kupdated 13 days ago

Testing Setup

android

Analyzes an Android project's testing setup and installs testing frameworks, harnesses and tests for unit, UI, screenshot and end-to-end coverage.

Software Development7.7Kupdated 13 days ago

Android Profiler

android

Guides Android performance profiling: recording system traces, heap dumps and method recordings, and analyzing them with Perfetto SQL.

Software Development7.7Kupdated 13 days ago