Updated on 2026-08-14
This commit is contained in:
commit
eef13dafa6
20 changed files with 609 additions and 5 deletions
|
|
@ -109,6 +109,7 @@ dependencies {
|
||||||
implementation(project(":domain"))
|
implementation(project(":domain"))
|
||||||
implementation(project(":network"))
|
implementation(project(":network"))
|
||||||
implementation(project(":common"))
|
implementation(project(":common"))
|
||||||
|
implementation(project(":core:ui"))
|
||||||
|
|
||||||
/** AndroidX libraries */
|
/** AndroidX libraries */
|
||||||
implementation(AndroidX.coreKtx)
|
implementation(AndroidX.coreKtx)
|
||||||
|
|
|
||||||
|
|
@ -9,13 +9,13 @@ import com.tangem.wallet.R
|
||||||
object TangemTypography {
|
object TangemTypography {
|
||||||
|
|
||||||
val body1 = TextStyle(
|
val body1 = TextStyle(
|
||||||
fontFamily = FontFamily(Font(R.font.roboto)),
|
fontFamily = FontFamily(Font(R.font.roboto_regular)),
|
||||||
fontSize = 16.0.sp,
|
fontSize = 16.0.sp,
|
||||||
letterSpacing = 0.5.sp,
|
letterSpacing = 0.5.sp,
|
||||||
lineHeight = 24.0.sp,
|
lineHeight = 24.0.sp,
|
||||||
)
|
)
|
||||||
val body2 = TextStyle(
|
val body2 = TextStyle(
|
||||||
fontFamily = FontFamily(Font(R.font.roboto)),
|
fontFamily = FontFamily(Font(R.font.roboto_regular)),
|
||||||
fontSize = 14.0.sp,
|
fontSize = 14.0.sp,
|
||||||
letterSpacing = 0.25.sp,
|
letterSpacing = 0.25.sp,
|
||||||
lineHeight = 20.0.sp,
|
lineHeight = 20.0.sp,
|
||||||
|
|
@ -27,13 +27,13 @@ object TangemTypography {
|
||||||
lineHeight = 20.0.sp,
|
lineHeight = 20.0.sp,
|
||||||
)
|
)
|
||||||
val caption = TextStyle(
|
val caption = TextStyle(
|
||||||
fontFamily = FontFamily(Font(R.font.roboto)),
|
fontFamily = FontFamily(Font(R.font.roboto_regular)),
|
||||||
fontSize = 12.0.sp,
|
fontSize = 12.0.sp,
|
||||||
letterSpacing = 0.4000000059604645.sp,
|
letterSpacing = 0.4000000059604645.sp,
|
||||||
lineHeight = 16.0.sp,
|
lineHeight = 16.0.sp,
|
||||||
)
|
)
|
||||||
val headline1 = TextStyle(
|
val headline1 = TextStyle(
|
||||||
fontFamily = FontFamily(Font(R.font.roboto)),
|
fontFamily = FontFamily(Font(R.font.roboto_regular)),
|
||||||
fontSize = 34.0.sp,
|
fontSize = 34.0.sp,
|
||||||
letterSpacing = 0.0.sp,
|
letterSpacing = 0.0.sp,
|
||||||
lineHeight = 44.0.sp,
|
lineHeight = 44.0.sp,
|
||||||
|
|
|
||||||
1
core/ui/.gitignore
vendored
Normal file
1
core/ui/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/build
|
||||||
38
core/ui/build.gradle.kts
Normal file
38
core/ui/build.gradle.kts
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
plugins {
|
||||||
|
id("com.android.library")
|
||||||
|
kotlin("android")
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
defaultConfig {
|
||||||
|
compileSdk = AppConfig.compileSdkVersion
|
||||||
|
minSdk = AppConfig.minSdkVersion
|
||||||
|
targetSdk = AppConfig.targetSdkVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = JavaVersion.VERSION_1_8.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
isCoreLibraryDesugaringEnabled = false
|
||||||
|
}
|
||||||
|
|
||||||
|
buildFeatures {
|
||||||
|
compose = true
|
||||||
|
}
|
||||||
|
|
||||||
|
composeOptions {
|
||||||
|
kotlinCompilerExtensionVersion = Versions.compose
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
|
||||||
|
/** Compose */
|
||||||
|
implementation(Compose.foundation)
|
||||||
|
implementation(Compose.material)
|
||||||
|
implementation(Compose.uiTooling)
|
||||||
|
}
|
||||||
2
core/ui/src/main/AndroidManifest.xml
Normal file
2
core/ui/src/main/AndroidManifest.xml
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest package="com.tangem.core.ui" />
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
package com.tangem.core.ui.components
|
||||||
|
|
||||||
|
import androidx.compose.foundation.background
|
||||||
|
import androidx.compose.foundation.clickable
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.layout.size
|
||||||
|
import androidx.compose.material.Icon
|
||||||
|
import androidx.compose.material.MaterialTheme
|
||||||
|
import androidx.compose.material.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.dimensionResource
|
||||||
|
import androidx.compose.ui.res.painterResource
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import com.tangem.core.ui.R
|
||||||
|
import com.tangem.core.ui.res.TangemTheme
|
||||||
|
|
||||||
|
@Preview(widthDp = 360, heightDp = 56, showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun PreviewAppBarWithBackButtonInLightTheme() {
|
||||||
|
TangemTheme(isDarkTheme = false) {
|
||||||
|
AppBarWithBackButton(text = "Title", onBackClick = {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(widthDp = 360, heightDp = 56, showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun PreviewAppBarWithBackButtonInDarkTheme() {
|
||||||
|
TangemTheme(isDarkTheme = true) {
|
||||||
|
AppBarWithBackButton(text = "Title", onBackClick = {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* App bar with back button and optional title
|
||||||
|
*
|
||||||
|
* @param text optional title
|
||||||
|
* @param onBackClick the lambda to be invoked when this icon is pressed
|
||||||
|
*
|
||||||
|
* @see <a href = "https://www.figma.com/file/14ISV23YB1yVW1uNVwqrKv/Android?node-id=123%3A287&t=WdN5XpixzZLlQAZO-4"
|
||||||
|
* >Figma component</a>
|
||||||
|
*/
|
||||||
|
@Composable
|
||||||
|
fun AppBarWithBackButton(text: String? = null, onBackClick: () -> Unit) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.background(MaterialTheme.colors.primaryVariant)
|
||||||
|
.padding(all = dimensionResource(R.dimen.spacing16)),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(dimensionResource(R.dimen.spacing16)),
|
||||||
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
painter = painterResource(R.drawable.ic_back),
|
||||||
|
contentDescription = null,
|
||||||
|
modifier = Modifier
|
||||||
|
.size(size = dimensionResource(R.dimen.size24))
|
||||||
|
.clickable { onBackClick() },
|
||||||
|
tint = MaterialTheme.colors.onPrimary,
|
||||||
|
)
|
||||||
|
if (!text.isNullOrBlank()) {
|
||||||
|
Text(
|
||||||
|
text = text,
|
||||||
|
color = MaterialTheme.colors.onPrimary,
|
||||||
|
maxLines = 1,
|
||||||
|
style = MaterialTheme.typography.subtitle1,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
164
core/ui/src/main/java/com/tangem/core/ui/components/Buttons.kt
Normal file
164
core/ui/src/main/java/com/tangem/core/ui/components/Buttons.kt
Normal file
|
|
@ -0,0 +1,164 @@
|
||||||
|
package com.tangem.core.ui.components
|
||||||
|
|
||||||
|
import androidx.annotation.DrawableRes
|
||||||
|
import androidx.compose.foundation.layout.RowScope
|
||||||
|
import androidx.compose.foundation.layout.Spacer
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.height
|
||||||
|
import androidx.compose.foundation.layout.width
|
||||||
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
|
import androidx.compose.material.Button
|
||||||
|
import androidx.compose.material.ButtonDefaults
|
||||||
|
import androidx.compose.material.Icon
|
||||||
|
import androidx.compose.material.MaterialTheme
|
||||||
|
import androidx.compose.material.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.dimensionResource
|
||||||
|
import androidx.compose.ui.res.painterResource
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import com.tangem.core.ui.R
|
||||||
|
import com.tangem.core.ui.res.ButtonColorType
|
||||||
|
import com.tangem.core.ui.res.TangemTheme
|
||||||
|
import com.tangem.core.ui.res.TextColorType
|
||||||
|
import com.tangem.core.ui.res.buttonColor
|
||||||
|
import com.tangem.core.ui.res.textColor
|
||||||
|
|
||||||
|
@Preview(widthDp = 328, heightDp = 48, showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun Preview_PrimaryStartIconButton_Enabled_InLightTheme() {
|
||||||
|
TangemTheme(isDarkTheme = false) {
|
||||||
|
PrimaryStartIconButton(text = "Manage tokens", iconResId = R.drawable.ic_tangem, enabled = true, onClicked = {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(widthDp = 328, heightDp = 48, showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun Preview_PrimaryStartIconButton_Enabled_InDarkTheme() {
|
||||||
|
TangemTheme(isDarkTheme = true) {
|
||||||
|
PrimaryStartIconButton(text = "Manage tokens", iconResId = R.drawable.ic_tangem, enabled = true, onClicked = {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(widthDp = 328, heightDp = 48, showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun Preview_PrimaryStartIconButton_Disabled_InLightTheme() {
|
||||||
|
TangemTheme(isDarkTheme = false) {
|
||||||
|
PrimaryStartIconButton(
|
||||||
|
text = "Manage tokens",
|
||||||
|
iconResId = R.drawable.ic_tangem,
|
||||||
|
enabled = false,
|
||||||
|
onClicked = {},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(widthDp = 328, heightDp = 48, showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun Preview_PrimaryStartIconButton_Disabled_InDarkTheme() {
|
||||||
|
TangemTheme(isDarkTheme = true) {
|
||||||
|
PrimaryStartIconButton(
|
||||||
|
text = "Manage tokens",
|
||||||
|
iconResId = R.drawable.ic_tangem,
|
||||||
|
enabled = false,
|
||||||
|
onClicked = {},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(widthDp = 328, heightDp = 48, showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun Preview_PrimaryEndIconButton_Enabled_InLightTheme() {
|
||||||
|
TangemTheme(isDarkTheme = false) {
|
||||||
|
PrimaryEndIconButton(text = "Manage tokens", iconResId = R.drawable.ic_tangem, enabled = true, onClicked = {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(widthDp = 328, heightDp = 48, showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun Preview_PrimaryEndIconButton_Enabled_InDarkTheme() {
|
||||||
|
TangemTheme(isDarkTheme = true) {
|
||||||
|
PrimaryEndIconButton(text = "Manage tokens", iconResId = R.drawable.ic_tangem, enabled = true, onClicked = {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(widthDp = 328, heightDp = 48, showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun Preview_PrimaryEndIconButton_Disabled_InLightTheme() {
|
||||||
|
TangemTheme(isDarkTheme = false) {
|
||||||
|
PrimaryEndIconButton(text = "Manage tokens", iconResId = R.drawable.ic_tangem, enabled = false, onClicked = {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(widthDp = 328, heightDp = 48, showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun Preview_PrimaryEndIconButton_Disabled_InDarkTheme() {
|
||||||
|
TangemTheme(isDarkTheme = true) {
|
||||||
|
PrimaryEndIconButton(text = "Manage tokens", iconResId = R.drawable.ic_tangem, enabled = false, onClicked = {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Primary button with an icon at the beginning of the layout
|
||||||
|
*
|
||||||
|
* @param text button text
|
||||||
|
* @param iconResId button icon res id
|
||||||
|
* @param enabled controls the enabled state of the button
|
||||||
|
* @param onClicked the lambda to be invoked when this button is pressed
|
||||||
|
*
|
||||||
|
* @see <a href = "https://www.figma.com/file/14ISV23YB1yVW1uNVwqrKv/Android?node-id=233%3A258&t=WdN5XpixzZLlQAZO-4"
|
||||||
|
* >Figma component</a>
|
||||||
|
*/
|
||||||
|
@Composable
|
||||||
|
fun PrimaryStartIconButton(text: String, @DrawableRes iconResId: Int, enabled: Boolean = true, onClicked: () -> Unit) {
|
||||||
|
PrimaryButtonRow(enabled = enabled, onClicked = onClicked) {
|
||||||
|
Icon(
|
||||||
|
painter = painterResource(id = iconResId),
|
||||||
|
contentDescription = null,
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.width(dimensionResource(R.dimen.spacing8)))
|
||||||
|
Text(text = text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Primary button with an icon at the end of the layout
|
||||||
|
*
|
||||||
|
* @param text button text
|
||||||
|
* @param iconResId button icon res id
|
||||||
|
* @param enabled controls the enabled state of the button
|
||||||
|
* @param onClicked the lambda to be invoked when this button is pressed
|
||||||
|
*
|
||||||
|
* @see <a href = "https://www.figma.com/file/14ISV23YB1yVW1uNVwqrKv/Android?node-id=68%3A47&t=WdN5XpixzZLlQAZO-4"
|
||||||
|
* >Figma component</a>
|
||||||
|
*/
|
||||||
|
@Composable
|
||||||
|
fun PrimaryEndIconButton(text: String, @DrawableRes iconResId: Int, enabled: Boolean = true, onClicked: () -> Unit) {
|
||||||
|
PrimaryButtonRow(enabled = enabled, onClicked = onClicked) {
|
||||||
|
Text(text = text)
|
||||||
|
Spacer(modifier = Modifier.width(dimensionResource(R.dimen.spacing8)))
|
||||||
|
Icon(
|
||||||
|
painter = painterResource(id = iconResId),
|
||||||
|
contentDescription = null,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun PrimaryButtonRow(enabled: Boolean, onClicked: () -> Unit, content: @Composable (RowScope.() -> Unit)) {
|
||||||
|
Button(
|
||||||
|
onClick = onClicked,
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.height(dimensionResource(R.dimen.size48)),
|
||||||
|
enabled = enabled,
|
||||||
|
shape = RoundedCornerShape(dimensionResource(id = R.dimen.radius12)),
|
||||||
|
colors = ButtonDefaults.buttonColors(
|
||||||
|
backgroundColor = MaterialTheme.colors.buttonColor(type = ButtonColorType.PRIMARY),
|
||||||
|
contentColor = MaterialTheme.colors.textColor(type = TextColorType.PRIMARY2),
|
||||||
|
disabledBackgroundColor = MaterialTheme.colors.buttonColor(type = ButtonColorType.DISABLED),
|
||||||
|
disabledContentColor = MaterialTheme.colors.textColor(type = TextColorType.DISABLED),
|
||||||
|
),
|
||||||
|
content = content,
|
||||||
|
)
|
||||||
|
}
|
||||||
79
core/ui/src/main/java/com/tangem/core/ui/components/Cards.kt
Normal file
79
core/ui/src/main/java/com/tangem/core/ui/components/Cards.kt
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
package com.tangem.core.ui.components
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.height
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
|
import androidx.compose.material.MaterialTheme
|
||||||
|
import androidx.compose.material.Surface
|
||||||
|
import androidx.compose.material.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.dimensionResource
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import com.tangem.core.ui.R
|
||||||
|
import com.tangem.core.ui.res.TangemTheme
|
||||||
|
import com.tangem.core.ui.res.TextColorType
|
||||||
|
import com.tangem.core.ui.res.textColor
|
||||||
|
|
||||||
|
@Preview(widthDp = 328, heightDp = 48, showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun Preview_SimpleInfoCard_InLightTheme() {
|
||||||
|
TangemTheme(isDarkTheme = false) {
|
||||||
|
SmallInfoCard(startText = "Balance", endText = "0.4405434 BTC")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(widthDp = 328, heightDp = 48, showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun Preview_SimpleInfoCard_InDarkTheme() {
|
||||||
|
TangemTheme(isDarkTheme = true) {
|
||||||
|
SmallInfoCard(startText = "Balance", endText = "0.4405434 BTC")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Small card with text information attached to the edges
|
||||||
|
*
|
||||||
|
* @param startText text information attached to the left edge
|
||||||
|
* @param endText text information attached to the right edge
|
||||||
|
*
|
||||||
|
* @see <a href = "https://www.figma.com/file/14ISV23YB1yVW1uNVwqrKv/Android?node-id=290%3A339&t=WdN5XpixzZLlQAZO-4"
|
||||||
|
* >Figma component</a>
|
||||||
|
*/
|
||||||
|
@Composable
|
||||||
|
fun SmallInfoCard(startText: String, endText: String) {
|
||||||
|
Surface(
|
||||||
|
shape = RoundedCornerShape(dimensionResource(id = R.dimen.radius12)),
|
||||||
|
color = MaterialTheme.colors.secondary,
|
||||||
|
elevation = dimensionResource(id = R.dimen.elevation2),
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.height(dimensionResource(R.dimen.size48))
|
||||||
|
.padding(
|
||||||
|
horizontal = dimensionResource(id = R.dimen.spacing16),
|
||||||
|
vertical = dimensionResource(id = R.dimen.spacing12),
|
||||||
|
),
|
||||||
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = startText,
|
||||||
|
color = MaterialTheme.colors.textColor(type = TextColorType.TERTIARY),
|
||||||
|
maxLines = 1,
|
||||||
|
style = MaterialTheme.typography.subtitle2
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = endText,
|
||||||
|
color = MaterialTheme.colors.textColor(type = TextColorType.PRIMARY1),
|
||||||
|
maxLines = 1,
|
||||||
|
style = MaterialTheme.typography.body2
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
16
core/ui/src/main/java/com/tangem/core/ui/res/ButtonColor.kt
Normal file
16
core/ui/src/main/java/com/tangem/core/ui/res/ButtonColor.kt
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.tangem.core.ui.res
|
||||||
|
|
||||||
|
import androidx.compose.material.Colors
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
|
||||||
|
enum class ButtonColorType(val lightColor: Color, val darkColor: Color) {
|
||||||
|
PRIMARY(lightColor = Dark6, darkColor = Light1),
|
||||||
|
SECONDARY(lightColor = Light2, darkColor = Dark5),
|
||||||
|
DISABLED(lightColor = Light2, darkColor = Dark6),
|
||||||
|
POSITIVE(lightColor = Meadow, darkColor = Meadow),
|
||||||
|
POSITIVE_DISABLED(lightColor = MagicMint, darkColor = DarkGreen)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun Colors.buttonColor(type: ButtonColorType): Color = if (isSystemInDarkTheme) type.darkColor else type.lightColor
|
||||||
45
core/ui/src/main/java/com/tangem/core/ui/res/Color.kt
Normal file
45
core/ui/src/main/java/com/tangem/core/ui/res/Color.kt
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
package com.tangem.core.ui.res
|
||||||
|
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
|
||||||
|
// region Base
|
||||||
|
val Black = Color(0xFF000000)
|
||||||
|
val White = Color(0xFFFFFFFF)
|
||||||
|
// endregion Base
|
||||||
|
|
||||||
|
// region Dark
|
||||||
|
val Dark1 = Color(0xFF919191)
|
||||||
|
val Dark2 = Color(0xFF656565)
|
||||||
|
val Dark3 = Color(0xFF494949)
|
||||||
|
val Dark4 = Color(0xFF3B3B3B)
|
||||||
|
val Dark5 = Color(0xFF303030)
|
||||||
|
val Dark6 = Color(0xFF1E1E1E)
|
||||||
|
// endregion Dark
|
||||||
|
|
||||||
|
// region Light
|
||||||
|
val Light1 = Color(0xFFF5F5F5)
|
||||||
|
val Light2 = Color(0xFFEBEBEB)
|
||||||
|
val Light3 = Color(0xFFD3D3D3)
|
||||||
|
val Light4 = Color(0xFFC9C9C9)
|
||||||
|
val Light5 = Color(0xFFB0B0B0)
|
||||||
|
// endregion Light
|
||||||
|
|
||||||
|
// region Green
|
||||||
|
val Meadow = Color(0xFF1ACE80)
|
||||||
|
val MagicMint = Color(0xFFA3EBCC)
|
||||||
|
val DarkGreen = Color(0xFF06311F)
|
||||||
|
// endregion Green
|
||||||
|
|
||||||
|
// region Blue
|
||||||
|
val Cobalt = Color(0xFF0029FF)
|
||||||
|
val Azure = Color(0xFF007AFF)
|
||||||
|
// endregion Blue
|
||||||
|
|
||||||
|
// region Red
|
||||||
|
val Amaranth = Color(0xFFDE1010)
|
||||||
|
val Flamingo = Color(0xFFED7979)
|
||||||
|
// endregion Red
|
||||||
|
|
||||||
|
// region Yellow
|
||||||
|
val Tangerine = Color(0xFFFFB71B)
|
||||||
|
// endregion Yellow
|
||||||
46
core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt
Normal file
46
core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
package com.tangem.core.ui.res
|
||||||
|
|
||||||
|
import androidx.compose.material.MaterialTheme
|
||||||
|
import androidx.compose.material.darkColors
|
||||||
|
import androidx.compose.material.lightColors
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
|
||||||
|
internal val isSystemInDarkTheme: Boolean = false // TODO: use isSystemInDarkTheme() for automatic color detection
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun TangemTheme(
|
||||||
|
isDarkTheme: Boolean = isSystemInDarkTheme,
|
||||||
|
content: @Composable () -> Unit,
|
||||||
|
) {
|
||||||
|
MaterialTheme(
|
||||||
|
colors = if (isDarkTheme) DarkColors else LightColors,
|
||||||
|
typography = TangemTypography,
|
||||||
|
content = content,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private val LightColors = lightColors(
|
||||||
|
primary = Light1,
|
||||||
|
primaryVariant = Light1,
|
||||||
|
secondary = White,
|
||||||
|
background = Light1,
|
||||||
|
surface = White,
|
||||||
|
error = Amaranth,
|
||||||
|
onPrimary = Dark6,
|
||||||
|
onSecondary = Dark6,
|
||||||
|
onBackground = Dark6,
|
||||||
|
onSurface = Dark6,
|
||||||
|
)
|
||||||
|
|
||||||
|
private val DarkColors = darkColors(
|
||||||
|
primary = Black,
|
||||||
|
primaryVariant = Black,
|
||||||
|
secondary = Dark6,
|
||||||
|
background = Black,
|
||||||
|
surface = Dark6,
|
||||||
|
error = Amaranth,
|
||||||
|
onPrimary = White,
|
||||||
|
onSecondary = White,
|
||||||
|
onBackground = White,
|
||||||
|
onSurface = White,
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,82 @@
|
||||||
|
package com.tangem.core.ui.res
|
||||||
|
|
||||||
|
import androidx.compose.material.Typography
|
||||||
|
import androidx.compose.ui.text.TextStyle
|
||||||
|
import androidx.compose.ui.text.font.Font
|
||||||
|
import androidx.compose.ui.text.font.FontFamily
|
||||||
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
|
import androidx.compose.ui.unit.ExperimentalUnitApi
|
||||||
|
import androidx.compose.ui.unit.TextUnit
|
||||||
|
import androidx.compose.ui.unit.TextUnitType
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import com.tangem.core.ui.R
|
||||||
|
|
||||||
|
private val RobotoFamily = FontFamily(
|
||||||
|
Font(R.font.roboto_regular, FontWeight.Normal),
|
||||||
|
Font(R.font.roboto_medium, FontWeight.Medium),
|
||||||
|
)
|
||||||
|
|
||||||
|
@OptIn(ExperimentalUnitApi::class)
|
||||||
|
val TangemTypography = Typography(
|
||||||
|
defaultFontFamily = RobotoFamily,
|
||||||
|
h1 = TextStyle(
|
||||||
|
fontSize = 34.sp,
|
||||||
|
fontWeight = FontWeight.Normal,
|
||||||
|
letterSpacing = TextUnit(0f, TextUnitType.Sp),
|
||||||
|
lineHeight = TextUnit(44f, TextUnitType.Sp),
|
||||||
|
),
|
||||||
|
h2 = TextStyle(
|
||||||
|
fontSize = 24.sp,
|
||||||
|
fontWeight = FontWeight.Medium,
|
||||||
|
letterSpacing = TextUnit(0.18f, TextUnitType.Sp),
|
||||||
|
lineHeight = TextUnit(32f, TextUnitType.Sp),
|
||||||
|
),
|
||||||
|
h3 = TextStyle(
|
||||||
|
fontSize = 20.sp,
|
||||||
|
fontWeight = FontWeight.Medium,
|
||||||
|
letterSpacing = TextUnit(0.15f, TextUnitType.Sp),
|
||||||
|
lineHeight = TextUnit(24f, TextUnitType.Sp),
|
||||||
|
),
|
||||||
|
subtitle1 = TextStyle(
|
||||||
|
fontSize = 16.sp,
|
||||||
|
fontWeight = FontWeight.Medium,
|
||||||
|
letterSpacing = TextUnit(0.15f, TextUnitType.Sp),
|
||||||
|
lineHeight = TextUnit(24f, TextUnitType.Sp),
|
||||||
|
),
|
||||||
|
subtitle2 = TextStyle(
|
||||||
|
fontSize = 14.sp,
|
||||||
|
fontWeight = FontWeight.Medium,
|
||||||
|
letterSpacing = TextUnit(0.5f, TextUnitType.Sp),
|
||||||
|
lineHeight = TextUnit(24f, TextUnitType.Sp),
|
||||||
|
),
|
||||||
|
body1 = TextStyle(
|
||||||
|
fontSize = 16.sp,
|
||||||
|
fontWeight = FontWeight.Normal,
|
||||||
|
letterSpacing = TextUnit(0.5f, TextUnitType.Sp),
|
||||||
|
lineHeight = TextUnit(24f, TextUnitType.Sp),
|
||||||
|
),
|
||||||
|
body2 = TextStyle(
|
||||||
|
fontSize = 14.sp,
|
||||||
|
fontWeight = FontWeight.Normal,
|
||||||
|
letterSpacing = TextUnit(0.25f, TextUnitType.Sp),
|
||||||
|
lineHeight = TextUnit(20f, TextUnitType.Sp),
|
||||||
|
),
|
||||||
|
button = TextStyle(
|
||||||
|
fontSize = 14.sp,
|
||||||
|
fontWeight = FontWeight.Medium,
|
||||||
|
letterSpacing = TextUnit(0.1f, TextUnitType.Sp),
|
||||||
|
lineHeight = TextUnit(16f, TextUnitType.Sp),
|
||||||
|
),
|
||||||
|
caption = TextStyle(
|
||||||
|
fontSize = 12.sp,
|
||||||
|
fontWeight = FontWeight.Normal,
|
||||||
|
letterSpacing = TextUnit(0.4f, TextUnitType.Sp),
|
||||||
|
lineHeight = TextUnit(16f, TextUnitType.Sp),
|
||||||
|
),
|
||||||
|
overline = TextStyle(
|
||||||
|
fontSize = 10.sp,
|
||||||
|
fontWeight = FontWeight.Medium,
|
||||||
|
letterSpacing = TextUnit(1.5f, TextUnitType.Sp),
|
||||||
|
lineHeight = TextUnit(16f, TextUnitType.Sp),
|
||||||
|
),
|
||||||
|
)
|
||||||
20
core/ui/src/main/java/com/tangem/core/ui/res/TextColor.kt
Normal file
20
core/ui/src/main/java/com/tangem/core/ui/res/TextColor.kt
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.tangem.core.ui.res
|
||||||
|
|
||||||
|
import androidx.compose.material.Colors
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
|
||||||
|
enum class TextColorType(val lightColor: Color, val darkColor: Color) {
|
||||||
|
PRIMARY1(lightColor = Dark6, darkColor = White),
|
||||||
|
PRIMARY2(lightColor = White, darkColor = Dark6),
|
||||||
|
SECONDARY(lightColor = Dark2, darkColor = Light5),
|
||||||
|
TERTIARY(lightColor = Dark1, darkColor = Dark1),
|
||||||
|
DISABLED(lightColor = Light4, darkColor = Dark3),
|
||||||
|
ACCENT(lightColor = Meadow, darkColor = Meadow),
|
||||||
|
WARNING(lightColor = Amaranth, darkColor = Amaranth),
|
||||||
|
ATTENTION(lightColor = Tangerine, darkColor = Tangerine),
|
||||||
|
CONSTANT_WHITE(lightColor = White, darkColor = White)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun Colors.textColor(type: TextColorType): Color = if (isSystemInDarkTheme) type.darkColor else type.lightColor
|
||||||
BIN
core/ui/src/main/res/drawable/ill_businessman_3d.webp
Normal file
BIN
core/ui/src/main/res/drawable/ill_businessman_3d.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 74 KiB |
BIN
core/ui/src/main/res/font/roboto_medium.ttf
Normal file
BIN
core/ui/src/main/res/font/roboto_medium.ttf
Normal file
Binary file not shown.
BIN
core/ui/src/main/res/font/roboto_regular.ttf
Normal file
BIN
core/ui/src/main/res/font/roboto_regular.ttf
Normal file
Binary file not shown.
31
core/ui/src/main/res/values/dimens.xml
Normal file
31
core/ui/src/main/res/values/dimens.xml
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- region Elevation -->
|
||||||
|
<dimen name="elevation1">1dp</dimen>
|
||||||
|
<dimen name="elevation2">2dp</dimen>
|
||||||
|
<dimen name="elevation3">3dp</dimen>
|
||||||
|
<dimen name="elevation4">4dp</dimen>
|
||||||
|
<dimen name="elevation6">6dp</dimen>
|
||||||
|
<dimen name="elevation8">8dp</dimen>
|
||||||
|
<dimen name="elevation12">12dp</dimen>
|
||||||
|
<dimen name="elevation16">16dp</dimen>
|
||||||
|
<dimen name="elevation24">24dp</dimen>
|
||||||
|
<!-- endregion Elevation -->
|
||||||
|
|
||||||
|
<!-- region Radius -->
|
||||||
|
<dimen name="radius12">12dp</dimen>
|
||||||
|
<!-- endregion Radius -->
|
||||||
|
|
||||||
|
<!-- region Size -->
|
||||||
|
<dimen name="size24">24dp</dimen>
|
||||||
|
<dimen name="size48">48dp</dimen>
|
||||||
|
<dimen name="size200">200dp</dimen>
|
||||||
|
<!-- endregion Size -->
|
||||||
|
|
||||||
|
<!-- region Spacing -->
|
||||||
|
<dimen name="spacing8">8dp</dimen>
|
||||||
|
<dimen name="spacing12">12dp</dimen>
|
||||||
|
<dimen name="spacing16">16dp</dimen>
|
||||||
|
<dimen name="spacing24">24dp</dimen>
|
||||||
|
<!-- endregion Spacing -->
|
||||||
|
</resources>
|
||||||
|
|
@ -2,8 +2,15 @@ include(":app")
|
||||||
include(":domain")
|
include(":domain")
|
||||||
include(":network")
|
include(":network")
|
||||||
include(":common")
|
include(":common")
|
||||||
|
|
||||||
|
// region Core modules
|
||||||
include(":core:datasource")
|
include(":core:datasource")
|
||||||
include(":core:utils")
|
include(":core:utils")
|
||||||
|
include(":core:ui")
|
||||||
|
// endregion Core modules
|
||||||
|
|
||||||
|
// region Feature modules
|
||||||
include(":features:referral:data")
|
include(":features:referral:data")
|
||||||
include(":features:referral:domain")
|
include(":features:referral:domain")
|
||||||
include(":features:referral:presentation")
|
include(":features:referral:presentation")
|
||||||
|
// endregion Feature modules
|
||||||
Loading…
Add table
Add a link
Reference in a new issue