From cd11faf1fad88d6b06cfe979a23c185fcfbf9029 Mon Sep 17 00:00:00 2001 From: PJ Date: Sat, 25 Apr 2026 19:50:19 +0700 Subject: [PATCH] feat(folio): add screen root contentDescription for scoped ax selection Each screen root gets semantics { contentDescription = "ScreenName" } so sanderling specs can scope element lookups through the screen: desc:LoginScreen > desc:login_submit. --- .../kotlin/app/folio/feature/account/AddAccountScreen.kt | 4 +++- .../commonMain/kotlin/app/folio/feature/auth/LoginScreen.kt | 4 +++- .../commonMain/kotlin/app/folio/feature/home/HomeScreen.kt | 2 +- .../kotlin/app/folio/feature/ledger/AddTransactionScreen.kt | 4 +++- .../kotlin/app/folio/feature/ledger/LedgerScreen.kt | 2 +- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/account/AddAccountScreen.kt b/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/account/AddAccountScreen.kt index b3f15d4..f4d017b 100644 --- a/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/account/AddAccountScreen.kt +++ b/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/account/AddAccountScreen.kt @@ -14,6 +14,8 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp import app.folio.data.Repository import app.folio.navigation.Navigator @@ -60,7 +62,7 @@ fun AddAccountScreen() { } Screen( - modifier = Modifier.testTag("AddAccountScreen"), + modifier = Modifier.testTag("AddAccountScreen").semantics { contentDescription = "AddAccountScreen" }, header = { Header(title = "New account", left = { BackButton(onClick = { Navigator.back(Route.Home) }) }) }, diff --git a/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/auth/LoginScreen.kt b/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/auth/LoginScreen.kt index bde7a33..be1149c 100644 --- a/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/auth/LoginScreen.kt +++ b/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/auth/LoginScreen.kt @@ -16,6 +16,8 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import app.folio.data.Repository @@ -60,7 +62,7 @@ fun LoginScreen(onLoggedIn: (String) -> Unit) { onLoggedIn(user) } - Screen(modifier = Modifier.testTag("LoginScreen")) { + Screen(modifier = Modifier.testTag("LoginScreen").semantics { contentDescription = "LoginScreen" }) { Spacer(Modifier.height(16.dp)) Column( modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp), diff --git a/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/home/HomeScreen.kt b/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/home/HomeScreen.kt index fb0e574..f6345c9 100644 --- a/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/home/HomeScreen.kt +++ b/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/home/HomeScreen.kt @@ -50,7 +50,7 @@ fun HomeScreen(user: String, onLogout: () -> Unit) { val total = balanceOf(txns) Screen( - modifier = Modifier.testTag("HomeScreen"), + modifier = Modifier.testTag("HomeScreen").semantics { contentDescription = "HomeScreen" }, header = { Header( title = "Accounts", diff --git a/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/ledger/AddTransactionScreen.kt b/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/ledger/AddTransactionScreen.kt index 83ee08f..714abfb 100644 --- a/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/ledger/AddTransactionScreen.kt +++ b/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/ledger/AddTransactionScreen.kt @@ -13,6 +13,8 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -91,7 +93,7 @@ fun AddTransactionScreen(accountId: String) { } Screen( - modifier = Modifier.testTag("AddTransactionScreen"), + modifier = Modifier.testTag("AddTransactionScreen").semantics { contentDescription = "AddTransactionScreen" }, header = { Header( title = "Add transaction", diff --git a/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/ledger/LedgerScreen.kt b/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/ledger/LedgerScreen.kt index e6d4273..6412e21 100644 --- a/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/ledger/LedgerScreen.kt +++ b/examples/folio/composeApp/src/commonMain/kotlin/app/folio/feature/ledger/LedgerScreen.kt @@ -75,7 +75,7 @@ fun LedgerScreen(accountId: String) { val balance = balanceOf(txns) Screen( - modifier = Modifier.testTag("LedgerScreen"), + modifier = Modifier.testTag("LedgerScreen").semantics { contentDescription = "LedgerScreen" }, header = { Header( title = account.name,