Iterate on send button design.
This commit is contained in:
parent
f22df3ce01
commit
0a0e96c2b6
1 changed files with 62 additions and 5 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue