package com.craigvg.lichun_android.utils import androidx.compose.ui.Modifier import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.heading import androidx.compose.ui.semantics.role import androidx.compose.ui.semantics.selected import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.stateDescription /** * Compose accessibility modifier extensions * Ported from iOS View+Accessibility.swift */ /** * Full accessibility support with label, hint, and value. */ fun Modifier.accessible( label: String, hint: String? = null, value: String? = null ): Modifier = this.semantics { contentDescription = buildString { append(label) value?.let { append(", $it") } hint?.let { append(". $it") } } } /** * Mark element as a button for TalkBack. */ fun Modifier.accessibleButton( label: String, hint: String? = null ): Modifier = this.semantics { role = Role.Button contentDescription = buildString { append(label) hint?.let { append(". $it") } } } /** * Mark element as a heading for navigation. */ fun Modifier.accessibleHeader(label: String): Modifier = this.semantics { heading() contentDescription = label } /** * Mark element as an image. */ fun Modifier.accessibleImage(label: String): Modifier = this.semantics { role = Role.Image contentDescription = label } /** * Mark element as selected. */ fun Modifier.accessibleSelected(isSelected: Boolean): Modifier = this.semantics { selected = isSelected } /** * Mark element as decorative (hidden from TalkBack). */ fun Modifier.decorative(): Modifier = this.semantics { contentDescription = "" } /** * Add state description for accessibility. */ fun Modifier.accessibleState(state: String): Modifier = this.semantics { stateDescription = state }