diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index fe20c4709a..847507ba5f 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -109,6 +109,7 @@ dependencies {
implementation(project(":domain"))
implementation(project(":network"))
implementation(project(":common"))
+ implementation(project(":core:ui"))
/** AndroidX libraries */
implementation(AndroidX.coreKtx)
diff --git a/app/src/main/java/com/tangem/tap/common/compose/TangemTypography.kt b/app/src/main/java/com/tangem/tap/common/compose/TangemTypography.kt
index 88b088fa6a..2013295f25 100644
--- a/app/src/main/java/com/tangem/tap/common/compose/TangemTypography.kt
+++ b/app/src/main/java/com/tangem/tap/common/compose/TangemTypography.kt
@@ -9,13 +9,13 @@ import com.tangem.wallet.R
object TangemTypography {
val body1 = TextStyle(
- fontFamily = FontFamily(Font(R.font.roboto)),
+ fontFamily = FontFamily(Font(R.font.roboto_regular)),
fontSize = 16.0.sp,
letterSpacing = 0.5.sp,
lineHeight = 24.0.sp,
)
val body2 = TextStyle(
- fontFamily = FontFamily(Font(R.font.roboto)),
+ fontFamily = FontFamily(Font(R.font.roboto_regular)),
fontSize = 14.0.sp,
letterSpacing = 0.25.sp,
lineHeight = 20.0.sp,
@@ -27,13 +27,13 @@ object TangemTypography {
lineHeight = 20.0.sp,
)
val caption = TextStyle(
- fontFamily = FontFamily(Font(R.font.roboto)),
+ fontFamily = FontFamily(Font(R.font.roboto_regular)),
fontSize = 12.0.sp,
letterSpacing = 0.4000000059604645.sp,
lineHeight = 16.0.sp,
)
val headline1 = TextStyle(
- fontFamily = FontFamily(Font(R.font.roboto)),
+ fontFamily = FontFamily(Font(R.font.roboto_regular)),
fontSize = 34.0.sp,
letterSpacing = 0.0.sp,
lineHeight = 44.0.sp,
diff --git a/core/ui/.gitignore b/core/ui/.gitignore
new file mode 100644
index 0000000000..42afabfd2a
--- /dev/null
+++ b/core/ui/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts
new file mode 100644
index 0000000000..ee2eab0e2a
--- /dev/null
+++ b/core/ui/build.gradle.kts
@@ -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)
+}
\ No newline at end of file
diff --git a/core/ui/src/main/AndroidManifest.xml b/core/ui/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..c5a36c7e17
--- /dev/null
+++ b/core/ui/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/AppBar.kt b/core/ui/src/main/java/com/tangem/core/ui/components/AppBar.kt
new file mode 100644
index 0000000000..6810ba11e8
--- /dev/null
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/AppBar.kt
@@ -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 Figma component
+ */
+@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,
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/Buttons.kt b/core/ui/src/main/java/com/tangem/core/ui/components/Buttons.kt
new file mode 100644
index 0000000000..e9e49c5c71
--- /dev/null
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/Buttons.kt
@@ -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 Figma component
+ */
+@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 Figma component
+ */
+@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,
+ )
+}
\ No newline at end of file
diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/Cards.kt b/core/ui/src/main/java/com/tangem/core/ui/components/Cards.kt
new file mode 100644
index 0000000000..57a47dff46
--- /dev/null
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/Cards.kt
@@ -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 Figma component
+ */
+@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
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/ButtonColor.kt b/core/ui/src/main/java/com/tangem/core/ui/res/ButtonColor.kt
new file mode 100644
index 0000000000..cb6607c8a3
--- /dev/null
+++ b/core/ui/src/main/java/com/tangem/core/ui/res/ButtonColor.kt
@@ -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
\ No newline at end of file
diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/Color.kt b/core/ui/src/main/java/com/tangem/core/ui/res/Color.kt
new file mode 100644
index 0000000000..4d37ecee45
--- /dev/null
+++ b/core/ui/src/main/java/com/tangem/core/ui/res/Color.kt
@@ -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
\ No newline at end of file
diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt
new file mode 100644
index 0000000000..2e065ba6ee
--- /dev/null
+++ b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt
@@ -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,
+)
\ No newline at end of file
diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TangemTypography.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTypography.kt
new file mode 100644
index 0000000000..89ec283924
--- /dev/null
+++ b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTypography.kt
@@ -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),
+ ),
+)
\ No newline at end of file
diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TextColor.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TextColor.kt
new file mode 100644
index 0000000000..44f94e1157
--- /dev/null
+++ b/core/ui/src/main/java/com/tangem/core/ui/res/TextColor.kt
@@ -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
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_back.xml b/core/ui/src/main/res/drawable/ic_back.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_back.xml
rename to core/ui/src/main/res/drawable/ic_back.xml
diff --git a/app/src/main/res/drawable/ic_tangem.xml b/core/ui/src/main/res/drawable/ic_tangem.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_tangem.xml
rename to core/ui/src/main/res/drawable/ic_tangem.xml
diff --git a/core/ui/src/main/res/drawable/ill_businessman_3d.webp b/core/ui/src/main/res/drawable/ill_businessman_3d.webp
new file mode 100644
index 0000000000..a018c1b5bb
Binary files /dev/null and b/core/ui/src/main/res/drawable/ill_businessman_3d.webp differ
diff --git a/core/ui/src/main/res/font/roboto_medium.ttf b/core/ui/src/main/res/font/roboto_medium.ttf
new file mode 100644
index 0000000000..ac0f908b9c
Binary files /dev/null and b/core/ui/src/main/res/font/roboto_medium.ttf differ
diff --git a/core/ui/src/main/res/font/roboto_regular.ttf b/core/ui/src/main/res/font/roboto_regular.ttf
new file mode 100644
index 0000000000..ddf4bfacb3
Binary files /dev/null and b/core/ui/src/main/res/font/roboto_regular.ttf differ
diff --git a/core/ui/src/main/res/values/dimens.xml b/core/ui/src/main/res/values/dimens.xml
new file mode 100644
index 0000000000..cd873bfb37
--- /dev/null
+++ b/core/ui/src/main/res/values/dimens.xml
@@ -0,0 +1,31 @@
+
+
+
+ 1dp
+ 2dp
+ 3dp
+ 4dp
+ 6dp
+ 8dp
+ 12dp
+ 16dp
+ 24dp
+
+
+
+ 12dp
+
+
+
+ 24dp
+ 48dp
+ 200dp
+
+
+
+ 8dp
+ 12dp
+ 16dp
+ 24dp
+
+
\ No newline at end of file
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 05eaab6228..5387734770 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -2,8 +2,15 @@ include(":app")
include(":domain")
include(":network")
include(":common")
+
+// region Core modules
include(":core:datasource")
include(":core:utils")
+include(":core:ui")
+// endregion Core modules
+
+// region Feature modules
include(":features:referral:data")
include(":features:referral:domain")
-include(":features:referral:presentation")
\ No newline at end of file
+include(":features:referral:presentation")
+// endregion Feature modules
\ No newline at end of file