From a922fc2cae1e34237cbac3e0f9e72a2fb702e3e0 Mon Sep 17 00:00:00 2001 From: Jacob Ras Date: Thu, 22 Jan 2026 19:54:29 +0100 Subject: [PATCH 1/9] Rename "use location" to "sample checkbox" --- .../composeactionmenu/sample/MainActivity.kt | 12 +++++++----- sample-app/src/main/res/values/strings.xml | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/sample-app/src/main/kotlin/nl/jacobras/composeactionmenu/sample/MainActivity.kt b/sample-app/src/main/kotlin/nl/jacobras/composeactionmenu/sample/MainActivity.kt index 9e35767..6acb5c1 100644 --- a/sample-app/src/main/kotlin/nl/jacobras/composeactionmenu/sample/MainActivity.kt +++ b/sample-app/src/main/kotlin/nl/jacobras/composeactionmenu/sample/MainActivity.kt @@ -9,6 +9,8 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.AccountBox +import androidx.compose.material.icons.filled.Create import androidx.compose.material.icons.filled.Email import androidx.compose.material.icons.filled.Home import androidx.compose.material.icons.filled.Info @@ -41,7 +43,7 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { - val useLocation = remember { mutableStateOf(false) } + val sampleCheckbox = remember { mutableStateOf(false) } val contactMethod = remember { mutableIntStateOf(2) } val person = remember { mutableIntStateOf(1) } @@ -50,7 +52,7 @@ class MainActivity : ComponentActivity() { topBar = { TopAppBar( title = { Text(text = stringResource(id = R.string.app_name)) }, - actions = { ActionMenu(items = buildToolbarActions(useLocation, contactMethod, person)) } + actions = { ActionMenu(items = buildToolbarActions(sampleCheckbox, contactMethod, person)) } ) }, containerColor = MaterialTheme.colorScheme.surfaceContainer @@ -62,7 +64,7 @@ class MainActivity : ComponentActivity() { ) { Text("Welcome to the sample app! Try out the menu options above.") Spacer(modifier = Modifier.height(8.dp)) - Text("Use location (just some example text): ${useLocation.value}") + Text("Sample checkbox: ${sampleCheckbox.value}") Spacer(modifier = Modifier.height(8.dp)) Text("Person selected: #${person.intValue}") Spacer(modifier = Modifier.height(8.dp)) @@ -112,8 +114,8 @@ class MainActivity : ComponentActivity() { ), CheckableActionItem( key = "useLocation", - title = stringResource(R.string.use_location), - iconVector = Icons.Default.LocationOn, + title = stringResource(R.string.sample_checkbox), + iconVector = Icons.Default.AccountBox, isChecked = useLocationState.value, onClick = { useLocationState.value = !useLocationState.value } ), diff --git a/sample-app/src/main/res/values/strings.xml b/sample-app/src/main/res/values/strings.xml index 65f2598..83d7032 100644 --- a/sample-app/src/main/res/values/strings.xml +++ b/sample-app/src/main/res/values/strings.xml @@ -9,7 +9,7 @@ Phone E-mail Post - Use location + Sample checkbox Settings Disabled example \ No newline at end of file From d3b3830468ec5560a54a0e52054941fb20b51049 Mon Sep 17 00:00:00 2001 From: Jacob Ras Date: Thu, 22 Jan 2026 20:00:06 +0100 Subject: [PATCH 2/9] Bump maven-publish to 0.36.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 852a6e8..57bda11 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,4 +22,4 @@ android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } compose-multiplatform = { id = "org.jetbrains.compose", version.ref = "compose" } -maven-publish = { id = "com.vanniktech.maven.publish", version = "0.30.0" } \ No newline at end of file +maven-publish = { id = "com.vanniktech.maven.publish", version = "0.36.0" } \ No newline at end of file From 7586b5e5a6bc4c84f02ddbfbf00a6595c71b7f6d Mon Sep 17 00:00:00 2001 From: Jacob Ras Date: Thu, 22 Jan 2026 20:00:48 +0100 Subject: [PATCH 3/9] Inline previews --- compose-action-menu/build.gradle.kts | 7 +- .../IconActionItemPreviews.kt | 92 ------------------ .../OverflowActionItemPreviews.kt | 93 ------------------- .../composeactionmenu/IconActionItem.kt | 89 ++++++++++++++++++ .../composeactionmenu/OverflowActionItem.kt | 89 ++++++++++++++++++ .../composeactionmenu/PreviewAnnotations.kt | 4 +- gradle/libs.versions.toml | 1 + 7 files changed, 183 insertions(+), 192 deletions(-) delete mode 100644 compose-action-menu/src/androidMain/kotlin/nl/jacobras/composeactionmenu/IconActionItemPreviews.kt delete mode 100644 compose-action-menu/src/androidMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItemPreviews.kt rename compose-action-menu/src/{androidMain => commonMain}/kotlin/nl/jacobras/composeactionmenu/PreviewAnnotations.kt (83%) diff --git a/compose-action-menu/build.gradle.kts b/compose-action-menu/build.gradle.kts index bf67a62..184b036 100644 --- a/compose-action-menu/build.gradle.kts +++ b/compose-action-menu/build.gradle.kts @@ -77,11 +77,8 @@ kotlin { implementation(libs.compose.icons) implementation(libs.compose.material3) implementation(libs.compose.ui) - } - } - val androidMain by getting { - dependencies { - implementation(compose.uiTooling) + implementation(libs.compose.uiTooling) + implementation(libs.compose.uiToolingPreview) } } } diff --git a/compose-action-menu/src/androidMain/kotlin/nl/jacobras/composeactionmenu/IconActionItemPreviews.kt b/compose-action-menu/src/androidMain/kotlin/nl/jacobras/composeactionmenu/IconActionItemPreviews.kt deleted file mode 100644 index 358ba25..0000000 --- a/compose-action-menu/src/androidMain/kotlin/nl/jacobras/composeactionmenu/IconActionItemPreviews.kt +++ /dev/null @@ -1,92 +0,0 @@ -package nl.jacobras.composeactionmenu - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Search -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable - -@PreviewUiComponent -@Composable -private fun RegularIconActionPreview() { - IconActionItem( - item = RegularActionItem( - key = "search", - title = "OK", - iconVector = Icons.Filled.Search, - onClick = {} - ), - contentColor = MaterialTheme.colorScheme.onSurface - ) -} - -@PreviewUiComponent -@Composable -private fun BlueIconActionPreview() { - IconActionItem( - item = RegularActionItem( - key = "search", - title = "OK", - iconVector = Icons.Filled.Search, - onClick = {} - ), - contentColor = MaterialTheme.colorScheme.onSurface - ) -} - -@PreviewUiComponent -@Composable -private fun DisabledIconActionPreview() { - IconActionItem( - item = RegularActionItem( - key = "search", - title = "OK", - iconVector = Icons.Filled.Search, - enabled = false, - onClick = {} - ), - contentColor = MaterialTheme.colorScheme.onSurface - ) -} - -@PreviewUiComponent -@Composable -private fun TextIconActionPreview() { - IconActionItem( - item = RegularActionItem( - key = "search", - title = "OK", - iconVector = null, - onClick = {} - ), - contentColor = MaterialTheme.colorScheme.onSurface - ) -} - -@PreviewUiComponent -@Composable -private fun BlueTextIconActionPreview() { - IconActionItem( - item = RegularActionItem( - key = "search", - title = "OK", - iconVector = null, - onClick = {} - ), - contentColor = MaterialTheme.colorScheme.onSurface - ) -} - -@PreviewUiComponent -@Composable -private fun DisabledTextIconActionPreview() { - IconActionItem( - item = RegularActionItem( - key = "search", - title = "OK", - iconVector = null, - enabled = false, - onClick = {} - ), - contentColor = MaterialTheme.colorScheme.onSurface - ) -} \ No newline at end of file diff --git a/compose-action-menu/src/androidMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItemPreviews.kt b/compose-action-menu/src/androidMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItemPreviews.kt deleted file mode 100644 index c7734e3..0000000 --- a/compose-action-menu/src/androidMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItemPreviews.kt +++ /dev/null @@ -1,93 +0,0 @@ -package nl.jacobras.composeactionmenu - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Search -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable - -@PreviewUiComponent -@Composable -private fun RegularOverflowActionPreview() { - OverflowActionItem( - item = RegularActionItem( - key = "search", - title = "OK", - iconVector = Icons.Filled.Search, - onClick = {} - ), - contentColor = MaterialTheme.colorScheme.onSurface - ) -} - -@PreviewUiComponent -@Composable -private fun RegularOverflowActionWithoutIconPreview() { - OverflowActionItem( - item = RegularActionItem( - key = "search", - title = "OK", - iconVector = null, - onClick = {} - ), - contentColor = MaterialTheme.colorScheme.onSurface - ) -} - -@PreviewUiComponent -@Composable -private fun DisabledOverflowActionWithoutIconPreview() { - OverflowActionItem( - item = RegularActionItem( - key = "search", - title = "OK", - iconVector = null, - enabled = false, - onClick = {} - ), - contentColor = MaterialTheme.colorScheme.onSurface - ) -} - -@PreviewUiComponent -@Composable -private fun CheckableOverflowActionPreview() { - OverflowActionItem( - item = CheckableActionItem( - key = "search", - title = "OK", - iconVector = Icons.Filled.Search, - isChecked = true, - onClick = {} - ), - contentColor = MaterialTheme.colorScheme.onSurface - ) -} - -@PreviewUiComponent -@Composable -private fun RadioOverflowActionPreview() { - OverflowActionItem( - item = RadioActionItem( - key = "search", - title = "OK", - iconVector = Icons.Filled.Search, - isSelected = true, - onClick = {} - ), - contentColor = MaterialTheme.colorScheme.onSurface - ) -} - -@PreviewUiComponent -@Composable -private fun GroupOverflowActionPreview() { - OverflowActionItem( - item = GroupActionItem( - key = "search", - title = "OK", - iconVector = Icons.Filled.Search, - childOptions = emptyList() - ), - contentColor = MaterialTheme.colorScheme.onSurface - ) -} \ No newline at end of file diff --git a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/IconActionItem.kt b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/IconActionItem.kt index 56ff50e..ef9bd0e 100644 --- a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/IconActionItem.kt +++ b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/IconActionItem.kt @@ -1,7 +1,10 @@ package nl.jacobras.composeactionmenu +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Search import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable @@ -55,4 +58,90 @@ internal fun IconActionItem( Text(text = title, color = contentColor) } } +} + +@PreviewUiComponent +@Composable +private fun RegularIconActionPreview() { + IconActionItem( + item = RegularActionItem( + key = "search", + title = "OK", + iconVector = Icons.Filled.Search, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface + ) +} + +@PreviewUiComponent +@Composable +private fun BlueIconActionPreview() { + IconActionItem( + item = RegularActionItem( + key = "search", + title = "OK", + iconVector = Icons.Filled.Search, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface + ) +} + +@PreviewUiComponent +@Composable +private fun DisabledIconActionPreview() { + IconActionItem( + item = RegularActionItem( + key = "search", + title = "OK", + iconVector = Icons.Filled.Search, + enabled = false, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface + ) +} + +@PreviewUiComponent +@Composable +private fun TextIconActionPreview() { + IconActionItem( + item = RegularActionItem( + key = "search", + title = "OK", + iconVector = null, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface + ) +} + +@PreviewUiComponent +@Composable +private fun BlueTextIconActionPreview() { + IconActionItem( + item = RegularActionItem( + key = "search", + title = "OK", + iconVector = null, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface + ) +} + +@PreviewUiComponent +@Composable +private fun DisabledTextIconActionPreview() { + IconActionItem( + item = RegularActionItem( + key = "search", + title = "OK", + iconVector = null, + enabled = false, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface + ) } \ No newline at end of file diff --git a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt index 6066658..48350f7 100644 --- a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt +++ b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt @@ -7,9 +7,11 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight +import androidx.compose.material.icons.filled.Search import androidx.compose.material3.Checkbox import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -113,4 +115,91 @@ internal fun OverflowActionItem( } } ) +} + +@PreviewUiComponent +@Composable +private fun RegularOverflowActionPreview() { + OverflowActionItem( + item = RegularActionItem( + key = "search", + title = "OK", + iconVector = Icons.Filled.Search, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface + ) +} + +@PreviewUiComponent +@Composable +private fun RegularOverflowActionWithoutIconPreview() { + OverflowActionItem( + item = RegularActionItem( + key = "search", + title = "OK", + iconVector = null, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface + ) +} + +@PreviewUiComponent +@Composable +private fun DisabledOverflowActionWithoutIconPreview() { + OverflowActionItem( + item = RegularActionItem( + key = "search", + title = "OK", + iconVector = null, + enabled = false, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface + ) +} + +@PreviewUiComponent +@Composable +private fun CheckableOverflowActionPreview() { + OverflowActionItem( + item = CheckableActionItem( + key = "search", + title = "OK", + iconVector = Icons.Filled.Search, + isChecked = true, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface + ) +} + +@PreviewUiComponent +@Composable +private fun RadioOverflowActionPreview() { + OverflowActionItem( + item = RadioActionItem( + key = "search", + title = "OK", + iconVector = Icons.Filled.Search, + isSelected = true, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface + ) +} + +@PreviewUiComponent +@Composable +private fun GroupOverflowActionPreview() { + OverflowActionItem( + item = GroupActionItem( + key = "search", + title = "OK", + iconVector = Icons.Filled.Search, + childOptions = emptyList() + ), + contentColor = MaterialTheme.colorScheme.onSurface + ) } \ No newline at end of file diff --git a/compose-action-menu/src/androidMain/kotlin/nl/jacobras/composeactionmenu/PreviewAnnotations.kt b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/PreviewAnnotations.kt similarity index 83% rename from compose-action-menu/src/androidMain/kotlin/nl/jacobras/composeactionmenu/PreviewAnnotations.kt rename to compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/PreviewAnnotations.kt index 57f511e..f18ad75 100644 --- a/compose-action-menu/src/androidMain/kotlin/nl/jacobras/composeactionmenu/PreviewAnnotations.kt +++ b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/PreviewAnnotations.kt @@ -1,7 +1,7 @@ package nl.jacobras.composeactionmenu -import android.content.res.Configuration.UI_MODE_NIGHT_YES -import android.content.res.Configuration.UI_MODE_TYPE_NORMAL +import androidx.compose.ui.tooling.preview.AndroidUiModes.UI_MODE_NIGHT_YES +import androidx.compose.ui.tooling.preview.AndroidUiModes.UI_MODE_TYPE_NORMAL import androidx.compose.ui.tooling.preview.Preview /** diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 57bda11..4a0f435 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,6 +13,7 @@ compose-material3 = { module = "org.jetbrains.compose.material3:material3", vers compose-resources = { module = "org.jetbrains.compose.components:components-resources", version.ref = "compose" } compose-runtime = { module = "org.jetbrains.compose.runtime:runtime", version.ref = "compose" } compose-ui = { module = "org.jetbrains.compose.ui:ui", version.ref = "compose" } +compose-uiTooling = { module = "org.jetbrains.compose.ui:ui-tooling", version.ref = "compose" } compose-uiToolingPreview = { module = "org.jetbrains.compose.ui:ui-tooling-preview", version.ref = "compose" } [bundles] From 89a9c6993478020bd2bd14547a8ada141c5e53c3 Mon Sep 17 00:00:00 2001 From: Jacob Ras Date: Thu, 22 Jan 2026 20:02:54 +0100 Subject: [PATCH 4/9] Streamline CI build setup --- .github/actions/build-setup/action.yml | 17 +++++++++++++++++ .github/workflows/build.yml | 9 +++------ .github/workflows/publish.yml | 9 +++------ 3 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 .github/actions/build-setup/action.yml diff --git a/.github/actions/build-setup/action.yml b/.github/actions/build-setup/action.yml new file mode 100644 index 0000000..8913288 --- /dev/null +++ b/.github/actions/build-setup/action.yml @@ -0,0 +1,17 @@ +name: Build Setup +description: Sets up Java, Gradle and Android. + +runs: + using: composite + steps: + - name: Set up JDK + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 24 # Can't upgrade to 25 before Detekt 2.0 is out. + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1cd88ca..3d7b057 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,15 +15,12 @@ jobs: timeout-minutes: 15 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: clean: ${{ github.ref == 'refs/heads/develop' }} - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: 17 + - name: Build setup + uses: ./.github/actions/build-setup - name: Compile run: ./gradlew assemble \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 652fcd8..d0ca837 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -7,13 +7,10 @@ jobs: runs-on: macos-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: 17 + - name: Build setup + uses: ./.github/actions/build-setup - name: Publish Library env: From bec0d49d09ecf16812d022306259cb656bf617a6 Mon Sep 17 00:00:00 2001 From: Jacob Ras Date: Thu, 22 Jan 2026 20:16:44 +0100 Subject: [PATCH 5/9] Pad icons if needed Fixes #43 --- compose-action-menu/build.gradle.kts | 21 +++--- .../jacobras/composeactionmenu/ActionMenu.kt | 3 +- .../composeactionmenu/IconActionItem.kt | 3 + .../composeactionmenu/OverflowActionItem.kt | 66 +++++++++++++++---- 4 files changed, 66 insertions(+), 27 deletions(-) diff --git a/compose-action-menu/build.gradle.kts b/compose-action-menu/build.gradle.kts index 184b036..2454735 100644 --- a/compose-action-menu/build.gradle.kts +++ b/compose-action-menu/build.gradle.kts @@ -1,4 +1,3 @@ -import com.vanniktech.maven.publish.SonatypeHost import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl plugins { @@ -13,7 +12,7 @@ group = "nl.jacobras" version = "3.1.0" mavenPublishing { - publishToMavenCentral(SonatypeHost.S01, true) + publishToMavenCentral() signAllPublications() pom { @@ -71,19 +70,15 @@ kotlin { wasmJs { browser() } sourceSets { - val commonMain by getting { - dependencies { - implementation(libs.compose.foundation) - implementation(libs.compose.icons) - implementation(libs.compose.material3) - implementation(libs.compose.ui) - implementation(libs.compose.uiTooling) - implementation(libs.compose.uiToolingPreview) - } + commonMain.dependencies { + implementation(libs.compose.foundation) + implementation(libs.compose.icons) + implementation(libs.compose.material3) + implementation(libs.compose.ui) + implementation(libs.compose.uiTooling) + implementation(libs.compose.uiToolingPreview) } } - - jvmToolchain(17) } // From https://github.com/gradle/gradle/issues/26091#issuecomment-1722947958 diff --git a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/ActionMenu.kt b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/ActionMenu.kt index 9108f4f..9ec5a97 100644 --- a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/ActionMenu.kt +++ b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/ActionMenu.kt @@ -102,7 +102,8 @@ fun ActionMenu( modifier = Modifier.testTag("ActionMenu#${item.key}"), hideTopMenu = { showOverflowMenu = false }, showSubMenu = { subMenuContent = it }, - hideSubMenu = { subMenuContent = emptyList() } + hideSubMenu = { subMenuContent = emptyList() }, + addPaddingIfNoIcon = content.any { it.icon != null || it.iconVector != null } ) } } diff --git a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/IconActionItem.kt b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/IconActionItem.kt index ef9bd0e..a180f9f 100644 --- a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/IconActionItem.kt +++ b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/IconActionItem.kt @@ -12,6 +12,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.rememberVectorPainter +/** + * An action item that shows an icon (or text when no icon is provided) for use in a toolbar. + */ @Composable internal fun IconActionItem( item: ActionItem, diff --git a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt index 48350f7..f10bc7d 100644 --- a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt +++ b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt @@ -1,5 +1,6 @@ package nl.jacobras.composeactionmenu +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -22,10 +23,14 @@ import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +/** + * An action item for use in the overflow menu. + */ @Composable internal fun OverflowActionItem( item: ActionItem, contentColor: Color, + addPaddingIfNoIcon: Boolean, modifier: Modifier = Modifier, hideTopMenu: () -> Unit = {}, showSubMenu: (items: List) -> Unit = {}, @@ -76,8 +81,10 @@ internal fun OverflowActionItem( contentDescription = null, tint = contentColor ) + Spacer(modifier = Modifier.width(8.dp)) + } else if (addPaddingIfNoIcon) { + Spacer(modifier = Modifier.width(32.dp)) } - Spacer(modifier = Modifier.width(8.dp)) val textAlpha = if (item.enabled) 1.0f else 0.5f Text( @@ -119,7 +126,7 @@ internal fun OverflowActionItem( @PreviewUiComponent @Composable -private fun RegularOverflowActionPreview() { +private fun RegularOverflowActionItemPreview() { OverflowActionItem( item = RegularActionItem( key = "search", @@ -127,13 +134,14 @@ private fun RegularOverflowActionPreview() { iconVector = Icons.Filled.Search, onClick = {} ), - contentColor = MaterialTheme.colorScheme.onSurface + contentColor = MaterialTheme.colorScheme.onSurface, + addPaddingIfNoIcon = false ) } @PreviewUiComponent @Composable -private fun RegularOverflowActionWithoutIconPreview() { +private fun RegularOverflowActionItemWithoutIconPreview() { OverflowActionItem( item = RegularActionItem( key = "search", @@ -141,13 +149,41 @@ private fun RegularOverflowActionWithoutIconPreview() { iconVector = null, onClick = {} ), - contentColor = MaterialTheme.colorScheme.onSurface + contentColor = MaterialTheme.colorScheme.onSurface, + addPaddingIfNoIcon = false ) } @PreviewUiComponent @Composable -private fun DisabledOverflowActionWithoutIconPreview() { +private fun OverflowActionItemWithPadding() { + Column { + OverflowActionItem( + item = RegularActionItem( + key = "search", + title = "OK", + iconVector = Icons.Filled.Search, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface, + addPaddingIfNoIcon = true + ) + OverflowActionItem( + item = RegularActionItem( + key = "somethingElse", + title = "Something else", + iconVector = null, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface, + addPaddingIfNoIcon = true + ) + } +} + +@PreviewUiComponent +@Composable +private fun DisabledOverflowActionItemWithoutIconPreview() { OverflowActionItem( item = RegularActionItem( key = "search", @@ -156,13 +192,14 @@ private fun DisabledOverflowActionWithoutIconPreview() { enabled = false, onClick = {} ), - contentColor = MaterialTheme.colorScheme.onSurface + contentColor = MaterialTheme.colorScheme.onSurface, + addPaddingIfNoIcon = false ) } @PreviewUiComponent @Composable -private fun CheckableOverflowActionPreview() { +private fun CheckableOverflowActionItemPreview() { OverflowActionItem( item = CheckableActionItem( key = "search", @@ -171,13 +208,14 @@ private fun CheckableOverflowActionPreview() { isChecked = true, onClick = {} ), - contentColor = MaterialTheme.colorScheme.onSurface + contentColor = MaterialTheme.colorScheme.onSurface, + addPaddingIfNoIcon = false ) } @PreviewUiComponent @Composable -private fun RadioOverflowActionPreview() { +private fun RadioOverflowActionItemPreview() { OverflowActionItem( item = RadioActionItem( key = "search", @@ -186,13 +224,14 @@ private fun RadioOverflowActionPreview() { isSelected = true, onClick = {} ), - contentColor = MaterialTheme.colorScheme.onSurface + contentColor = MaterialTheme.colorScheme.onSurface, + addPaddingIfNoIcon = false ) } @PreviewUiComponent @Composable -private fun GroupOverflowActionPreview() { +private fun GroupOverflowActionItemPreview() { OverflowActionItem( item = GroupActionItem( key = "search", @@ -200,6 +239,7 @@ private fun GroupOverflowActionPreview() { iconVector = Icons.Filled.Search, childOptions = emptyList() ), - contentColor = MaterialTheme.colorScheme.onSurface + contentColor = MaterialTheme.colorScheme.onSurface, + addPaddingIfNoIcon = false ) } \ No newline at end of file From 4d49b632933df6a5302f39568a374060ad4ebdba Mon Sep 17 00:00:00 2001 From: Jacob Ras Date: Thu, 22 Jan 2026 20:18:13 +0100 Subject: [PATCH 6/9] Grey out icon if the action item is disabled Fixes #44 --- .../composeactionmenu/OverflowActionItem.kt | 20 +++++++++++++++++-- .../composeactionmenu/sample/MainActivity.kt | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt index f10bc7d..84743dd 100644 --- a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt +++ b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt @@ -75,18 +75,18 @@ internal fun OverflowActionItem( item.icon != null -> item.icon else -> null } + val textAlpha = if (item.enabled) 1.0f else 0.5f if (iconPainter != null) { Icon( painter = iconPainter, contentDescription = null, - tint = contentColor + tint = contentColor.copy(textAlpha) ) Spacer(modifier = Modifier.width(8.dp)) } else if (addPaddingIfNoIcon) { Spacer(modifier = Modifier.width(32.dp)) } - val textAlpha = if (item.enabled) 1.0f else 0.5f Text( modifier = Modifier .weight(1f) @@ -197,6 +197,22 @@ private fun DisabledOverflowActionItemWithoutIconPreview() { ) } +@PreviewUiComponent +@Composable +private fun DisabledOverflowActionItemWithIconPreview() { + OverflowActionItem( + item = RegularActionItem( + key = "search", + title = "OK", + iconVector = Icons.Filled.Search, + enabled = false, + onClick = {} + ), + contentColor = MaterialTheme.colorScheme.onSurface, + addPaddingIfNoIcon = false + ) +} + @PreviewUiComponent @Composable private fun CheckableOverflowActionItemPreview() { diff --git a/sample-app/src/main/kotlin/nl/jacobras/composeactionmenu/sample/MainActivity.kt b/sample-app/src/main/kotlin/nl/jacobras/composeactionmenu/sample/MainActivity.kt index 6acb5c1..275b650 100644 --- a/sample-app/src/main/kotlin/nl/jacobras/composeactionmenu/sample/MainActivity.kt +++ b/sample-app/src/main/kotlin/nl/jacobras/composeactionmenu/sample/MainActivity.kt @@ -14,7 +14,6 @@ import androidx.compose.material.icons.filled.Create import androidx.compose.material.icons.filled.Email import androidx.compose.material.icons.filled.Home import androidx.compose.material.icons.filled.Info -import androidx.compose.material.icons.filled.LocationOn import androidx.compose.material.icons.filled.Person import androidx.compose.material.icons.filled.Phone import androidx.compose.material3.ExperimentalMaterial3Api @@ -149,6 +148,7 @@ class MainActivity : ComponentActivity() { RegularActionItem( key = "disabledExample", title = stringResource(R.string.disabled_example), + iconVector = Icons.Default.Create, showAsAction = ShowAsActionMode.NEVER, enabled = false, onClick = ::onActionItemClick From 41307d450900190eda8137e4b9093167d78e7e61 Mon Sep 17 00:00:00 2001 From: Jacob Ras Date: Thu, 22 Jan 2026 20:20:43 +0100 Subject: [PATCH 7/9] Improve icon alignment --- .../kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt index 84743dd..133e53f 100644 --- a/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt +++ b/compose-action-menu/src/commonMain/kotlin/nl/jacobras/composeactionmenu/OverflowActionItem.kt @@ -77,12 +77,13 @@ internal fun OverflowActionItem( } val textAlpha = if (item.enabled) 1.0f else 0.5f if (iconPainter != null) { + Spacer(modifier = Modifier.width(2.dp)) Icon( painter = iconPainter, contentDescription = null, tint = contentColor.copy(textAlpha) ) - Spacer(modifier = Modifier.width(8.dp)) + Spacer(modifier = Modifier.width(6.dp)) } else if (addPaddingIfNoIcon) { Spacer(modifier = Modifier.width(32.dp)) } From ad4808046f15e7f3f8f29fd377d74f9148cdfcdd Mon Sep 17 00:00:00 2001 From: Jacob Ras Date: Thu, 22 Jan 2026 20:24:33 +0100 Subject: [PATCH 8/9] Fix dependency nonsense --- compose-action-menu/build.gradle.kts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/compose-action-menu/build.gradle.kts b/compose-action-menu/build.gradle.kts index 2454735..17fccef 100644 --- a/compose-action-menu/build.gradle.kts +++ b/compose-action-menu/build.gradle.kts @@ -1,3 +1,4 @@ +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl plugins { @@ -75,9 +76,14 @@ kotlin { implementation(libs.compose.icons) implementation(libs.compose.material3) implementation(libs.compose.ui) - implementation(libs.compose.uiTooling) implementation(libs.compose.uiToolingPreview) } + @OptIn(ExperimentalKotlinGradlePluginApi::class) + invokeWhenCreated("androidDebug") { + dependencies { + implementation(libs.compose.uiTooling) + } + } } } From 98abc1c08d7a5f5528b9c9a0a14d39277d654835 Mon Sep 17 00:00:00 2001 From: Jacob Ras Date: Thu, 22 Jan 2026 20:26:10 +0100 Subject: [PATCH 9/9] Fix local publishing --- compose-action-menu/build.gradle.kts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/compose-action-menu/build.gradle.kts b/compose-action-menu/build.gradle.kts index 17fccef..1591776 100644 --- a/compose-action-menu/build.gradle.kts +++ b/compose-action-menu/build.gradle.kts @@ -7,6 +7,7 @@ plugins { alias(libs.plugins.compose.multiplatform) alias(libs.plugins.compose.compiler) alias(libs.plugins.maven.publish) + signing } group = "nl.jacobras" @@ -91,4 +92,10 @@ kotlin { tasks.withType().configureEach { val signingTasks = tasks.withType() mustRunAfter(signingTasks) +} + +signing { + setRequired { + !gradle.taskGraph.allTasks.any { it is PublishToMavenLocal } + } } \ No newline at end of file