From 77eb55874278b7740d43b9144d9253a075cc593c Mon Sep 17 00:00:00 2001 From: claymorwan Date: Wed, 28 May 2025 19:39:42 +0000 Subject: [PATCH] Add Catppuccin theme (#2117) Mocha for dark and Latte for light, mauve accent --- CHANGELOG.md | 1 + .../eu/kanade/domain/ui/model/AppTheme.kt | 1 + .../presentation/theme/TachiyomiTheme.kt | 2 + .../colorscheme/CatppuccinColorScheme.kt | 103 ++++++++++++++++++ .../ui/base/delegate/ThemingDelegate.kt | 1 + app/src/main/res/values/themes.xml | 39 +++++++ .../moko-resources/base/strings.xml | 1 + .../res/values-night/colors_catppuccin.xml | 51 +++++++++ .../src/main/res/values/colors_catppuccin.xml | 51 +++++++++ 9 files changed, 250 insertions(+) create mode 100644 app/src/main/java/eu/kanade/presentation/theme/colorscheme/CatppuccinColorScheme.kt create mode 100644 presentation-core/src/main/res/values-night/colors_catppuccin.xml create mode 100644 presentation-core/src/main/res/values/colors_catppuccin.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index a726d8b76..acfd540b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ The format is a modified version of [Keep a Changelog](https://keepachangelog.co - Option to keep read manga when clearing database ([@AwkwardPeak7](https://github.com/AwkwardPeak7)) ([#1979](https://github.com/mihonapp/mihon/pull/1979)) - Add advanced option to always update manga title from source ([@FlaminSarge](https://github.com/FlaminSarge)) ([#1182](https://github.com/mihonapp/mihon/pull/1182)) - Full predictive back support ([@AntsyLich](https://github.com/AntsyLich)) ([#2085](https://github.com/mihonapp/mihon/pull/2085)) +- Add Catppuccin theme (mocha for dark and latte for light, mauve accent) ([@claymorwan](https://github.com/claymorwan/)) ([#2117](https://github.com/mihonapp/mihon/pull/2117)) ### Improved - Significantly improve browsing speed (near instantaneous) ([@AntsyLich](https://github.com/AntsyLich)) ([#1946](https://github.com/mihonapp/mihon/pull/1946)) diff --git a/app/src/main/java/eu/kanade/domain/ui/model/AppTheme.kt b/app/src/main/java/eu/kanade/domain/ui/model/AppTheme.kt index d8a14ef80..2394c5a42 100644 --- a/app/src/main/java/eu/kanade/domain/ui/model/AppTheme.kt +++ b/app/src/main/java/eu/kanade/domain/ui/model/AppTheme.kt @@ -6,6 +6,7 @@ import tachiyomi.i18n.MR enum class AppTheme(val titleRes: StringResource?) { DEFAULT(MR.strings.label_default), MONET(MR.strings.theme_monet), + CATPPUCCIN(MR.strings.theme_catppuccin), GREEN_APPLE(MR.strings.theme_greenapple), LAVENDER(MR.strings.theme_lavender), MIDNIGHT_DUSK(MR.strings.theme_midnightdusk), diff --git a/app/src/main/java/eu/kanade/presentation/theme/TachiyomiTheme.kt b/app/src/main/java/eu/kanade/presentation/theme/TachiyomiTheme.kt index 2b3f86477..6da538015 100644 --- a/app/src/main/java/eu/kanade/presentation/theme/TachiyomiTheme.kt +++ b/app/src/main/java/eu/kanade/presentation/theme/TachiyomiTheme.kt @@ -9,6 +9,7 @@ import androidx.compose.ui.platform.LocalContext import eu.kanade.domain.ui.UiPreferences import eu.kanade.domain.ui.model.AppTheme import eu.kanade.presentation.theme.colorscheme.BaseColorScheme +import eu.kanade.presentation.theme.colorscheme.CatppuccinColorScheme import eu.kanade.presentation.theme.colorscheme.GreenAppleColorScheme import eu.kanade.presentation.theme.colorscheme.LavenderColorScheme import eu.kanade.presentation.theme.colorscheme.MidnightDuskColorScheme @@ -77,6 +78,7 @@ private fun getThemeColorScheme( private val colorSchemes: Map = mapOf( AppTheme.DEFAULT to TachiyomiColorScheme, + AppTheme.CATPPUCCIN to CatppuccinColorScheme, AppTheme.GREEN_APPLE to GreenAppleColorScheme, AppTheme.LAVENDER to LavenderColorScheme, AppTheme.MIDNIGHT_DUSK to MidnightDuskColorScheme, diff --git a/app/src/main/java/eu/kanade/presentation/theme/colorscheme/CatppuccinColorScheme.kt b/app/src/main/java/eu/kanade/presentation/theme/colorscheme/CatppuccinColorScheme.kt new file mode 100644 index 000000000..7249b0450 --- /dev/null +++ b/app/src/main/java/eu/kanade/presentation/theme/colorscheme/CatppuccinColorScheme.kt @@ -0,0 +1,103 @@ +package eu.kanade.presentation.theme.colorscheme + +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.ui.graphics.Color + +/** + * Colors for Catppuccin theme + * MIT License + * Copyright (c) 2021 Catppuccin + * https://catppuccin.com + * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) + * + * Key colors (dark): + * Primary #CBA6F4 + * Secondary #CBA6F4 + * Tertiary #CBA6F4 + * Neutral #181825 + + * Key colors (light): + * Primary #8839EF + * Secondary #8839EF + * Tertiary #8839EF + * Neutral #E6E9EF + */ +internal object CatppuccinColorScheme : BaseColorScheme() { + + override val darkScheme = darkColorScheme( + primary = Color(0xFFCBA6F7), + onPrimary = Color(0xFF11111B), + primaryContainer = Color(0xFFCBA6F7), + onPrimaryContainer = Color(0xFF11111B), + secondary = Color(0xFFCBA6F7), // Unread badge + onSecondary = Color(0xFF11111B), // Unread badge text + secondaryContainer = Color(0xFF313244), // Navigation bar selector pill & progress indicator (remaining) + onSecondaryContainer = Color(0xFFCBA6F7), // Navigation bar selector icon + tertiary = Color(0xFFCBA6F7), // Volume and brightness bars, Downloaded badge + onTertiary = Color(0xFF11111B), // Downloaded badge text + tertiaryContainer = Color(0xFF1E1E2E), + onTertiaryContainer = Color(0xFFCDD6F4), + error = Color(0xFFF38BA8), + onError = Color(0xFF11111B), + errorContainer = Color(0xFFFF0558), + onErrorContainer = Color(0xFFEF9FB4), + background = Color(0xFF181825), + onBackground = Color(0xFFCDD6F4), + surface = Color(0xFF181825), + onSurface = Color(0xFFCDD6F4), + surfaceVariant = Color(0xFF1E1E2E), // Navigation bar background (ThemePrefWidget) + onSurfaceVariant = Color(0xFFCDD6F4), // Button (unselected) + outline = Color(0xFFCBA6F7), + outlineVariant = Color(0xFF585B70), // Outlines for buttons + scrim = Color(0xFF11111B), + inverseSurface = Color(0xFFEFF1F5), // Snackbar or whatever they called + inverseOnSurface = Color(0xFF4C4F69), // Snackbar text + inversePrimary = Color(0xFF8839EF), // Snackbar accent + surfaceDim = Color(0xFF181825), + surfaceBright = Color(0xFF313244), + surfaceContainerLowest = Color(0xFF181825), + surfaceContainerLow = Color(0xFF1E1E2E), // Repo cards + surfaceContainer = Color(0xFF1E1E2E), + surfaceContainerHigh = Color(0xFF1E1E2E), // Filter menu + surfaceContainerHighest = Color(0xFF313244), // Untoggleg button bg + ) + + override val lightScheme = lightColorScheme( + primary = Color(0xFF8839EF), + onPrimary = Color(0xFFDCE0E8), + primaryContainer = Color(0xFF8839EF), + onPrimaryContainer = Color(0xFFDCE0E8), + secondary = Color(0xFF8839EF), // Unread badge + onSecondary = Color(0xFFDCE0E8), // Unread badge text + secondaryContainer = Color(0xFFCDD0DA), // Navigation bar selector pill & progress indicator (remaining) + onSecondaryContainer = Color(0xFF8839EF), // Navigation bar selector icon + tertiary = Color(0xFF8839EF), // Volume and brightness bars, Downloaded badge + onTertiary = Color(0xFFDCE0E8), // Downloaded badge text + tertiaryContainer = Color(0xFFEFF1F5), + onTertiaryContainer = Color(0xFF4C4F69), + error = Color(0xFFD20F39), + onError = Color(0xFFDCE0E8), + errorContainer = Color(0xFF68001C), + onErrorContainer = Color(0xFFD61C41), + background = Color(0xFFE6E9EF), + onBackground = Color(0xFF4C4F69), + surface = Color(0xFFE6E9EF), + onSurface = Color(0xFF4C4F69), + surfaceVariant = Color(0xFFEFF1F5), // Navigation bar background (ThemePrefWidget) + onSurfaceVariant = Color(0xFF4C4F69), // Button (unselected) + outline = Color(0xFF8839EF), + outlineVariant = Color(0xFFACB0BE), // Outlines for buttons + scrim = Color(0xFFDCE0E8), + inverseSurface = Color(0xFF1E1E2E), // Snackbar + inverseOnSurface = Color(0xFFCDD6F4), // Snackbar text + inversePrimary = Color(0xFFCBA6F7), // Snackbar accent + surfaceDim = Color(0xFFE6E9EF), + surfaceBright = Color(0xFFCDD0DA), + surfaceContainerLowest = Color(0xFFE6E9EF), + surfaceContainerLow = Color(0xFFEFF1F5), // Repo cards + surfaceContainer = Color(0xFFEFF1F5), // Navigation bar background + surfaceContainerHigh = Color(0xFFEFF1F5), // Filter menu + surfaceContainerHighest = Color(0xFFCDD0DA), // Untoggleg bg + ) +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate.kt index d08ca1e5d..9bd32b7ed 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate.kt @@ -30,6 +30,7 @@ class ThemingDelegateImpl : ThemingDelegate { private val themeResources: Map = mapOf( AppTheme.MONET to R.style.Theme_Tachiyomi_Monet, + AppTheme.CATPPUCCIN to R.style.Theme_Tachiyomi_Catppuccin, AppTheme.GREEN_APPLE to R.style.Theme_Tachiyomi_GreenApple, AppTheme.LAVENDER to R.style.Theme_Tachiyomi_Lavender, AppTheme.MIDNIGHT_DUSK to R.style.Theme_Tachiyomi_MidnightDusk, diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 943fbe406..c865fb4de 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -91,6 +91,45 @@