Преглед изворни кода

Migrate XML themes to Compose (#10152)

Ivan Iskandar пре 1 година
родитељ
комит
255ed50685

+ 0 - 1
app/build.gradle.kts

@@ -165,7 +165,6 @@ dependencies {
     implementation(compose.ui.util)
     implementation(compose.accompanist.webview)
     implementation(compose.accompanist.permissions)
-    implementation(compose.accompanist.themeadapter)
     implementation(compose.accompanist.systemuicontroller)
     lintChecks(compose.lintchecks)
 

+ 45 - 37
app/src/main/java/eu/kanade/presentation/theme/TachiyomiTheme.kt

@@ -1,54 +1,62 @@
 package eu.kanade.presentation.theme
 
-import androidx.appcompat.view.ContextThemeWrapper
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.material3.ColorScheme
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
+import androidx.compose.runtime.ReadOnlyComposable
 import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.platform.LocalLayoutDirection
-import com.google.accompanist.themeadapter.material3.createMdc3Theme
+import eu.kanade.domain.ui.UiPreferences
 import eu.kanade.domain.ui.model.AppTheme
-import eu.kanade.tachiyomi.ui.base.delegate.ThemingDelegate
+import eu.kanade.presentation.theme.colorscheme.GreenAppleColorScheme
+import eu.kanade.presentation.theme.colorscheme.LavenderColorScheme
+import eu.kanade.presentation.theme.colorscheme.MidnightDuskColorScheme
+import eu.kanade.presentation.theme.colorscheme.MonetColorScheme
+import eu.kanade.presentation.theme.colorscheme.StrawberryColorScheme
+import eu.kanade.presentation.theme.colorscheme.TachiyomiColorScheme
+import eu.kanade.presentation.theme.colorscheme.TakoColorScheme
+import eu.kanade.presentation.theme.colorscheme.TealTurqoiseColorScheme
+import eu.kanade.presentation.theme.colorscheme.TidalWaveColorScheme
+import eu.kanade.presentation.theme.colorscheme.YinYangColorScheme
+import eu.kanade.presentation.theme.colorscheme.YotsubaColorScheme
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
 
 @Composable
-fun TachiyomiTheme(content: @Composable () -> Unit) {
-    val context = LocalContext.current
-    val layoutDirection = LocalLayoutDirection.current
-
-    val (colorScheme, typography) = createMdc3Theme(
-        context = context,
-        layoutDirection = layoutDirection,
-    )
-
+fun TachiyomiTheme(
+    appTheme: AppTheme? = null,
+    amoled: Boolean? = null,
+    content: @Composable () -> Unit,
+) {
     MaterialTheme(
-        colorScheme = colorScheme!!,
-        typography = typography!!,
+        colorScheme = getThemeColorScheme(appTheme, amoled),
         content = content,
     )
 }
 
 @Composable
-fun TachiyomiTheme(
-    appTheme: AppTheme,
-    amoled: Boolean,
-    content: @Composable () -> Unit,
-) {
-    val originalContext = LocalContext.current
-    val layoutDirection = LocalLayoutDirection.current
-    val themedContext = remember(appTheme, originalContext) {
-        val themeResIds = ThemingDelegate.getThemeResIds(appTheme, amoled)
-        themeResIds.fold(originalContext) { context, themeResId ->
-            ContextThemeWrapper(context, themeResId)
-        }
+@ReadOnlyComposable
+private fun getThemeColorScheme(
+    appTheme: AppTheme?,
+    amoled: Boolean?,
+): ColorScheme {
+    val uiPreferences = Injekt.get<UiPreferences>()
+    val colorScheme = when (appTheme ?: uiPreferences.appTheme().get()) {
+        AppTheme.DEFAULT -> TachiyomiColorScheme
+        AppTheme.MONET -> MonetColorScheme(LocalContext.current)
+        AppTheme.GREEN_APPLE -> GreenAppleColorScheme
+        AppTheme.LAVENDER -> LavenderColorScheme
+        AppTheme.MIDNIGHT_DUSK -> MidnightDuskColorScheme
+        AppTheme.STRAWBERRY_DAIQUIRI -> StrawberryColorScheme
+        AppTheme.TAKO -> TakoColorScheme
+        AppTheme.TEALTURQUOISE -> TealTurqoiseColorScheme
+        AppTheme.TIDAL_WAVE -> TidalWaveColorScheme
+        AppTheme.YINYANG -> YinYangColorScheme
+        AppTheme.YOTSUBA -> YotsubaColorScheme
+        else -> TachiyomiColorScheme
     }
-    val (colorScheme, typography) = createMdc3Theme(
-        context = themedContext,
-        layoutDirection = layoutDirection,
-    )
-
-    MaterialTheme(
-        colorScheme = colorScheme!!,
-        typography = typography!!,
-        content = content,
+    return colorScheme.getColorScheme(
+        isSystemInDarkTheme(),
+        amoled ?: uiPreferences.themeDarkAmoled().get(),
     )
 }

+ 26 - 0
app/src/main/java/eu/kanade/presentation/theme/colorscheme/BaseColorScheme.kt

@@ -0,0 +1,26 @@
+package eu.kanade.presentation.theme.colorscheme
+
+import androidx.compose.material3.ColorScheme
+import androidx.compose.ui.graphics.Color
+
+internal abstract class BaseColorScheme {
+
+    abstract val darkScheme: ColorScheme
+    abstract val lightScheme: ColorScheme
+
+    fun getColorScheme(isDark: Boolean, isAmoled: Boolean): ColorScheme {
+        return (if (isDark) darkScheme else lightScheme)
+            .let {
+                if (isDark && isAmoled) {
+                    it.copy(
+                        background = Color.Black,
+                        onBackground = Color.White,
+                        surface = Color.Black,
+                        onSurface = Color.White,
+                    )
+                } else {
+                    it
+                }
+            }
+    }
+}

+ 71 - 0
app/src/main/java/eu/kanade/presentation/theme/colorscheme/GreenAppleColorScheme.kt

@@ -0,0 +1,71 @@
+package eu.kanade.presentation.theme.colorscheme
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+/**
+ * Colors for Green Apple theme
+ * Original color scheme by CarlosEsco, Jays2Kings and CrepeTF
+ * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web)
+ *
+ * Key colors:
+ * Primary #188140
+ * Secondary #188140
+ * Tertiary #D33131
+ * Neutral #5D5F5B
+ */
+internal object GreenAppleColorScheme : BaseColorScheme() {
+
+    override val darkScheme = darkColorScheme(
+        primary = Color(0xFF7ADB8F),
+        onPrimary = Color(0xFF003915),
+        primaryContainer = Color(0xFF005322),
+        onPrimaryContainer = Color(0xFF96F8A9),
+        inversePrimary = Color(0xFF006D2F),
+        secondary = Color(0xFF7ADB8F),
+        onSecondary = Color(0xFF003915),
+        secondaryContainer = Color(0xFF005322),
+        onSecondaryContainer = Color(0xFF96F8A9),
+        tertiary = Color(0xFFFFB3AA),
+        onTertiary = Color(0xFF680006),
+        tertiaryContainer = Color(0xFF93000D),
+        onTertiaryContainer = Color(0xFFFFDAD5),
+        background = Color(0xFF1A1C19),
+        onBackground = Color(0xFFE1E3DD),
+        surface = Color(0xFF1A1C19),
+        onSurface = Color(0xFFE1E3DD),
+        surfaceVariant = Color(0xFF414941),
+        onSurfaceVariant = Color(0xFFC1C8BE),
+        surfaceTint = Color(0xFF7ADB8F),
+        inverseSurface = Color(0xFFE1E3DD),
+        inverseOnSurface = Color(0xFF1A1C19),
+        outline = Color(0xFF8B9389),
+    )
+
+    override val lightScheme = lightColorScheme(
+        primary = Color(0xFF006D2F),
+        onPrimary = Color(0xFFFFFFFF),
+        primaryContainer = Color(0xFF96F8A9),
+        onPrimaryContainer = Color(0xFF002109),
+        inversePrimary = Color(0xFF7ADB8F),
+        secondary = Color(0xFF006D2F),
+        onSecondary = Color(0xFFFFFFFF),
+        secondaryContainer = Color(0xFF96F8A9),
+        onSecondaryContainer = Color(0xFF002109),
+        tertiary = Color(0xFFB91D22),
+        onTertiary = Color(0xFFFFFFFF),
+        tertiaryContainer = Color(0xFFFFDAD5),
+        onTertiaryContainer = Color(0xFF410003),
+        background = Color(0xFFFBFDF7),
+        onBackground = Color(0xFF1A1C19),
+        surface = Color(0xFFFBFDF7),
+        onSurface = Color(0xFF1A1C19),
+        surfaceVariant = Color(0xFFDDE5DA),
+        onSurfaceVariant = Color(0xFF414941),
+        surfaceTint = Color(0xFF006D2F),
+        inverseSurface = Color(0xFF2F312E),
+        inverseOnSurface = Color(0xFFF0F2EC),
+        outline = Color(0xFF717970),
+    )
+}

+ 70 - 0
app/src/main/java/eu/kanade/presentation/theme/colorscheme/LavenderColorScheme.kt

@@ -0,0 +1,70 @@
+package eu.kanade.presentation.theme.colorscheme
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+/**
+ * Colors for Lavender theme
+ * Color scheme by Osyx
+ *
+ * Key colors:
+ * Primary #A177FF
+ * Secondary #A177FF
+ * Tertiary #5E25E1
+ * Neutral #111129
+ */
+internal object LavenderColorScheme : BaseColorScheme() {
+
+    override val darkScheme = darkColorScheme(
+        primary = Color(0xFFA177FF),
+        onPrimary = Color(0xFF111129),
+        primaryContainer = Color(0xFFA177FF),
+        onPrimaryContainer = Color(0xFF111129),
+        inversePrimary = Color(0xFF006D2F),
+        secondary = Color(0xFFA177FF),
+        onSecondary = Color(0xFF111129),
+        secondaryContainer = Color(0xFFA177FF),
+        onSecondaryContainer = Color(0xFF111129),
+        tertiary = Color(0xFF5E25E1),
+        onTertiary = Color(0xFFE8E8E8),
+        tertiaryContainer = Color(0xFF111129),
+        onTertiaryContainer = Color(0xFFDEE8FF),
+        background = Color(0xFF111129),
+        onBackground = Color(0xFFDEE8FF),
+        surface = Color(0xFF111129),
+        onSurface = Color(0xFFDEE8FF),
+        surfaceVariant = Color(0x2CB6B6B6),
+        onSurfaceVariant = Color(0xFFE8E8E8),
+        surfaceTint = Color(0xFFA177FF),
+        inverseSurface = Color(0xFF221247),
+        inverseOnSurface = Color(0xFFDEE8FF),
+        outline = Color(0xA8905FFF),
+    )
+
+    override val lightScheme = lightColorScheme(
+        primary = Color(0xFF7B46AF),
+        onPrimary = Color(0xFFEDE2FF),
+        primaryContainer = Color(0xFF7B46AF),
+        onPrimaryContainer = Color(0xFFEDE2FF),
+        inversePrimary = Color(0xFFD6BAFF),
+        secondary = Color(0xFF7B46AF),
+        onSecondary = Color(0xFFEDE2FF),
+        secondaryContainer = Color(0xFF7B46AF),
+        onSecondaryContainer = Color(0xFFEDE2FF),
+        tertiary = Color(0xFFEDE2FF),
+        onTertiary = Color(0xFF7B46AF),
+        tertiaryContainer = Color(0xFFEDE2FF),
+        onTertiaryContainer = Color(0xFF7B46AF),
+        background = Color(0xFFEDE2FF),
+        onBackground = Color(0xFF1B1B22),
+        surface = Color(0xFFEDE2FF),
+        onSurface = Color(0xFF1B1B22),
+        surfaceVariant = Color(0xFFB9B0CC),
+        onSurfaceVariant = Color(0xD849454E),
+        surfaceTint = Color(0xFF7B46AF),
+        inverseSurface = Color(0xFF313033),
+        inverseOnSurface = Color(0xFFF3EFF4),
+        outline = Color(0xFF7B46AF),
+    )
+}

+ 71 - 0
app/src/main/java/eu/kanade/presentation/theme/colorscheme/MidnightDuskColorScheme.kt

@@ -0,0 +1,71 @@
+package eu.kanade.presentation.theme.colorscheme
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+/**
+ * Colors for Midnight Dusk theme
+ * Original color scheme by CrepeTF
+ * M3 color scheme generated by Material Theme Builder (https://goo.gle/material-theme-builder-web)
+ *
+ * Key colors:
+ * Primary #F02475
+ * Secondary #F02475
+ * Tertiary #7A5733
+ * Neutral #16151D
+ */
+internal object MidnightDuskColorScheme : BaseColorScheme() {
+
+    override val darkScheme = darkColorScheme(
+        primary = Color(0xFFF02475),
+        onPrimary = Color(0xFFFFFFFF),
+        primaryContainer = Color(0xFFBD1C5C),
+        onPrimaryContainer = Color(0xFFFFFFFF),
+        inversePrimary = Color(0xFFF02475),
+        secondary = Color(0xFFF02475),
+        onSecondary = Color(0xFFFFFFFF),
+        secondaryContainer = Color(0xFFF02475),
+        onSecondaryContainer = Color(0xFFFFFFFF),
+        tertiary = Color(0xFF55971C),
+        onTertiary = Color(0xFFFFFFFF),
+        tertiaryContainer = Color(0xFF386412),
+        onTertiaryContainer = Color(0xFFE5E1E5),
+        background = Color(0xFF16151D),
+        onBackground = Color(0xFFE5E1E5),
+        surface = Color(0xFF16151D),
+        onSurface = Color(0xFFE5E1E5),
+        surfaceVariant = Color(0xFF524346),
+        onSurfaceVariant = Color(0xFFD6C1C4),
+        surfaceTint = Color(0xFFF02475),
+        inverseSurface = Color(0xFF333043),
+        inverseOnSurface = Color(0xFFFFFFFF),
+        outline = Color(0xFF9F8C8F),
+    )
+
+    override val lightScheme = lightColorScheme(
+        primary = Color(0xFFBB0054),
+        onPrimary = Color(0xFFFFFFFF),
+        primaryContainer = Color(0xFFFFD9E1),
+        onPrimaryContainer = Color(0xFF3F0017),
+        inversePrimary = Color(0xFFFFB1C4),
+        secondary = Color(0xFFBB0054),
+        onSecondary = Color(0xFFFFFFFF),
+        secondaryContainer = Color(0xFFFFD9E1),
+        onSecondaryContainer = Color(0xFF3F0017),
+        tertiary = Color(0xFF006638),
+        onTertiary = Color(0xFFFFFFFF),
+        tertiaryContainer = Color(0xFF00894b),
+        onTertiaryContainer = Color(0xFF2D1600),
+        background = Color(0xFFFFFBFF),
+        onBackground = Color(0xFF1C1B1F),
+        surface = Color(0xFFFFFBFF),
+        onSurface = Color(0xFF1C1B1F),
+        surfaceVariant = Color(0xFFF3DDE0),
+        onSurfaceVariant = Color(0xFF524346),
+        surfaceTint = Color(0xFFBB0054),
+        inverseSurface = Color(0xFF313033),
+        inverseOnSurface = Color(0xFFF4F0F4),
+        outline = Color(0xFF847376),
+    )
+}

+ 125 - 0
app/src/main/java/eu/kanade/presentation/theme/colorscheme/MonetColorScheme.kt

@@ -0,0 +1,125 @@
+package eu.kanade.presentation.theme.colorscheme
+
+import android.annotation.SuppressLint
+import android.app.UiModeManager
+import android.app.WallpaperManager
+import android.content.Context
+import android.graphics.Bitmap
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.compose.material3.ColorScheme
+import androidx.compose.material3.dynamicDarkColorScheme
+import androidx.compose.material3.dynamicLightColorScheme
+import androidx.compose.ui.graphics.Color
+import androidx.core.content.getSystemService
+import com.google.android.material.color.utilities.Hct
+import com.google.android.material.color.utilities.MaterialDynamicColors
+import com.google.android.material.color.utilities.QuantizerCelebi
+import com.google.android.material.color.utilities.SchemeContent
+import com.google.android.material.color.utilities.Score
+
+internal class MonetColorScheme(context: Context) : BaseColorScheme() {
+
+    private val monet = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+        MonetSystemColorScheme(context)
+    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
+        val seed = WallpaperManager.getInstance(context)
+            .getWallpaperColors(WallpaperManager.FLAG_SYSTEM)
+            ?.primaryColor
+            ?.toArgb()
+        if (seed != null) {
+            MonetCompatColorScheme(context, seed)
+        } else {
+            TachiyomiColorScheme
+        }
+    } else {
+        TachiyomiColorScheme
+    }
+
+    override val darkScheme
+        get() = monet.darkScheme
+
+    override val lightScheme
+        get() = monet.lightScheme
+
+    companion object {
+        @Suppress("Unused")
+        @SuppressLint("RestrictedApi")
+        fun extractSeedColorFromImage(bitmap: Bitmap): Int? {
+            val width = bitmap.width
+            val height = bitmap.height
+            val bitmapPixels = IntArray(width * height)
+            bitmap.getPixels(bitmapPixels, 0, width, 0, 0, width, height)
+            return Score.score(QuantizerCelebi.quantize(bitmapPixels, 128), 1, 0)[0]
+                .takeIf { it != 0 } // Don't take fallback color
+        }
+    }
+}
+
+@RequiresApi(Build.VERSION_CODES.S)
+private class MonetSystemColorScheme(context: Context) : BaseColorScheme() {
+    override val lightScheme = dynamicLightColorScheme(context)
+    override val darkScheme = dynamicDarkColorScheme(context)
+}
+
+private class MonetCompatColorScheme(context: Context, seed: Int) : BaseColorScheme() {
+
+    override val lightScheme = generateColorSchemeFromSeed(context = context, seed = seed, dark = false)
+    override val darkScheme = generateColorSchemeFromSeed(context = context, seed = seed, dark = true)
+
+    companion object {
+        private fun Int.toComposeColor(): Color = Color(this)
+
+        @SuppressLint("PrivateResource", "RestrictedApi")
+        private fun generateColorSchemeFromSeed(context: Context, seed: Int, dark: Boolean): ColorScheme {
+            val scheme = SchemeContent(
+                Hct.fromInt(seed),
+                dark,
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+                    context.getSystemService<UiModeManager>()?.contrast?.toDouble() ?: 0.0
+                } else {
+                    0.0
+                },
+            )
+            val dynamicColors = MaterialDynamicColors()
+            return ColorScheme(
+                primary = dynamicColors.primary().getArgb(scheme).toComposeColor(),
+                onPrimary = dynamicColors.onPrimary().getArgb(scheme).toComposeColor(),
+                primaryContainer = dynamicColors.primaryContainer().getArgb(scheme).toComposeColor(),
+                onPrimaryContainer = dynamicColors.onPrimaryContainer().getArgb(scheme).toComposeColor(),
+                inversePrimary = dynamicColors.inversePrimary().getArgb(scheme).toComposeColor(),
+                secondary = dynamicColors.secondary().getArgb(scheme).toComposeColor(),
+                onSecondary = dynamicColors.onSecondary().getArgb(scheme).toComposeColor(),
+                secondaryContainer = dynamicColors.secondaryContainer().getArgb(scheme).toComposeColor(),
+                onSecondaryContainer = dynamicColors.onSecondaryContainer().getArgb(scheme).toComposeColor(),
+                tertiary = dynamicColors.tertiary().getArgb(scheme).toComposeColor(),
+                onTertiary = dynamicColors.onTertiary().getArgb(scheme).toComposeColor(),
+                tertiaryContainer = dynamicColors.tertiary().getArgb(scheme).toComposeColor(),
+                onTertiaryContainer = dynamicColors.onTertiaryContainer().getArgb(scheme).toComposeColor(),
+                background = dynamicColors.background().getArgb(scheme).toComposeColor(),
+                onBackground = dynamicColors.onBackground().getArgb(scheme).toComposeColor(),
+                surface = dynamicColors.surface().getArgb(scheme).toComposeColor(),
+                onSurface = dynamicColors.onSurface().getArgb(scheme).toComposeColor(),
+                surfaceVariant = dynamicColors.surfaceVariant().getArgb(scheme).toComposeColor(),
+                onSurfaceVariant = dynamicColors.onSurfaceVariant().getArgb(scheme).toComposeColor(),
+                surfaceTint = dynamicColors.surfaceTint().getArgb(scheme).toComposeColor(),
+                inverseSurface = dynamicColors.inverseSurface().getArgb(scheme).toComposeColor(),
+                inverseOnSurface = dynamicColors.inverseOnSurface().getArgb(scheme).toComposeColor(),
+                error = dynamicColors.error().getArgb(scheme).toComposeColor(),
+                onError = dynamicColors.onError().getArgb(scheme).toComposeColor(),
+                errorContainer = dynamicColors.errorContainer().getArgb(scheme).toComposeColor(),
+                onErrorContainer = dynamicColors.onErrorContainer().getArgb(scheme).toComposeColor(),
+                outline = dynamicColors.outline().getArgb(scheme).toComposeColor(),
+                outlineVariant = dynamicColors.outlineVariant().getArgb(scheme).toComposeColor(),
+                scrim = Color.Black,
+                surfaceBright = dynamicColors.surfaceBright().getArgb(scheme).toComposeColor(),
+                surfaceDim = dynamicColors.surfaceDim().getArgb(scheme).toComposeColor(),
+                surfaceContainer = dynamicColors.surfaceContainer().getArgb(scheme).toComposeColor(),
+                surfaceContainerHigh = dynamicColors.surfaceContainerHigh().getArgb(scheme).toComposeColor(),
+                surfaceContainerHighest = dynamicColors.surfaceContainerHighest().getArgb(scheme).toComposeColor(),
+                surfaceContainerLow = dynamicColors.surfaceContainerLow().getArgb(scheme).toComposeColor(),
+                surfaceContainerLowest = dynamicColors.surfaceContainerLowest().getArgb(scheme).toComposeColor(),
+            )
+        }
+    }
+}

+ 71 - 0
app/src/main/java/eu/kanade/presentation/theme/colorscheme/StrawberryColorScheme.kt

@@ -0,0 +1,71 @@
+package eu.kanade.presentation.theme.colorscheme
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+/**
+ * Colors for Strawberry Daiquiri theme
+ * Original color scheme by Soitora
+ * M3 color scheme generated by Material Theme Builder (https://goo.gle/material-theme-builder-web)
+ *
+ * Key colors:
+ * Primary #ED4A65
+ * Secondary #ED4A65
+ * Tertiary #775930
+ * Neutral #655C5C
+ */
+internal object StrawberryColorScheme : BaseColorScheme() {
+
+    override val darkScheme = darkColorScheme(
+        primary = Color(0xFFFFB2B9),
+        onPrimary = Color(0xFF67001B),
+        primaryContainer = Color(0xFF91002A),
+        onPrimaryContainer = Color(0xFFFFDADD),
+        inversePrimary = Color(0xFFB61E40),
+        secondary = Color(0xFFFFB2B9),
+        onSecondary = Color(0xFF67001B),
+        secondaryContainer = Color(0xFF91002A),
+        onSecondaryContainer = Color(0xFFFFDADD),
+        tertiary = Color(0xFFE8C08E),
+        onTertiary = Color(0xFF432C06),
+        tertiaryContainer = Color(0xFF5D421B),
+        onTertiaryContainer = Color(0xFFFFDDB1),
+        background = Color(0xFF201A1A),
+        onBackground = Color(0xFFECDFDF),
+        surface = Color(0xFF201A1A),
+        onSurface = Color(0xFFECDFDF),
+        surfaceVariant = Color(0xFF534344),
+        onSurfaceVariant = Color(0xFFD7C1C2),
+        surfaceTint = Color(0xFFFFB2B9),
+        inverseSurface = Color(0xFFECDFDF),
+        inverseOnSurface = Color(0xFF201A1A),
+        outline = Color(0xFFA08C8D),
+    )
+
+    override val lightScheme = lightColorScheme(
+        primary = Color(0xFFB61E40),
+        onPrimary = Color(0xFFFFFFFF),
+        primaryContainer = Color(0xFFFFDADD),
+        onPrimaryContainer = Color(0xFF40000D),
+        inversePrimary = Color(0xFFFFB2B9),
+        secondary = Color(0xFFB61E40),
+        onSecondary = Color(0xFFFFFFFF),
+        secondaryContainer = Color(0xFFFFDADD),
+        onSecondaryContainer = Color(0xFF40000D),
+        tertiary = Color(0xFF775930),
+        onTertiary = Color(0xFFFFFFFF),
+        tertiaryContainer = Color(0xFFFFDDB1),
+        onTertiaryContainer = Color(0xFF2A1800),
+        background = Color(0xFFFCFCFC),
+        onBackground = Color(0xFF201A1A),
+        surface = Color(0xFFFCFCFC),
+        onSurface = Color(0xFF201A1A),
+        surfaceVariant = Color(0xFFF4DDDD),
+        onSurfaceVariant = Color(0xFF534344),
+        surfaceTint = Color(0xFFB61E40),
+        inverseSurface = Color(0xFF362F2F),
+        inverseOnSurface = Color(0xFFFBEDED),
+        outline = Color(0xFF857374),
+    )
+}

+ 80 - 0
app/src/main/java/eu/kanade/presentation/theme/colorscheme/TachiyomiColorScheme.kt

@@ -0,0 +1,80 @@
+package eu.kanade.presentation.theme.colorscheme
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+/**
+ * Colors for Default theme
+ * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web)
+ *
+ * Key colors:
+ * Primary #2979FF
+ * Secondary #2979FF
+ * Tertiary #47A84A
+ * Neutral #919094
+ */
+internal object TachiyomiColorScheme : BaseColorScheme() {
+
+    override val darkScheme = darkColorScheme(
+        primary = Color(0xFFB0C6FF),
+        onPrimary = Color(0xFF002D6E),
+        primaryContainer = Color(0xFF00429B),
+        onPrimaryContainer = Color(0xFFD9E2FF),
+        inversePrimary = Color(0xFF0058CA),
+        secondary = Color(0xFFB0C6FF),
+        onSecondary = Color(0xFF002D6E),
+        secondaryContainer = Color(0xFF00429B),
+        onSecondaryContainer = Color(0xFFD9E2FF),
+        tertiary = Color(0xFF7ADC77),
+        onTertiary = Color(0xFF003909),
+        tertiaryContainer = Color(0xFF005312),
+        onTertiaryContainer = Color(0xFF95F990),
+        background = Color(0xFF1B1B1F),
+        onBackground = Color(0xFFE3E2E6),
+        surface = Color(0xFF1B1B1F),
+        onSurface = Color(0xFFE3E2E6),
+        surfaceVariant = Color(0xFF44464F),
+        onSurfaceVariant = Color(0xFFC5C6D0),
+        surfaceTint = Color(0xFFB0C6FF),
+        inverseSurface = Color(0xFFE3E2E6),
+        inverseOnSurface = Color(0xFF1B1B1F),
+        error = Color(0xFFFFB4AB),
+        onError = Color(0xFF690005),
+        errorContainer = Color(0xFF93000A),
+        onErrorContainer = Color(0xFFFFDAD6),
+        outline = Color(0xFF8F9099),
+        outlineVariant = Color(0xFF44464F),
+    )
+
+    override val lightScheme = lightColorScheme(
+        primary = Color(0xFF0058CA),
+        onPrimary = Color(0xFFFFFFFF),
+        primaryContainer = Color(0xFFD9E2FF),
+        onPrimaryContainer = Color(0xFF001945),
+        inversePrimary = Color(0xFFB0C6FF),
+        secondary = Color(0xFF0058CA),
+        onSecondary = Color(0xFFFFFFFF),
+        secondaryContainer = Color(0xFFD9E2FF),
+        onSecondaryContainer = Color(0xFF001945),
+        tertiary = Color(0xFF006E1B),
+        onTertiary = Color(0xFFFFFFFF),
+        tertiaryContainer = Color(0xFF95F990),
+        onTertiaryContainer = Color(0xFF002203),
+        background = Color(0xFFFEFBFF),
+        onBackground = Color(0xFF1B1B1F),
+        surface = Color(0xFFFEFBFF),
+        onSurface = Color(0xFF1B1B1F),
+        surfaceVariant = Color(0xFFE1E2EC),
+        onSurfaceVariant = Color(0xFF44464F),
+        surfaceTint = Color(0xFF0058CA),
+        inverseSurface = Color(0xFF303034),
+        inverseOnSurface = Color(0xFFF2F0F4),
+        error = Color(0xFFBA1A1A),
+        onError = Color(0xFFFFFFFF),
+        errorContainer = Color(0xFFFFDAD6),
+        onErrorContainer = Color(0xFF410002),
+        outline = Color(0xFF757780),
+        outlineVariant = Color(0xFFC5C6D0),
+    )
+}

+ 71 - 0
app/src/main/java/eu/kanade/presentation/theme/colorscheme/TakoColorScheme.kt

@@ -0,0 +1,71 @@
+package eu.kanade.presentation.theme.colorscheme
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+/**
+ * Colors for Tako theme
+ * Original color scheme by ghostbear
+ * M3 color scheme generated by Material Theme Builder (https://goo.gle/material-theme-builder-web)
+ *
+ * Key colors:
+ * Primary #F3B375
+ * Secondary #F3B375
+ * Tertiary #66577E
+ * Neutral #21212E
+ */
+internal object TakoColorScheme : BaseColorScheme() {
+
+    override val darkScheme = darkColorScheme(
+        primary = Color(0xFFF3B375),
+        onPrimary = Color(0xFF38294E),
+        primaryContainer = Color(0xFFF3B375),
+        onPrimaryContainer = Color(0xFF38294E),
+        inversePrimary = Color(0xFF84531E),
+        secondary = Color(0xFFF3B375),
+        onSecondary = Color(0xFF38294E),
+        secondaryContainer = Color(0xFFF3B375),
+        onSecondaryContainer = Color(0xFF38294E),
+        tertiary = Color(0xFF66577E),
+        onTertiary = Color(0xFFF3B375),
+        tertiaryContainer = Color(0xFF4E4065),
+        onTertiaryContainer = Color(0xFFEDDCFF),
+        background = Color(0xFF21212E),
+        onBackground = Color(0xFFE3E0F2),
+        surface = Color(0xFF21212E),
+        onSurface = Color(0xFFE3E0F2),
+        surfaceVariant = Color(0xFF49454E),
+        onSurfaceVariant = Color(0xFFCBC4CE),
+        surfaceTint = Color(0xFF66577E),
+        inverseSurface = Color(0xFFE5E1E6),
+        inverseOnSurface = Color(0xFF1B1B1E),
+        outline = Color(0xFF958F99),
+    )
+
+    override val lightScheme = lightColorScheme(
+        primary = Color(0xFF66577E),
+        onPrimary = Color(0xFFF3B375),
+        primaryContainer = Color(0xFF66577E),
+        onPrimaryContainer = Color(0xFFF3B375),
+        inversePrimary = Color(0xFFD6BAFF),
+        secondary = Color(0xFF66577E),
+        onSecondary = Color(0xFFF3B375),
+        secondaryContainer = Color(0xFF66577E),
+        onSecondaryContainer = Color(0xFFF3B375),
+        tertiary = Color(0xFFF3B375),
+        onTertiary = Color(0xFF574360),
+        tertiaryContainer = Color(0xFFFDD6B0),
+        onTertiaryContainer = Color(0xFF221437),
+        background = Color(0xFFF7F5FF),
+        onBackground = Color(0xFF1B1B22),
+        surface = Color(0xFFF7F5FF),
+        onSurface = Color(0xFF1B1B22),
+        surfaceVariant = Color(0xFFE8E0EB),
+        onSurfaceVariant = Color(0xFF49454E),
+        surfaceTint = Color(0xFF66577E),
+        inverseSurface = Color(0xFF313033),
+        inverseOnSurface = Color(0xFFF3EFF4),
+        outline = Color(0xFF7A757E),
+    )
+}

+ 63 - 0
app/src/main/java/eu/kanade/presentation/theme/colorscheme/TealTurqoiseColorScheme.kt

@@ -0,0 +1,63 @@
+package eu.kanade.presentation.theme.colorscheme
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+/**
+ * Colors for Teal Turqoise theme
+ */
+internal object TealTurqoiseColorScheme : BaseColorScheme() {
+
+    override val darkScheme = darkColorScheme(
+        primary = Color(0xFF40E0D0),
+        onPrimary = Color(0xFF000000),
+        primaryContainer = Color(0xFF40E0D0),
+        onPrimaryContainer = Color(0xFF000000),
+        inversePrimary = Color(0xFF008080),
+        secondary = Color(0xFF40E0D0),
+        onSecondary = Color(0xFF000000),
+        secondaryContainer = Color(0xFF18544E),
+        onSecondaryContainer = Color(0xFF40E0D0),
+        tertiary = Color(0xFFBF1F2F),
+        onTertiary = Color(0xFFFFFFFF),
+        tertiaryContainer = Color(0xFF200508),
+        onTertiaryContainer = Color(0xFFBF1F2F),
+        background = Color(0xFF202125),
+        onBackground = Color(0xFFDFDEDA),
+        surface = Color(0xFF202125),
+        onSurface = Color(0xFFDFDEDA),
+        surfaceVariant = Color(0xFF3F4947),
+        onSurfaceVariant = Color(0xFFDFDEDA),
+        surfaceTint = Color(0xFF40E0D0),
+        inverseSurface = Color(0xFFDFDEDA),
+        inverseOnSurface = Color(0xFF202125),
+        outline = Color(0xFF899391),
+    )
+
+    override val lightScheme = lightColorScheme(
+        primary = Color(0xFF008080),
+        onPrimary = Color(0xFFFFFFFF),
+        primaryContainer = Color(0xFF008080),
+        onPrimaryContainer = Color(0xFFFFFFFF),
+        inversePrimary = Color(0xFF40E0D0),
+        secondary = Color(0xFF008080),
+        onSecondary = Color(0xFFFFFFFF),
+        secondaryContainer = Color(0xFFBFDFDF),
+        onSecondaryContainer = Color(0xFF008080),
+        tertiary = Color(0xFFFF7F7F),
+        onTertiary = Color(0xFF000000),
+        tertiaryContainer = Color(0xFF2A1616),
+        onTertiaryContainer = Color(0xFFFF7F7F),
+        background = Color(0xFFFAFAFA),
+        onBackground = Color(0xFF050505),
+        surface = Color(0xFFFAFAFA),
+        onSurface = Color(0xFF050505),
+        surfaceVariant = Color(0xFFDAE5E2),
+        onSurfaceVariant = Color(0xFF050505),
+        surfaceTint = Color(0xFFBFDFDF),
+        inverseSurface = Color(0xFF050505),
+        inverseOnSurface = Color(0xFFFAFAFA),
+        outline = Color(0xFF6F7977),
+    )
+}

+ 70 - 0
app/src/main/java/eu/kanade/presentation/theme/colorscheme/TidalWaveColorScheme.kt

@@ -0,0 +1,70 @@
+package eu.kanade.presentation.theme.colorscheme
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+/**
+ * Colors for Tidal Wave theme
+ * Original color scheme by NahutabDevelop
+ *
+ * Key colors:
+ * Primary #004152
+ * Secondary #5ed4fc
+ * Tertiary #92f7bc
+ * Neutral #16151D
+ */
+internal object TidalWaveColorScheme : BaseColorScheme() {
+
+    override val darkScheme = darkColorScheme(
+        primary = Color(0xFF5ed4fc),
+        onPrimary = Color(0xFF003544),
+        primaryContainer = Color(0xFF004d61),
+        onPrimaryContainer = Color(0xFFb8eaff),
+        inversePrimary = Color(0xFFa12b03),
+        secondary = Color(0xFF5ed4fc),
+        onSecondary = Color(0xFF003544),
+        secondaryContainer = Color(0xFF004d61),
+        onSecondaryContainer = Color(0xFFb8eaff),
+        tertiary = Color(0xFF92f7bc),
+        onTertiary = Color(0xFF001c3b),
+        tertiaryContainer = Color(0xFFc3fada),
+        onTertiaryContainer = Color(0xFF78ffd6),
+        background = Color(0xFF001c3b),
+        onBackground = Color(0xFFd5e3ff),
+        surface = Color(0xFF001c3b),
+        onSurface = Color(0xFFd5e3ff),
+        surfaceVariant = Color(0xFF40484c),
+        onSurfaceVariant = Color(0xFFbfc8cc),
+        surfaceTint = Color(0xFF5ed4fc),
+        inverseSurface = Color(0xFFffe3c4),
+        inverseOnSurface = Color(0xFF001c3b),
+        outline = Color(0xFF8a9296),
+    )
+
+    override val lightScheme = lightColorScheme(
+        primary = Color(0xFF006780),
+        onPrimary = Color(0xFFffffff),
+        primaryContainer = Color(0xFFB4D4DF),
+        onPrimaryContainer = Color(0xFF001f28),
+        inversePrimary = Color(0xFFff987f),
+        secondary = Color(0xFF006780),
+        onSecondary = Color(0xFFffffff),
+        secondaryContainer = Color(0xFFb8eaff),
+        onSecondaryContainer = Color(0xFF001f28),
+        tertiary = Color(0xFF92f7bc),
+        onTertiary = Color(0xFF001c3b),
+        tertiaryContainer = Color(0xFFc3fada),
+        onTertiaryContainer = Color(0xFF78ffd6),
+        background = Color(0xFFfdfbff),
+        onBackground = Color(0xFF001c3b),
+        surface = Color(0xFFfdfbff),
+        onSurface = Color(0xFF001c3b),
+        surfaceVariant = Color(0xFFdce4e8),
+        onSurfaceVariant = Color(0xFF40484c),
+        surfaceTint = Color(0xFF006780),
+        inverseSurface = Color(0xFF020400),
+        inverseOnSurface = Color(0xFFffe3c4),
+        outline = Color(0xFF70787c),
+    )
+}

+ 65 - 0
app/src/main/java/eu/kanade/presentation/theme/colorscheme/YinYangColorScheme.kt

@@ -0,0 +1,65 @@
+package eu.kanade.presentation.theme.colorscheme
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+/**
+ * Colors for Yin & Yang theme
+ * Original color scheme by Riztard
+ * M3 colors generated by yours truly + tweaked manually
+ */
+internal object YinYangColorScheme : BaseColorScheme() {
+
+    override val darkScheme = darkColorScheme(
+        primary = Color(0xFFFFFFFF),
+        onPrimary = Color(0xFF5A5A5A),
+        primaryContainer = Color(0xFFFFFFFF),
+        onPrimaryContainer = Color(0xFF000000),
+        inversePrimary = Color(0xFFCECECE),
+        secondary = Color(0xFFFFFFFF),
+        onSecondary = Color(0xFF5A5A5A),
+        secondaryContainer = Color(0xFF717171),
+        onSecondaryContainer = Color(0xFFE4E4E4),
+        tertiary = Color(0xFF000000),
+        onTertiary = Color(0xFFFFFFFF),
+        tertiaryContainer = Color(0xFF00419E),
+        onTertiaryContainer = Color(0xFFD8E2FF),
+        background = Color(0xFF1E1E1E),
+        onBackground = Color(0xFFE6E6E6),
+        surface = Color(0xFF1E1E1E),
+        onSurface = Color(0xFFE6E6E6),
+        surfaceVariant = Color(0xFF4E4E4E),
+        onSurfaceVariant = Color(0xFFD1D1D1),
+        surfaceTint = Color(0xFFFFFFFF),
+        inverseSurface = Color(0xFFE6E6E6),
+        inverseOnSurface = Color(0xFF1E1E1E),
+        outline = Color(0xFF999999),
+    )
+
+    override val lightScheme = lightColorScheme(
+        primary = Color(0xFF000000),
+        onPrimary = Color(0xFFFFFFFF),
+        primaryContainer = Color(0xFF000000),
+        onPrimaryContainer = Color(0xFFFFFFFF),
+        inversePrimary = Color(0xFFA6A6A6),
+        secondary = Color(0xFF000000),
+        onSecondary = Color(0xFFFFFFFF),
+        secondaryContainer = Color(0xFFDDDDDD),
+        onSecondaryContainer = Color(0xFF0C0C0C),
+        tertiary = Color(0xFFFFFFFF),
+        onTertiary = Color(0xFF000000),
+        tertiaryContainer = Color(0xFFD8E2FF),
+        onTertiaryContainer = Color(0xFF001947),
+        background = Color(0xFFFDFDFD),
+        onBackground = Color(0xFF222222),
+        surface = Color(0xFFFDFDFD),
+        onSurface = Color(0xFF222222),
+        surfaceVariant = Color(0xFFEDEDED),
+        onSurfaceVariant = Color(0xFF515151),
+        surfaceTint = Color(0xFF000000),
+        inverseSurface = Color(0xFF333333),
+        inverseOnSurface = Color(0xFFF4F4F4),
+        outline = Color(0xFF838383),
+    )
+}

+ 71 - 0
app/src/main/java/eu/kanade/presentation/theme/colorscheme/YotsubaColorScheme.kt

@@ -0,0 +1,71 @@
+package eu.kanade.presentation.theme.colorscheme
+
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.graphics.Color
+
+/**
+ * Colors for Yotsuba theme
+ * Original color scheme by ztimms73
+ * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web)
+ *
+ * Key colors:
+ * Primary 0xFFAE3200
+ * Secondary 0xFFAE3200
+ * Tertiary 0xFF6B5E2F
+ * Neutral 0xFF655C5A
+ */
+internal object YotsubaColorScheme : BaseColorScheme() {
+
+    override val darkScheme = darkColorScheme(
+        primary = Color(0xFFFFB59D),
+        onPrimary = Color(0xFF5F1600),
+        primaryContainer = Color(0xFF862200),
+        onPrimaryContainer = Color(0xFFFFDBCF),
+        inversePrimary = Color(0xFFAE3200),
+        secondary = Color(0xFFFFB59D),
+        onSecondary = Color(0xFF5F1600),
+        secondaryContainer = Color(0xFF862200),
+        onSecondaryContainer = Color(0xFFFFDBCF),
+        tertiary = Color(0xFFD7C68D),
+        onTertiary = Color(0xFF3A2F05),
+        tertiaryContainer = Color(0xFF524619),
+        onTertiaryContainer = Color(0xFFF5E2A7),
+        background = Color(0xFF211A18),
+        onBackground = Color(0xFFEDE0DD),
+        surface = Color(0xFF211A18),
+        onSurface = Color(0xFFEDE0DD),
+        surfaceVariant = Color(0xFF53433F),
+        onSurfaceVariant = Color(0xFFD8C2BC),
+        surfaceTint = Color(0xFFFFB59D),
+        inverseSurface = Color(0xFFEDE0DD),
+        inverseOnSurface = Color(0xFF211A18),
+        outline = Color(0xFFA08C87),
+    )
+
+    override val lightScheme = lightColorScheme(
+        primary = Color(0xFFAE3200),
+        onPrimary = Color(0xFFFFFFFF),
+        primaryContainer = Color(0xFFFFDBCF),
+        onPrimaryContainer = Color(0xFF3B0A00),
+        inversePrimary = Color(0xFFFFB59D),
+        secondary = Color(0xFFAE3200),
+        onSecondary = Color(0xFFFFFFFF),
+        secondaryContainer = Color(0xFFFFDBCF),
+        onSecondaryContainer = Color(0xFF3B0A00),
+        tertiary = Color(0xFF6B5E2F),
+        onTertiary = Color(0xFFFFFFFF),
+        tertiaryContainer = Color(0xFFF5E2A7),
+        onTertiaryContainer = Color(0xFF231B00),
+        background = Color(0xFFFCFCFC),
+        onBackground = Color(0xFF211A18),
+        surface = Color(0xFFFCFCFC),
+        onSurface = Color(0xFF211A18),
+        surfaceVariant = Color(0xFFF5DED8),
+        onSurfaceVariant = Color(0xFF53433F),
+        surfaceTint = Color(0xFFAE3200),
+        inverseSurface = Color(0xFF362F2D),
+        inverseOnSurface = Color(0xFFFBEEEB),
+        outline = Color(0xFF85736E),
+    )
+}

+ 0 - 1
gradle/compose.versions.toml

@@ -23,7 +23,6 @@ glance = "androidx.glance:glance-appwidget:1.0.0"
 
 accompanist-webview = { module = "com.google.accompanist:accompanist-webview", version.ref = "accompanist" }
 accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" }
-accompanist-themeadapter = { module = "com.google.accompanist:accompanist-themeadapter-material3", version.ref = "accompanist" }
 accompanist-systemuicontroller = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "accompanist" }
 
 lintchecks = { module = "com.slack.lint.compose:compose-lint-checks", version = "1.2.0" }