Skip to content

Commit b863a68

Browse files
committed
Add contentDescription for icons
1 parent d0a6ba0 commit b863a68

File tree

6 files changed

+42
-19
lines changed

6 files changed

+42
-19
lines changed

compose-multiplatform-material/src/commonMain/kotlin/com/huanshankeji/compose/material/Icon.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ import com.huanshankeji.compose.ui.ModifierOrAttrs
88
expect abstract class IconElement : Element
99

1010
@Composable
11-
expect fun Icon(materialIcon: MaterialIcon, modifierOrAttrs: ModifierOrAttrs<IconElement> = null)
11+
expect fun Icon(
12+
materialIcon: MaterialIcon, contentDescription: String?, modifierOrAttrs: ModifierOrAttrs<IconElement> = null
13+
)

compose-multiplatform-material/src/commonMain/kotlin/com/huanshankeji/compose/material/TopAppBarScaffold.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ expect class NavigationIconScope {
88
fun NavButton(onClick: () -> Unit, content: @Composable () -> Unit)
99

1010
@Composable
11-
fun MaterialIconNavButton(onClick: () -> Unit, materialIcon: MaterialIcon)
11+
fun MaterialIconNavButton(onClick: () -> Unit, materialIcon: MaterialIcon, contentDescription: String?)
1212
}
1313

1414
expect class TopAppBarActionsScope {
1515
@Composable
1616
fun ActionButton(onClick: () -> Unit, content: @Composable () -> Unit)
1717

1818
@Composable
19-
fun MaterialIconActionButton(onClick: () -> Unit, materialIcon: MaterialIcon)
19+
fun MaterialIconActionButton(onClick: () -> Unit, materialIcon: MaterialIcon, contentDescription: String?)
2020
}
2121

2222
@Composable

compose-multiplatform-material/src/jsMain/kotlin/com/huanshankeji/compose/material/Icon.kt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import androidx.compose.runtime.Composable
44
import com.huanshankeji.compose.material.icon.MaterialIcon
55
import com.huanshankeji.compose.ui.ModifierOrAttrs
66
import com.huanshankeji.compose.ui.toAttrs
7+
import com.huanshankeji.compose.web.attributes.attrs
8+
import com.huanshankeji.compose.web.attributes.plus
79
import dev.petuska.kmdcx.icons.MDCIconSpan
10+
import org.jetbrains.compose.web.attributes.AttrsScope
811
import org.w3c.dom.HTMLSpanElement
912

1013
actual typealias IconElement = HTMLSpanElement
@@ -13,5 +16,18 @@ actual typealias IconElement = HTMLSpanElement
1316
* There is often a better alternative of adding the CSS rule to the parent element to using this composable directly.
1417
*/
1518
@Composable
16-
actual fun Icon(materialIcon: MaterialIcon, modifierOrAttrs: ModifierOrAttrs<IconElement>) =
17-
MDCIconSpan(materialIcon.mdcIcon, attrs = modifierOrAttrs.toAttrs())
19+
actual fun Icon(
20+
materialIcon: MaterialIcon, contentDescription: String?, modifierOrAttrs: ModifierOrAttrs<IconElement>
21+
) =
22+
MDCIconSpan(materialIcon.mdcIcon, attrs = attrs<IconElement> {
23+
contentDescription(contentDescription)
24+
} + modifierOrAttrs.toAttrs())
25+
26+
fun AttrsScope<*>.contentDescription(contentDescription: String?) =
27+
contentDescription?.let {
28+
// aria-label's semantics don't seem to meet the requirements perfectly because it labels an interactive element
29+
// see: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-label, https://stackoverflow.com/questions/22039910/what-is-aria-label-and-how-should-i-use-it
30+
//attr("aria-label", it)
31+
32+
title(it)
33+
}

compose-multiplatform-material/src/jsMain/kotlin/com/huanshankeji/compose/material/TopAppBarScaffold.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@ import androidx.compose.runtime.Composable
44
import com.huanshankeji.compose.material.icon.MaterialIcon
55
import dev.petuska.kmdc.top.app.bar.*
66
import dev.petuska.kmdcx.icons.mdcIcon
7+
import org.jetbrains.compose.web.dom.Text
78

