From 77f32befb81583eda6e963e3ae6c68883dbecead Mon Sep 17 00:00:00 2001 From: Trey T Date: Sat, 18 Apr 2026 17:57:08 -0500 Subject: [PATCH] Audit: meaningful contentDescription for actionable icons (sweep) Upgrades ~31 sites previously annotated `// decorative` to meaningful strings where the icon is actionable. Purely decorative leading icons retain null contentDescription per Material 3 guidance. Focus areas: - Selection indicators (CheckCircle vs RadioButtonUnchecked, check marks) - Status icons (Error, Warning, CheckCircle, ErrorOutline, CloudOff, Info) - Expand/collapse toggles (ExpandLess/ExpandMore) - Feature inclusion indicators (Check/Close in comparison tables) - Requirement indicators (password strength satisfied/not) Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tt/honeyDue/ui/components/ContractorImportDialog.kt | 4 ++-- .../tt/honeyDue/ui/components/ResidenceImportDialog.kt | 4 ++-- .../com/tt/honeyDue/ui/components/auth/RequirementItem.kt | 2 +- .../honeyDue/ui/components/common/StandardErrorState.kt | 4 ++-- .../honeyDue/ui/components/dialogs/DeleteAccountDialog.kt | 2 +- .../tt/honeyDue/ui/components/documents/DocumentStates.kt | 2 +- .../com/tt/honeyDue/ui/screens/ForgotPasswordScreen.kt | 2 +- .../honeyDue/ui/screens/NotificationPreferencesScreen.kt | 2 +- .../kotlin/com/tt/honeyDue/ui/screens/ProfileScreen.kt | 4 ++-- .../com/tt/honeyDue/ui/screens/VerifyEmailScreen.kt | 2 +- .../com/tt/honeyDue/ui/screens/VerifyResetCodeScreen.kt | 2 +- .../screens/onboarding/OnboardingCreateAccountContent.kt | 2 +- .../ui/screens/onboarding/OnboardingFirstTaskContent.kt | 8 ++++---- .../screens/onboarding/OnboardingJoinResidenceContent.kt | 2 +- .../screens/onboarding/OnboardingSubscriptionContent.kt | 2 +- .../ui/screens/onboarding/OnboardingVerifyEmailContent.kt | 2 +- .../honeyDue/ui/screens/residence/JoinResidenceScreen.kt | 2 +- .../ui/screens/subscription/FeatureComparisonScreen.kt | 2 +- .../tt/honeyDue/ui/screens/task/TaskSuggestionsScreen.kt | 4 ++-- .../ui/screens/task/TaskTemplatesBrowserScreen.kt | 4 ++-- .../tt/honeyDue/ui/subscription/UpgradeFeatureScreen.kt | 2 +- .../com/tt/honeyDue/ui/subscription/UpgradeScreen.kt | 2 +- 22 files changed, 31 insertions(+), 31 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ContractorImportDialog.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ContractorImportDialog.kt index 6cfcf06..93d4d59 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ContractorImportDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ContractorImportDialog.kt @@ -155,7 +155,7 @@ fun ContractorImportSuccessDialog( icon = { Icon( imageVector = Icons.Default.CheckCircle, - contentDescription = null, // decorative + contentDescription = "Success", modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.primary ) @@ -201,7 +201,7 @@ fun ContractorImportErrorDialog( icon = { Icon( imageVector = Icons.Default.Error, - contentDescription = null, // decorative + contentDescription = "Error", modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.error ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ResidenceImportDialog.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ResidenceImportDialog.kt index 045a9b4..962cc44 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ResidenceImportDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ResidenceImportDialog.kt @@ -144,7 +144,7 @@ fun ResidenceImportSuccessDialog( icon = { Icon( imageVector = Icons.Default.CheckCircle, - contentDescription = null, // decorative + contentDescription = "Success", modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.primary ) @@ -190,7 +190,7 @@ fun ResidenceImportErrorDialog( icon = { Icon( imageVector = Icons.Default.Error, - contentDescription = null, // decorative + contentDescription = "Error", modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.error ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/auth/RequirementItem.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/auth/RequirementItem.kt index 8658a0b..151a3a3 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/auth/RequirementItem.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/auth/RequirementItem.kt @@ -22,7 +22,7 @@ fun RequirementItem(text: String, satisfied: Boolean) { ) { Icon( if (satisfied) Icons.Default.CheckCircle else Icons.Default.Circle, - contentDescription = null, // decorative + contentDescription = if (satisfied) "Requirement met" else "Requirement not met", tint = if (satisfied) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.size(16.dp) ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/StandardErrorState.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/StandardErrorState.kt index ad13154..b1d0965 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/StandardErrorState.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/StandardErrorState.kt @@ -47,7 +47,7 @@ fun StandardErrorState( ) { Icon( imageVector = icon, - contentDescription = null, // decorative + contentDescription = "Error", modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.error ) @@ -99,7 +99,7 @@ fun CompactErrorState( ) { Icon( imageVector = Icons.Default.ErrorOutline, - contentDescription = null, // decorative + contentDescription = "Error", tint = MaterialTheme.colorScheme.onErrorContainer ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/dialogs/DeleteAccountDialog.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/dialogs/DeleteAccountDialog.kt index 4f54e48..f77dbdf 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/dialogs/DeleteAccountDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/dialogs/DeleteAccountDialog.kt @@ -61,7 +61,7 @@ fun DeleteAccountDialog( // Warning Icon Icon( imageVector = Icons.Default.Warning, - contentDescription = null, // decorative + contentDescription = "Warning", tint = MaterialTheme.colorScheme.error, modifier = Modifier.size(48.dp) ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentStates.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentStates.kt index 1ba4b38..73da85e 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentStates.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentStates.kt @@ -35,7 +35,7 @@ fun ErrorState(message: String, onRetry: () -> Unit) { horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { - Icon(Icons.Default.Error, contentDescription = null, modifier = Modifier.size(64.dp) , tint = Color.Red) // decorative + Icon(Icons.Default.Error, contentDescription = "Error", modifier = Modifier.size(64.dp) , tint = Color.Red) Spacer(modifier = Modifier.height(16.dp)) Text(message, style = MaterialTheme.typography.bodyLarge, color = Color.Gray) Spacer(modifier = Modifier.height(16.dp)) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ForgotPasswordScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ForgotPasswordScreen.kt index 37d2bb6..248891b 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ForgotPasswordScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ForgotPasswordScreen.kt @@ -161,7 +161,7 @@ fun ForgotPasswordScreen( ) { Icon( Icons.Default.CheckCircle, - contentDescription = null, // decorative + contentDescription = "Success", tint = MaterialTheme.colorScheme.primary ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/NotificationPreferencesScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/NotificationPreferencesScreen.kt index 48bfc86..6826047 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/NotificationPreferencesScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/NotificationPreferencesScreen.kt @@ -296,7 +296,7 @@ fun NotificationPreferencesScreen( ) { Icon( Icons.Default.Error, - contentDescription = null, // decorative + contentDescription = "Error", tint = MaterialTheme.colorScheme.error, ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ProfileScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ProfileScreen.kt index 78c9780..5523bf0 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ProfileScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ProfileScreen.kt @@ -635,7 +635,7 @@ fun ProfileScreen( ) { Icon( Icons.Default.Error, - contentDescription = null, // decorative + contentDescription = "Error", tint = MaterialTheme.colorScheme.error ) Text( @@ -665,7 +665,7 @@ fun ProfileScreen( ) { Icon( Icons.Default.CheckCircle, - contentDescription = null, // decorative + contentDescription = "Success", tint = MaterialTheme.colorScheme.onPrimaryContainer ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyEmailScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyEmailScreen.kt index e55c150..f11bcf2 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyEmailScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyEmailScreen.kt @@ -149,7 +149,7 @@ fun VerifyEmailScreen( ) { Icon( Icons.Default.Info, - contentDescription = null, // decorative + contentDescription = "Info", tint = MaterialTheme.colorScheme.error ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyResetCodeScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyResetCodeScreen.kt index f867d45..31d2fd0 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyResetCodeScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyResetCodeScreen.kt @@ -196,7 +196,7 @@ fun VerifyResetCodeScreen( ) { Icon( Icons.Default.CheckCircle, - contentDescription = null, // decorative + contentDescription = "Verified", tint = MaterialTheme.colorScheme.primary ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingCreateAccountContent.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingCreateAccountContent.kt index 14bb7d5..214d1bc 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingCreateAccountContent.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingCreateAccountContent.kt @@ -251,7 +251,7 @@ fun OnboardingCreateAccountContent( ) { Icon( Icons.Default.Error, - contentDescription = null, // decorative + contentDescription = "Error", tint = MaterialTheme.colorScheme.error ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingFirstTaskContent.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingFirstTaskContent.kt index 5a1d702..38d7da0 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingFirstTaskContent.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingFirstTaskContent.kt @@ -487,7 +487,7 @@ private fun SuggestionRow( contentAlignment = Alignment.Center ) { if (isSelected) { - Icon(Icons.Default.Check, contentDescription = null, tint = Color.White, modifier = Modifier.size(16.dp) ) // decorative + Icon(Icons.Default.Check, contentDescription = "Selected", tint = Color.White, modifier = Modifier.size(16.dp) ) } } @@ -652,7 +652,7 @@ private fun TaskCategorySection( Icon( imageVector = if (isExpanded) Icons.Default.ExpandLess else Icons.Default.ExpandMore, - contentDescription = null, // decorative + contentDescription = if (isExpanded) "Collapse" else "Expand", tint = MaterialTheme.colorScheme.onSurfaceVariant ) } @@ -711,7 +711,7 @@ private fun TaskTemplateRow( contentAlignment = Alignment.Center ) { if (isSelected) { - Icon(Icons.Default.Check, contentDescription = null, tint = Color.White, modifier = Modifier.size(16.dp) ) // decorative + Icon(Icons.Default.Check, contentDescription = "Selected", tint = Color.White, modifier = Modifier.size(16.dp) ) } } @@ -772,7 +772,7 @@ private fun ErrorPane( ) { Icon( imageVector = Icons.Default.CloudOff, - contentDescription = null, // decorative + contentDescription = "Offline", modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.error ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingJoinResidenceContent.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingJoinResidenceContent.kt index 4cb2f5a..cc4cdf2 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingJoinResidenceContent.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingJoinResidenceContent.kt @@ -139,7 +139,7 @@ fun OnboardingJoinResidenceContent( ) { Icon( Icons.Default.Error, - contentDescription = null, // decorative + contentDescription = "Error", tint = MaterialTheme.colorScheme.error ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingSubscriptionContent.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingSubscriptionContent.kt index 8b40477..ef8ce75 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingSubscriptionContent.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingSubscriptionContent.kt @@ -352,7 +352,7 @@ private fun BenefitRow(benefit: SubscriptionBenefit) { Icon( Icons.Default.Check, - contentDescription = null, // decorative + contentDescription = "Included", modifier = Modifier.size(20.dp), tint = benefit.gradientColors.first() ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingVerifyEmailContent.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingVerifyEmailContent.kt index 24a66e8..aa750e2 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingVerifyEmailContent.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingVerifyEmailContent.kt @@ -146,7 +146,7 @@ fun OnboardingVerifyEmailContent( ) { Icon( Icons.Default.Error, - contentDescription = null, // decorative + contentDescription = "Error", tint = MaterialTheme.colorScheme.error ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/JoinResidenceScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/JoinResidenceScreen.kt index bf0cff3..3ffcdfc 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/JoinResidenceScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/JoinResidenceScreen.kt @@ -166,7 +166,7 @@ fun JoinResidenceScreen( ) { Icon( imageVector = Icons.Default.Error, - contentDescription = null, // decorative + contentDescription = "Error", tint = MaterialTheme.colorScheme.error, ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/subscription/FeatureComparisonScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/subscription/FeatureComparisonScreen.kt index 54c81ff..b463664 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/subscription/FeatureComparisonScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/subscription/FeatureComparisonScreen.kt @@ -280,7 +280,7 @@ private fun TierCell( ) { Icon( imageVector = if (hasFeature) Icons.Default.Check else Icons.Default.Close, - contentDescription = null, // decorative + contentDescription = if (hasFeature) "Included" else "Not included", modifier = Modifier.size(18.dp), tint = if (hasFeature) { if (emphasize) MaterialTheme.colorScheme.primary diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskSuggestionsScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskSuggestionsScreen.kt index b347202..0fbd1a4 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskSuggestionsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskSuggestionsScreen.kt @@ -173,7 +173,7 @@ fun TaskSuggestionsScreen( ) { Icon( imageVector = Icons.Default.ErrorOutline, - contentDescription = null, // decorative + contentDescription = "Error", tint = MaterialTheme.colorScheme.error ) Text( @@ -291,7 +291,7 @@ private fun ErrorView(message: String, onRetry: () -> Unit) { ) { Icon( imageVector = Icons.Default.ErrorOutline, - contentDescription = null, // decorative + contentDescription = "Error", modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.error ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskTemplatesBrowserScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskTemplatesBrowserScreen.kt index cfd94a4..fa1eb52 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskTemplatesBrowserScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskTemplatesBrowserScreen.kt @@ -386,7 +386,7 @@ private fun TemplateCard( Icon( imageVector = if (selected) Icons.Default.CheckCircle else Icons.Default.RadioButtonUnchecked, - contentDescription = null, // decorative + contentDescription = if (selected) "Selected" else "Not selected", tint = if (selected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier @@ -452,7 +452,7 @@ private fun LoadErrorView( ) { Icon( imageVector = Icons.Default.ErrorOutline, - contentDescription = null, // decorative + contentDescription = "Error", modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.error ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeFeatureScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeFeatureScreen.kt index 2565107..49b2b8c 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeFeatureScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeFeatureScreen.kt @@ -157,7 +157,7 @@ fun UpgradeFeatureScreen( ) { Icon( Icons.Default.Warning, - contentDescription = null, // decorative + contentDescription = "Warning", tint = MaterialTheme.colorScheme.error ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeScreen.kt index c3eb252..0ee044a 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeScreen.kt @@ -453,7 +453,7 @@ private fun FeatureItem( Icon( Icons.Default.Check, - contentDescription = null, // decorative + contentDescription = "Included", tint = MaterialTheme.colorScheme.primary, modifier = Modifier.size(20.dp) )