Add Buttons object for properly themed compose buttons.
This commit is contained in:
parent
a9accfb074
commit
f20d929292
1 changed files with 291 additions and 0 deletions
291
core-ui/src/main/java/org/signal/core/ui/Buttons.kt
Normal file
291
core-ui/src/main/java/org/signal/core/ui/Buttons.kt
Normal file
|
@ -0,0 +1,291 @@
|
|||
package org.signal.core.ui
|
||||
|
||||
import androidx.compose.foundation.BorderStroke
|
||||
import androidx.compose.foundation.interaction.MutableInteractionSource
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.RowScope
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.heightIn
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.ButtonColors
|
||||
import androidx.compose.material3.ButtonDefaults
|
||||
import androidx.compose.material3.ButtonElevation
|
||||
import androidx.compose.material3.FilledTonalButton
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.ProvideTextStyle
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Shape
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import org.signal.core.ui.theme.SignalTheme
|
||||
|
||||
object Buttons {
|
||||
|
||||
private val largeButtonContentPadding = PaddingValues(
|
||||
horizontal = 24.dp,
|
||||
vertical = 12.dp
|
||||
)
|
||||
|
||||
private val mediumButtonContentPadding = PaddingValues(
|
||||
horizontal = 24.dp,
|
||||
vertical = 10.dp
|
||||
)
|
||||
|
||||
private val smallButtonContentPadding = PaddingValues(
|
||||
horizontal = 16.dp,
|
||||
vertical = 8.dp
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun LargePrimary(
|
||||
onClick: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
enabled: Boolean = true,
|
||||
shape: Shape = ButtonDefaults.shape,
|
||||
colors: ButtonColors = ButtonDefaults.buttonColors(),
|
||||
elevation: ButtonElevation? = ButtonDefaults.buttonElevation(),
|
||||
border: BorderStroke? = null,
|
||||
contentPadding: PaddingValues = largeButtonContentPadding,
|
||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
||||
content: @Composable RowScope.() -> Unit
|
||||
) {
|
||||
Button(
|
||||
onClick = onClick,
|
||||
modifier = modifier,
|
||||
enabled = enabled,
|
||||
shape = shape,
|
||||
colors = colors,
|
||||
elevation = elevation,
|
||||
border = border,
|
||||
contentPadding = contentPadding,
|
||||
interactionSource = interactionSource,
|
||||
content = content
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun LargeTonal(
|
||||
onClick: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
enabled: Boolean = true,
|
||||
shape: Shape = ButtonDefaults.filledTonalShape,
|
||||
colors: ButtonColors = ButtonDefaults.filledTonalButtonColors(),
|
||||
elevation: ButtonElevation? = ButtonDefaults.filledTonalButtonElevation(),
|
||||
border: BorderStroke? = null,
|
||||
contentPadding: PaddingValues = largeButtonContentPadding,
|
||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
||||
content: @Composable RowScope.() -> Unit
|
||||
) {
|
||||
FilledTonalButton(
|
||||
onClick = onClick,
|
||||
modifier = modifier,
|
||||
enabled = enabled,
|
||||
shape = shape,
|
||||
colors = colors,
|
||||
elevation = elevation,
|
||||
border = border,
|
||||
contentPadding = contentPadding,
|
||||
interactionSource = interactionSource,
|
||||
content = content
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun MediumTonal(
|
||||
onClick: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
enabled: Boolean = true,
|
||||
shape: Shape = ButtonDefaults.filledTonalShape,
|
||||
colors: ButtonColors = ButtonDefaults.filledTonalButtonColors(),
|
||||
elevation: ButtonElevation? = ButtonDefaults.filledTonalButtonElevation(),
|
||||
border: BorderStroke? = null,
|
||||
contentPadding: PaddingValues = mediumButtonContentPadding,
|
||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
||||
content: @Composable RowScope.() -> Unit
|
||||
) {
|
||||
FilledTonalButton(
|
||||
onClick = onClick,
|
||||
modifier = modifier,
|
||||
enabled = enabled,
|
||||
shape = shape,
|
||||
colors = colors,
|
||||
elevation = elevation,
|
||||
border = border,
|
||||
contentPadding = contentPadding,
|
||||
interactionSource = interactionSource,
|
||||
content = content
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun Small(
|
||||
onClick: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
enabled: Boolean = true,
|
||||
shape: Shape = ButtonDefaults.shape,
|
||||
colors: ButtonColors = ButtonDefaults.buttonColors(
|
||||
containerColor = MaterialTheme.colorScheme.secondaryContainer, // TODO -- need extended colors
|
||||
contentColor = MaterialTheme.colorScheme.onSurface
|
||||
),
|
||||
elevation: ButtonElevation? = ButtonDefaults.buttonElevation(),
|
||||
border: BorderStroke? = null,
|
||||
contentPadding: PaddingValues = smallButtonContentPadding,
|
||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
||||
content: @Composable RowScope.() -> Unit
|
||||
) {
|
||||
Button(
|
||||
onClick = onClick,
|
||||
modifier = modifier.heightIn(min = 32.dp),
|
||||
enabled = enabled,
|
||||
shape = shape,
|
||||
colors = colors,
|
||||
elevation = elevation,
|
||||
border = border,
|
||||
contentPadding = contentPadding,
|
||||
interactionSource = interactionSource,
|
||||
content = {
|
||||
ProvideTextStyle(value = MaterialTheme.typography.labelMedium) {
|
||||
content()
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun LargePrimaryButtonPreview(
|
||||
darkMode: Boolean,
|
||||
enabled: Boolean
|
||||
) {
|
||||
SignalTheme(isDarkMode = darkMode) {
|
||||
Buttons.LargePrimary(
|
||||
onClick = {},
|
||||
enabled = enabled
|
||||
) {
|
||||
Text("Button")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun LargeTonalButtonPreview(
|
||||
darkMode: Boolean,
|
||||
enabled: Boolean
|
||||
) {
|
||||
SignalTheme(isDarkMode = darkMode) {
|
||||
Buttons.LargeTonal(
|
||||
onClick = {},
|
||||
enabled = enabled
|
||||
) {
|
||||
Text("Button")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun MediumTonalButtonPreview(
|
||||
darkMode: Boolean,
|
||||
enabled: Boolean
|
||||
) {
|
||||
SignalTheme(isDarkMode = darkMode) {
|
||||
Buttons.MediumTonal(
|
||||
onClick = {},
|
||||
enabled = enabled
|
||||
) {
|
||||
Text("Button")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun SmallButtonPreview(
|
||||
darkMode: Boolean,
|
||||
enabled: Boolean
|
||||
) {
|
||||
SignalTheme(isDarkMode = darkMode) {
|
||||
Buttons.Small(
|
||||
onClick = {},
|
||||
enabled = enabled
|
||||
) {
|
||||
Text("Button")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun LargePrimaryButtonPreview() {
|
||||
Column {
|
||||
Row {
|
||||
LargePrimaryButtonPreview(darkMode = false, enabled = true)
|
||||
Spacer(modifier = Modifier.width(10.dp))
|
||||
LargePrimaryButtonPreview(darkMode = true, enabled = true)
|
||||
}
|
||||
|
||||
Row {
|
||||
LargePrimaryButtonPreview(darkMode = false, enabled = false)
|
||||
Spacer(modifier = Modifier.width(10.dp))
|
||||
LargePrimaryButtonPreview(darkMode = true, enabled = false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun LargeTonalButtonPreview() {
|
||||
Column {
|
||||
Row {
|
||||
LargeTonalButtonPreview(darkMode = false, enabled = true)
|
||||
Spacer(modifier = Modifier.width(10.dp))
|
||||
LargeTonalButtonPreview(darkMode = true, enabled = true)
|
||||
}
|
||||
|
||||
Row {
|
||||
LargeTonalButtonPreview(darkMode = false, enabled = false)
|
||||
Spacer(modifier = Modifier.width(10.dp))
|
||||
LargeTonalButtonPreview(darkMode = true, enabled = false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun MediumTonalButtonPreview() {
|
||||
Column {
|
||||
Row {
|
||||
MediumTonalButtonPreview(darkMode = false, enabled = true)
|
||||
Spacer(modifier = Modifier.width(10.dp))
|
||||
MediumTonalButtonPreview(darkMode = true, enabled = true)
|
||||
}
|
||||
|
||||
Row {
|
||||
MediumTonalButtonPreview(darkMode = false, enabled = false)
|
||||
Spacer(modifier = Modifier.width(10.dp))
|
||||
MediumTonalButtonPreview(darkMode = true, enabled = false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun SmallButtonPreview() {
|
||||
Column {
|
||||
Row {
|
||||
SmallButtonPreview(darkMode = false, enabled = true)
|
||||
Spacer(modifier = Modifier.width(10.dp))
|
||||
SmallButtonPreview(darkMode = true, enabled = true)
|
||||
}
|
||||
|
||||
Row {
|
||||
SmallButtonPreview(darkMode = false, enabled = false)
|
||||
Spacer(modifier = Modifier.width(10.dp))
|
||||
SmallButtonPreview(darkMode = true, enabled = false)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue