blob: e147851766368f7ee55a40197f588a49298463dd [file] [log] [blame]
/*
* Copyright 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.tv.material3
import androidx.annotation.FloatRange
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.interaction.Interaction
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.unit.dp
internal object BaseButtonDefaults {
val MinWidth = 58.dp
val MinHeight = 40.dp
}
@ExperimentalTvMaterial3Api
object ButtonDefaults {
private val ContainerShape = CircleShape
private val ButtonHorizontalPadding = 16.dp
private val ButtonVerticalPadding = 10.dp
private val ButtonWithIconHorizontalStartPadding = 12.dp
val ContentPadding = PaddingValues(
start = ButtonHorizontalPadding,
top = ButtonVerticalPadding,
end = ButtonHorizontalPadding,
bottom = ButtonVerticalPadding
)
val ButtonWithIconContentPadding = PaddingValues(
start = ButtonWithIconHorizontalStartPadding,
top = ButtonVerticalPadding,
end = ButtonHorizontalPadding,
bottom = ButtonVerticalPadding
)
/** The default size of the icon when used inside any button. */
val IconSize = 18.dp
/**
* The default size of the spacing between an icon and a text when they used inside any button.
*/
val IconSpacing = 8.dp
/**
* Creates a [ButtonShape] that represents the default container shapes used in a FilledButton.
*
* @param shape the shape used when the Button is enabled, and has no other [Interaction]s.
* @param focusedShape the shape used when the Button is enabled and focused.
* @param pressedShape the shape used when the Button is enabled pressed.
* @param disabledShape the shape used when the Button is not enabled.
* @param focusedDisabledShape the shape used when the Button is not enabled and focused.
*/
fun shape(
shape: Shape = ContainerShape,
focusedShape: Shape = shape,
pressedShape: Shape = shape,
disabledShape: Shape = shape,
focusedDisabledShape: Shape = disabledShape
) = ButtonShape(
shape = shape,
focusedShape = focusedShape,
pressedShape = pressedShape,
disabledShape = disabledShape,
focusedDisabledShape = focusedDisabledShape
)
/**
* Creates a [ButtonColors] that represents the default colors used in a FilledButton.
*
* @param containerColor the container color of this Button when enabled
* @param contentColor the content color of this Button when enabled
* @param focusedContainerColor the container color of this Button when enabled and focused
* @param focusedContentColor the content color of this Button when enabled and focused
* @param pressedContainerColor the container color of this Button when enabled and pressed
* @param pressedContentColor the content color of this Button when enabled and pressed
* @param disabledContainerColor the container color of this Button when not enabled
* @param disabledContentColor the content color of this Button when not enabled
*/
@ReadOnlyComposable
@Composable
fun colors(
containerColor: Color = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.8f),
contentColor: Color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.8f),
focusedContainerColor: Color = MaterialTheme.colorScheme.onSurface,
focusedContentColor: Color = MaterialTheme.colorScheme.inverseOnSurface,
pressedContainerColor: Color = focusedContainerColor,
pressedContentColor: Color = focusedContentColor,
disabledContainerColor: Color = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.4f),
disabledContentColor: Color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.4f),
) = ButtonColors(
containerColor = containerColor,
contentColor = contentColor,
focusedContainerColor = focusedContainerColor,
focusedContentColor = focusedContentColor,
pressedContainerColor = pressedContainerColor,
pressedContentColor = pressedContentColor,
disabledContainerColor = disabledContainerColor,
disabledContentColor = disabledContentColor,
)
/**
* Creates a [ButtonScale] that represents the default scales used in a FilledButton.
* scales are used to modify the size of a composable in different [Interaction]
* states e.g. 1f (original) in default state, 1.2f (scaled up) in focused state,
* 0.8f (scaled down) in pressed state, etc.
*
* @param scale the scale to be used for this Button when enabled
* @param focusedScale the scale to be used for this Button when focused
* @param pressedScale the scale to be used for this Button when pressed
* @param disabledScale the scale to be used for this Button when disabled
* @param focusedDisabledScale the scale to be used for this Button when disabled and
* focused
*/
fun scale(
@FloatRange(from = 0.0) scale: Float = 1f,
@FloatRange(from = 0.0) focusedScale: Float = 1.1f,
@FloatRange(from = 0.0) pressedScale: Float = scale,
@FloatRange(from = 0.0) disabledScale: Float = scale,
@FloatRange(from = 0.0) focusedDisabledScale: Float = disabledScale
) = ButtonScale(
scale = scale,
focusedScale = focusedScale,
pressedScale = pressedScale,
disabledScale = disabledScale,
focusedDisabledScale = focusedDisabledScale
)
/**
* Creates a [ButtonBorder] that represents the default [Border]s applied on a
* FilledButton in different [Interaction] states.
*
* @param border the [Border] to be used for this Button when enabled
* @param focusedBorder the [Border] to be used for this Button when focused
* @param pressedBorder the [Border] to be used for this Button when pressed
* @param disabledBorder the [Border] to be used for this Button when disabled
* @param focusedDisabledBorder the [Border] to be used for this Button when disabled and
* focused
*/
@ReadOnlyComposable
@Composable
fun border(
border: Border = Border.None,
focusedBorder: Border = border,
pressedBorder: Border = focusedBorder,
disabledBorder: Border = border,
focusedDisabledBorder: Border = Border(
border = BorderStroke(
width = 1.5.dp,
color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.2f)
),
shape = ContainerShape
)
) = ButtonBorder(
border = border,
focusedBorder = focusedBorder,
pressedBorder = pressedBorder,
disabledBorder = disabledBorder,
focusedDisabledBorder = focusedDisabledBorder
)
/**
* Creates a [ButtonGlow] that represents the default [Glow]s used in a FilledButton.
*
* @param glow the Glow behind this Button when enabled
* @param focusedGlow the Glow behind this Button when focused
* @param pressedGlow the Glow behind this Button when pressed
*/
fun glow(
glow: Glow = Glow.None,
focusedGlow: Glow = glow,
pressedGlow: Glow = glow
) = ButtonGlow(
glow = glow,
focusedGlow = focusedGlow,
pressedGlow = pressedGlow
)
}
@ExperimentalTvMaterial3Api
object OutlinedButtonDefaults {
private val ContainerShape = CircleShape
private val ButtonHorizontalPadding = 16.dp
private val ButtonVerticalPadding = 10.dp
private val ButtonWithIconHorizontalStartPadding = 12.dp
val ContentPadding = PaddingValues(
start = ButtonHorizontalPadding,
top = ButtonVerticalPadding,
end = ButtonHorizontalPadding,
bottom = ButtonVerticalPadding
)
/** The default size of the icon when used inside any button. */
val IconSize = 18.dp
/**
* The default size of the spacing between an icon and a text when they used inside any button.
*/
val IconSpacing = 8.dp
/** The default content padding used by [OutlinedButton] that contains an [Icon]. */
val ButtonWithIconContentPadding = PaddingValues(
start = ButtonWithIconHorizontalStartPadding,
top = ButtonVerticalPadding,
end = ButtonHorizontalPadding,
bottom = ButtonVerticalPadding
)
/**
* Creates a [ButtonShape] that represents the default container shapes used in an
* OutlinedButton.
*
* @param shape the shape used when the Button is enabled, and has no other [Interaction]s.
* @param focusedShape the shape used when the Button is enabled and focused.
* @param pressedShape the shape used when the Button is enabled pressed.
* @param disabledShape the shape used when the Button is not enabled.
* @param focusedDisabledShape the shape used when the Button is not enabled and focused.
*/
fun shape(
shape: Shape = ContainerShape,
focusedShape: Shape = shape,
pressedShape: Shape = shape,
disabledShape: Shape = shape,
focusedDisabledShape: Shape = disabledShape
) = ButtonShape(
shape = shape,
focusedShape = focusedShape,
pressedShape = pressedShape,
disabledShape = disabledShape,
focusedDisabledShape = focusedDisabledShape
)
/**
* Creates a [ButtonColors] that represents the default colors used in a OutlinedButton.
*
* @param containerColor the container color of this Button when enabled
* @param contentColor the content color of this Button when enabled
* @param focusedContainerColor the container color of this Button when enabled and focused
* @param focusedContentColor the content color of this Button when enabled and focused
* @param pressedContainerColor the container color of this Button when enabled and pressed
* @param pressedContentColor the content color of this Button when enabled and pressed
* @param disabledContainerColor the container color of this Button when not enabled
* @param disabledContentColor the content color of this Button when not enabled
*/
@ReadOnlyComposable
@Composable
fun colors(
containerColor: Color = Color.Transparent,
contentColor: Color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.8f),
focusedContainerColor: Color = MaterialTheme.colorScheme.onSurface,
focusedContentColor: Color = MaterialTheme.colorScheme.inverseOnSurface,
pressedContainerColor: Color = focusedContainerColor,
pressedContentColor: Color = focusedContentColor,
disabledContainerColor: Color = containerColor,
disabledContentColor: Color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.4f),
) = ButtonColors(
containerColor = containerColor,
contentColor = contentColor,
focusedContainerColor = focusedContainerColor,
focusedContentColor = focusedContentColor,
pressedContainerColor = pressedContainerColor,
pressedContentColor = pressedContentColor,
disabledContainerColor = disabledContainerColor,
disabledContentColor = disabledContentColor,
)
/**
* Creates a [ButtonScale] that represents the default scales used in an OutlinedButton.
* scales are used to modify the size of a composable in different [Interaction]
* states e.g. 1f (original) in default state, 1.2f (scaled up) in focused state,
* 0.8f (scaled down) in pressed state, etc.
*
* @param scale the scale to be used for this Button when enabled
* @param focusedScale the scale to be used for this Button when focused
* @param pressedScale the scale to be used for this Button when pressed
* @param disabledScale the scale to be used for this Button when disabled
* @param focusedDisabledScale the scale to be used for this Button when disabled and
* focused
*/
fun scale(
@FloatRange(from = 0.0) scale: Float = 1f,
@FloatRange(from = 0.0) focusedScale: Float = 1.1f,
@FloatRange(from = 0.0) pressedScale: Float = scale,
@FloatRange(from = 0.0) disabledScale: Float = scale,
@FloatRange(from = 0.0) focusedDisabledScale: Float = disabledScale
) = ButtonScale(
scale = scale,
focusedScale = focusedScale,
pressedScale = pressedScale,
disabledScale = disabledScale,
focusedDisabledScale = focusedDisabledScale
)
/**
* Creates a [ButtonBorder] that represents the default [Border]s applied on an
* OutlinedButton in different [Interaction] states.
*
* @param border the [Border] to be used for this Button when enabled
* @param focusedBorder the [Border] to be used for this Button when focused
* @param pressedBorder the [Border] to be used for this Button when pressed
* @param disabledBorder the [Border] to be used for this Button when disabled
* @param focusedDisabledBorder the [Border] to be used for this Button when disabled and
* focused
*/
@ReadOnlyComposable
@Composable
fun border(
border: Border = Border(
border = BorderStroke(
width = 1.5.dp,
color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.4f)
),
shape = ContainerShape
),
focusedBorder: Border = Border(
border = BorderStroke(
width = 1.65.dp,
color = MaterialTheme.colorScheme.onSurfaceVariant
),
shape = ContainerShape
),
pressedBorder: Border = Border(
border = BorderStroke(
width = 1.5.dp,
color = MaterialTheme.colorScheme.onSurfaceVariant
),
shape = ContainerShape
),
disabledBorder: Border = Border(
border = BorderStroke(
width = 1.5.dp,
color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.2f)
),
shape = ContainerShape
),
focusedDisabledBorder: Border = disabledBorder
) = ButtonBorder(
border = border,
focusedBorder = focusedBorder,
pressedBorder = pressedBorder,
disabledBorder = disabledBorder,
focusedDisabledBorder = focusedDisabledBorder
)
/**
* Creates a [ButtonGlow] that represents the default [Glow]s used in an OutlinedButton.
*
* @param glow the Glow behind this Button when enabled
* @param focusedGlow the Glow behind this Button when focused
* @param pressedGlow the Glow behind this Button when pressed
*/
fun glow(
glow: Glow = Glow.None,
focusedGlow: Glow = glow,
pressedGlow: Glow = glow
) = ButtonGlow(
glow = glow,
focusedGlow = focusedGlow,
pressedGlow = pressedGlow
)
}