89
actual class NavigationIconScope(val mdcTopAppBarSectionScope: MDCTopAppBarSectionScope) {
910
@Composable
1011
actual fun NavButton(onClick: () -> Unit, content: @Composable () -> Unit) =
1112
mdcTopAppBarSectionScope.NavButton(attrs = { onClick { onClick() } }) { content() }
1213

1314
@Composable
14-
actual fun MaterialIconNavButton(onClick: () -> Unit, materialIcon: MaterialIcon) =
15-
mdcTopAppBarSectionScope.NavButton(attrs = { mdcIcon() }) { org.jetbrains.compose.web.dom.Text(materialIcon.mdcIcon.type) }
15+
actual fun MaterialIconNavButton(onClick: () -> Unit, materialIcon: MaterialIcon, contentDescription: String?) =
16+
mdcTopAppBarSectionScope.NavButton(attrs = {
17+
mdcIcon()
18+
contentDescription(contentDescription)
19+
}) { Text(materialIcon.mdcIcon.type) }
1620
}
1721

1822
actual class TopAppBarActionsScope(val mdcTopAppBarSectionScope: MDCTopAppBarSectionScope) {
@@ -21,11 +25,11 @@ actual class TopAppBarActionsScope(val mdcTopAppBarSectionScope: MDCTopAppBarSec
2125
mdcTopAppBarSectionScope.ActionButton(attrs = { onClick { onClick() } }) { content() }
2226

2327
@Composable
24-
actual fun MaterialIconActionButton(
25-
onClick: () -> Unit,
26-
materialIcon: MaterialIcon
27-
) =
28-
mdcTopAppBarSectionScope.ActionButton(attrs = { mdcIcon() }) { org.jetbrains.compose.web.dom.Text(materialIcon.mdcIcon.type) }
28+
actual fun MaterialIconActionButton(onClick: () -> Unit, materialIcon: MaterialIcon, contentDescription: String?) =
29+
mdcTopAppBarSectionScope.ActionButton(attrs = {
30+
mdcIcon()
31+
contentDescription(contentDescription)
32+
}) { Text(materialIcon.mdcIcon.type) }
2933
}
3034

3135
@Composable

compose-multiplatform-material/src/jvmMain/kotlin/com/huanshankeji/compose/material/Icon.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.huanshankeji.compose.ui.toModifier
99
actual abstract class IconElement : Element()
1010

1111
@Composable
12-
actual fun Icon(materialIcon: MaterialIcon, modifierOrAttrs: ModifierOrAttrs<IconElement>) =
13-
androidx.compose.material.Icon(materialIcon, null, modifierOrAttrs.toModifier())
14-
// no `contentDescription` for now
12+
actual fun Icon(
13+
materialIcon: MaterialIcon, contentDescription: String?, modifierOrAttrs: ModifierOrAttrs<IconElement>
14+
) =
15+
androidx.compose.material.Icon(materialIcon, contentDescription, modifierOrAttrs.toModifier())

compose-multiplatform-material/src/jvmMain/kotlin/com/huanshankeji/compose/material/TopAppBarScaffold.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ actual class NavigationIconScope private constructor() {
1212
IconButton(onClick, content = content)
1313

1414
@Composable
15-
actual fun MaterialIconNavButton(onClick: () -> Unit, materialIcon: MaterialIcon) =
16-
IconButton(onClick) { Icon(materialIcon) }
15+
actual fun MaterialIconNavButton(onClick: () -> Unit, materialIcon: MaterialIcon, contentDescription: String?) =
16+
IconButton(onClick) { Icon(materialIcon, contentDescription) }
1717

1818
companion object {
1919
val instance = NavigationIconScope()
@@ -26,8 +26,8 @@ actual class TopAppBarActionsScope(val rowScope: RowScope) {
2626
IconButton(onClick, content = content)
2727

2828
@Composable
29-
actual fun MaterialIconActionButton(onClick: () -> Unit, materialIcon: MaterialIcon) =
30-
IconButton(onClick) { Icon(materialIcon) }
29+
actual fun MaterialIconActionButton(onClick: () -> Unit, materialIcon: MaterialIcon, contentDescription: String?) =
30+
IconButton(onClick) { Icon(materialIcon, contentDescription) }
3131

3232
}
3333

0 commit comments

Comments
 (0)