feat: add teal arctique theme with full M3 color scheme, typography, shapes, spacing tokens

- Complete light/dark color schemes (all M3 slots)
- Typography scale (headlineLarge through labelMedium)
- Shape tokens (small 8dp, medium 12dp, large 16dp)
- Dimens spacing object (xs through xxl)
- Add material-icons-extended dependency
This commit is contained in:
2026-08-06 16:21:07 +02:00
parent be6e9d733a
commit b7af237002
3 changed files with 99 additions and 12 deletions
+1
View File
@@ -37,6 +37,7 @@ kotlin {
implementation(compose.runtime) implementation(compose.runtime)
implementation(compose.foundation) implementation(compose.foundation)
implementation(compose.material3) implementation(compose.material3)
implementation(compose.materialIconsExtended)
implementation(compose.components.uiToolingPreview) implementation(compose.components.uiToolingPreview)
implementation(libs.ktor.client.core) implementation(libs.ktor.client.core)
implementation(libs.ktor.client.content.negotiation) implementation(libs.ktor.client.content.negotiation)
@@ -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 <https://www.gnu.org/licenses/>.
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
}
@@ -18,28 +18,83 @@
package ch.parano.myicek.ui.theme package ch.parano.myicek.ui.theme
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Shapes
import androidx.compose.material3.Typography
import androidx.compose.material3.darkColorScheme import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.lightColorScheme import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
private val Indigo = Color(0xFF3F51B5) import androidx.compose.ui.text.font.FontWeight
private val IndigoLight = Color(0xFF7986CB) import androidx.compose.ui.unit.dp
private val IndigoDark = Color(0xFF303F9F) import androidx.compose.ui.unit.sp
private val LightColors = lightColorScheme( private val LightColors = lightColorScheme(
primary = Indigo, primary = Color(0xFF0D9488),
onPrimary = Color.White, onPrimary = Color(0xFFFFFFFF),
primaryContainer = IndigoDark, primaryContainer = Color(0xFF99F6E4),
secondary = IndigoLight, 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( private val DarkColors = darkColorScheme(
primary = IndigoLight, primary = Color(0xFF2DD4BF),
onPrimary = Color.Black, onPrimary = Color(0xFF003833),
primaryContainer = Indigo, primaryContainer = Color(0xFF0D9488),
secondary = Indigo, 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 @Composable
@@ -49,6 +104,8 @@ fun MyIceTheme(
) { ) {
MaterialTheme( MaterialTheme(
colorScheme = if (darkTheme) DarkColors else LightColors, colorScheme = if (darkTheme) DarkColors else LightColors,
typography = AppTypography,
shapes = AppShapes,
content = content, content = content,
) )
} }