Iterate on send button design.

This commit is contained in:
Benoit Marty 2024-11-20 10:07:35 +01:00
parent f22df3ce01
commit 0a0e96c2b6

View file

@ -7,7 +7,6 @@
package io.element.android.libraries.textcomposer.components package io.element.android.libraries.textcomposer.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@ -17,7 +16,13 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.drawWithCache
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.BlendMode
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.LinearGradientShader
import androidx.compose.ui.graphics.RadialGradientShader
import androidx.compose.ui.graphics.ShaderBrush
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.ElementTheme
@ -31,6 +36,10 @@ import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTran
import io.element.android.libraries.textcomposer.model.MessageComposerMode import io.element.android.libraries.textcomposer.model.MessageComposerMode
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
/**
* Send button for the message composer.
* Figma: https://www.figma.com/design/G1xy0HDZKJf5TCRFmKb5d5/Compound-Android-Components?node-id=1956-37575&node-type=frame&m=dev
*/
@Composable @Composable
internal fun SendButton( internal fun SendButton(
canSendMessage: Boolean, canSendMessage: Boolean,
@ -46,7 +55,7 @@ internal fun SendButton(
) { ) {
val iconVector = when (composerMode) { val iconVector = when (composerMode) {
is MessageComposerMode.Edit -> CompoundIcons.Check() is MessageComposerMode.Edit -> CompoundIcons.Check()
else -> CompoundIcons.Send() else -> CompoundIcons.SendSolid()
} }
val iconStartPadding = when (composerMode) { val iconStartPadding = when (composerMode) {
is MessageComposerMode.Edit -> 0.dp is MessageComposerMode.Edit -> 0.dp
@ -60,7 +69,13 @@ internal fun SendButton(
modifier = Modifier modifier = Modifier
.clip(CircleShape) .clip(CircleShape)
.size(36.dp) .size(36.dp)
.background(if (canSendMessage) ElementTheme.colors.iconAccentTertiary else Color.Transparent) .then(
if (canSendMessage) {
buttonBackgroundModifier()
} else {
Modifier
}
)
) { ) {
Icon( Icon(
modifier = Modifier modifier = Modifier
@ -68,13 +83,55 @@ internal fun SendButton(
.align(Alignment.Center), .align(Alignment.Center),
imageVector = iconVector, imageVector = iconVector,
contentDescription = contentDescription, contentDescription = contentDescription,
// Exception here, we use Color.White instead of ElementTheme.colors.iconOnSolidPrimary tint = if (canSendMessage) {
tint = if (canSendMessage) Color.White else ElementTheme.colors.iconDisabled if (ElementTheme.colors.isLight) {
ElementTheme.colors.iconOnSolidPrimary
} else {
ElementTheme.colors.iconPrimary
}
} else {
ElementTheme.colors.iconQuaternary
}
) )
} }
} }
} }
private fun buttonBackgroundModifier() = Modifier.drawWithCache {
// We have a square button, so height == width.
val height = size.height
val verticalGradientBrush = ShaderBrush(
LinearGradientShader(
from = Offset(0f, 0f),
to = Offset(0f, height),
colors = listOf(
Color(0xFF0BC491),
Color(0xFF0467DD),
)
)
)
val radialGradientBrush = ShaderBrush(
RadialGradientShader(
center = Offset(height / 2f, height / 2f),
radius = height / 2f,
colors = listOf(
Color(0xFF0BC491),
Color(0xFF0467DD),
)
)
)
onDrawBehind {
drawRect(
brush = verticalGradientBrush,
)
drawRect(
brush = radialGradientBrush,
alpha = 0.4f,
blendMode = BlendMode.Overlay,
)
}
}
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun SendButtonPreview() = ElementPreview { internal fun SendButtonPreview() = ElementPreview {