diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 58b405a..ac20279 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -37,6 +37,7 @@ kotlin { implementation(compose.runtime) implementation(compose.foundation) implementation(compose.material3) + implementation(compose.materialIconsExtended) implementation(compose.components.uiToolingPreview) implementation(libs.ktor.client.core) implementation(libs.ktor.client.content.negotiation) diff --git a/composeApp/src/commonMain/kotlin/ch/parano/myicek/ui/theme/Dimens.kt b/composeApp/src/commonMain/kotlin/ch/parano/myicek/ui/theme/Dimens.kt new file mode 100644 index 0000000..3e17c8d --- /dev/null +++ b/composeApp/src/commonMain/kotlin/ch/parano/myicek/ui/theme/Dimens.kt @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// MyIce Kotlin Multiplatform — schedule/convocation viewer +// Copyright (C) 2026 parano.ch +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package ch.parano.myicek.ui.theme + +import androidx.compose.ui.unit.dp + +object Dimens { + val xs = 4.dp + val sm = 8.dp + val md = 12.dp + val lg = 16.dp + val xl = 24.dp + val xxl = 32.dp +} diff --git a/composeApp/src/commonMain/kotlin/ch/parano/myicek/ui/theme/Theme.kt b/composeApp/src/commonMain/kotlin/ch/parano/myicek/ui/theme/Theme.kt index 9b04d69..066adf2 100644 --- a/composeApp/src/commonMain/kotlin/ch/parano/myicek/ui/theme/Theme.kt +++ b/composeApp/src/commonMain/kotlin/ch/parano/myicek/ui/theme/Theme.kt @@ -18,28 +18,83 @@ package ch.parano.myicek.ui.theme import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Shapes +import androidx.compose.material3.Typography import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color - -private val Indigo = Color(0xFF3F51B5) -private val IndigoLight = Color(0xFF7986CB) -private val IndigoDark = Color(0xFF303F9F) +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp private val LightColors = lightColorScheme( - primary = Indigo, - onPrimary = Color.White, - primaryContainer = IndigoDark, - secondary = IndigoLight, + primary = Color(0xFF0D9488), + onPrimary = Color(0xFFFFFFFF), + primaryContainer = Color(0xFF99F6E4), + onPrimaryContainer = Color(0xFF134E4A), + secondary = Color(0xFF475569), + onSecondary = Color(0xFFFFFFFF), + secondaryContainer = Color(0xFFE2E8F0), + onSecondaryContainer = Color(0xFF1E293B), + tertiary = Color(0xFF0EA5E9), + onTertiary = Color(0xFFFFFFFF), + tertiaryContainer = Color(0xFFE0F2FE), + onTertiaryContainer = Color(0xFF075985), + error = Color(0xFFDC2626), + onError = Color(0xFFFFFFFF), + errorContainer = Color(0xFFFEE2E2), + onErrorContainer = Color(0xFF7F1D1D), + background = Color(0xFFFAFAFA), + onBackground = Color(0xFF1C1917), + surface = Color(0xFFFFFFFF), + onSurface = Color(0xFF1C1917), + surfaceVariant = Color(0xFFF1F5F9), + onSurfaceVariant = Color(0xFF475569), + outline = Color(0xFFCBD5E1), ) private val DarkColors = darkColorScheme( - primary = IndigoLight, - onPrimary = Color.Black, - primaryContainer = Indigo, - secondary = Indigo, + primary = Color(0xFF2DD4BF), + onPrimary = Color(0xFF003833), + primaryContainer = Color(0xFF0D9488), + onPrimaryContainer = Color(0xFF99F6E4), + secondary = Color(0xFF94A3B8), + onSecondary = Color(0xFF1E293B), + secondaryContainer = Color(0xFF334155), + onSecondaryContainer = Color(0xFFE2E8F0), + tertiary = Color(0xFF0EA5E9), + onTertiary = Color(0xFF003547), + background = Color(0xFF0F172A), + onBackground = Color(0xFFF1F5F9), + surface = Color(0xFF1E293B), + onSurface = Color(0xFFF1F5F9), + surfaceVariant = Color(0xFF334155), + onSurfaceVariant = Color(0xFF94A3B8), + outline = Color(0xFF475569), + error = Color(0xFFF87171), + onError = Color(0xFF7F1D1D), + errorContainer = Color(0xFF7F1D1D), + onErrorContainer = Color(0xFFFECACA), +) + +private val AppTypography = Typography( + headlineLarge = TextStyle(fontSize = 28.sp, fontWeight = FontWeight.Bold), + titleLarge = TextStyle(fontSize = 22.sp, fontWeight = FontWeight.SemiBold), + titleMedium = TextStyle(fontSize = 16.sp, fontWeight = FontWeight.SemiBold), + bodyLarge = TextStyle(fontSize = 15.sp, fontWeight = FontWeight.Normal), + bodyMedium = TextStyle(fontSize = 14.sp, fontWeight = FontWeight.Normal), + bodySmall = TextStyle(fontSize = 13.sp, fontWeight = FontWeight.Normal), + labelMedium = TextStyle(fontSize = 12.sp, fontWeight = FontWeight.Medium), +) + +private val AppShapes = Shapes( + small = RoundedCornerShape(8.dp), + medium = RoundedCornerShape(12.dp), + large = RoundedCornerShape(16.dp), ) @Composable @@ -49,6 +104,8 @@ fun MyIceTheme( ) { MaterialTheme( colorScheme = if (darkTheme) DarkColors else LightColors, + typography = AppTypography, + shapes = AppShapes, content = content, ) }