Add Jellyfin blue Material Theme

This commit is contained in:
Pascal Weidenhammer
2024-05-21 14:34:42 +02:00
parent f0cc3d2660
commit 1c16039208
2 changed files with 479 additions and 0 deletions

View File

@@ -0,0 +1,197 @@
package org.jellyfin.androidtv.ui.shared.theme
import androidx.compose.ui.graphics.Color
// seed color: Jellyfin blue #00A4DC
val primaryLight = Color(0xFF1C6585)
val onPrimaryLight = Color(0xFFFFFFFF)
val primaryContainerLight = Color(0xFFC3E7FF)
val onPrimaryContainerLight = Color(0xFF001E2C)
val secondaryLight = Color(0xFF4E616D)
val onSecondaryLight = Color(0xFFFFFFFF)
val secondaryContainerLight = Color(0xFFD1E5F4)
val onSecondaryContainerLight = Color(0xFF0A1E28)
val tertiaryLight = Color(0xFF605A7D)
val onTertiaryLight = Color(0xFFFFFFFF)
val tertiaryContainerLight = Color(0xFFE6DEFF)
val onTertiaryContainerLight = Color(0xFF1D1736)
val errorLight = Color(0xFFBA1A1A)
val onErrorLight = Color(0xFFFFFFFF)
val errorContainerLight = Color(0xFFFFDAD6)
val onErrorContainerLight = Color(0xFF410002)
val backgroundLight = Color(0xFFF6FAFE)
val onBackgroundLight = Color(0xFF181C1F)
val surfaceLight = Color(0xFFF6FAFE)
val onSurfaceLight = Color(0xFF181C1F)
val surfaceVariantLight = Color(0xFFDCE3E9)
val onSurfaceVariantLight = Color(0xFF41484D)
val scrimLight = Color(0xFF000000)
val inverseSurfaceLight = Color(0xFF2C3134)
val inverseOnSurfaceLight = Color(0xFFEDF1F5)
val inversePrimaryLight = Color(0xFF8FCEF3)
val primaryLightMediumContrast = Color(0xFF004863)
val onPrimaryLightMediumContrast = Color(0xFFFFFFFF)
val primaryContainerLightMediumContrast = Color(0xFF397B9D)
val onPrimaryContainerLightMediumContrast = Color(0xFFFFFFFF)
val secondaryLightMediumContrast = Color(0xFF334551)
val onSecondaryLightMediumContrast = Color(0xFFFFFFFF)
val secondaryContainerLightMediumContrast = Color(0xFF647784)
val onSecondaryContainerLightMediumContrast = Color(0xFFFFFFFF)
val tertiaryLightMediumContrast = Color(0xFF443E5F)
val onTertiaryLightMediumContrast = Color(0xFFFFFFFF)
val tertiaryContainerLightMediumContrast = Color(0xFF777094)
val onTertiaryContainerLightMediumContrast = Color(0xFFFFFFFF)
val errorLightMediumContrast = Color(0xFF8C0009)
val onErrorLightMediumContrast = Color(0xFFFFFFFF)
val errorContainerLightMediumContrast = Color(0xFFDA342E)
val onErrorContainerLightMediumContrast = Color(0xFFFFFFFF)
val backgroundLightMediumContrast = Color(0xFFF6FAFE)
val onBackgroundLightMediumContrast = Color(0xFF181C1F)
val surfaceLightMediumContrast = Color(0xFFF6FAFE)
val onSurfaceLightMediumContrast = Color(0xFF181C1F)
val surfaceVariantLightMediumContrast = Color(0xFFDCE3E9)
val onSurfaceVariantLightMediumContrast = Color(0xFF3D4449)
val scrimLightMediumContrast = Color(0xFF000000)
val inverseSurfaceLightMediumContrast = Color(0xFF2C3134)
val inverseOnSurfaceLightMediumContrast = Color(0xFFEDF1F5)
val inversePrimaryLightMediumContrast = Color(0xFF8FCEF3)
val primaryLightHighContrast = Color(0xFF002535)
val onPrimaryLightHighContrast = Color(0xFFFFFFFF)
val primaryContainerLightHighContrast = Color(0xFF004863)
val onPrimaryContainerLightHighContrast = Color(0xFFFFFFFF)
val secondaryLightHighContrast = Color(0xFF11242F)
val onSecondaryLightHighContrast = Color(0xFFFFFFFF)
val secondaryContainerLightHighContrast = Color(0xFF334551)
val onSecondaryContainerLightHighContrast = Color(0xFFFFFFFF)
val tertiaryLightHighContrast = Color(0xFF231E3D)
val onTertiaryLightHighContrast = Color(0xFFFFFFFF)
val tertiaryContainerLightHighContrast = Color(0xFF443E5F)
val onTertiaryContainerLightHighContrast = Color(0xFFFFFFFF)
val errorLightHighContrast = Color(0xFF4E0002)
val onErrorLightHighContrast = Color(0xFFFFFFFF)
val errorContainerLightHighContrast = Color(0xFF8C0009)
val onErrorContainerLightHighContrast = Color(0xFFFFFFFF)
val backgroundLightHighContrast = Color(0xFFF6FAFE)
val onBackgroundLightHighContrast = Color(0xFF181C1F)
val surfaceLightHighContrast = Color(0xFFF6FAFE)
val onSurfaceLightHighContrast = Color(0xFF000000)
val surfaceVariantLightHighContrast = Color(0xFFDCE3E9)
val onSurfaceVariantLightHighContrast = Color(0xFF1E2529)
val scrimLightHighContrast = Color(0xFF000000)
val inverseSurfaceLightHighContrast = Color(0xFF2C3134)
val inverseOnSurfaceLightHighContrast = Color(0xFFFFFFFF)
val inversePrimaryLightHighContrast = Color(0xFFD9EFFF)
val primaryDark = Color(0xFF8FCEF3)
val onPrimaryDark = Color(0xFF003549)
val primaryContainerDark = Color(0xFF004C69)
val onPrimaryContainerDark = Color(0xFFC3E7FF)
val secondaryDark = Color(0xFFB5C9D7)
val onSecondaryDark = Color(0xFF20333E)
val secondaryContainerDark = Color(0xFF364955)
val onSecondaryContainerDark = Color(0xFFD1E5F4)
val tertiaryDark = Color(0xFFCAC1EA)
val onTertiaryDark = Color(0xFF322C4C)
val tertiaryContainerDark = Color(0xFF484264)
val onTertiaryContainerDark = Color(0xFFE6DEFF)
val errorDark = Color(0xFFFFB4AB)
val onErrorDark = Color(0xFF690005)
val errorContainerDark = Color(0xFF93000A)
val onErrorContainerDark = Color(0xFFFFDAD6)
val backgroundDark = Color(0xFF0F1417)
val onBackgroundDark = Color(0xFFDFE3E7)
val surfaceDark = Color(0xFF0F1417)
val onSurfaceDark = Color(0xFFDFE3E7)
val surfaceVariantDark = Color(0xFF41484D)
val onSurfaceVariantDark = Color(0xFFC0C7CD)
val scrimDark = Color(0xFF000000)
val inverseSurfaceDark = Color(0xFFDFE3E7)
val inverseOnSurfaceDark = Color(0xFF2C3134)
val inversePrimaryDark = Color(0xFF1C6585)
val primaryDarkMediumContrast = Color(0xFF94D3F8)
val onPrimaryDarkMediumContrast = Color(0xFF001925)
val primaryContainerDarkMediumContrast = Color(0xFF5898BB)
val onPrimaryContainerDarkMediumContrast = Color(0xFF000000)
val secondaryDarkMediumContrast = Color(0xFFBACEDC)
val onSecondaryDarkMediumContrast = Color(0xFF041822)
val secondaryContainerDarkMediumContrast = Color(0xFF8093A0)
val onSecondaryContainerDarkMediumContrast = Color(0xFF000000)
val tertiaryDarkMediumContrast = Color(0xFFCEC5EE)
val onTertiaryDarkMediumContrast = Color(0xFF171130)
val tertiaryContainerDarkMediumContrast = Color(0xFF938CB1)
val onTertiaryContainerDarkMediumContrast = Color(0xFF000000)
val errorDarkMediumContrast = Color(0xFFFFBAB1)
val onErrorDarkMediumContrast = Color(0xFF370001)
val errorContainerDarkMediumContrast = Color(0xFFFF5449)
val onErrorContainerDarkMediumContrast = Color(0xFF000000)
val backgroundDarkMediumContrast = Color(0xFF0F1417)
val onBackgroundDarkMediumContrast = Color(0xFFDFE3E7)
val surfaceDarkMediumContrast = Color(0xFF0F1417)
val onSurfaceDarkMediumContrast = Color(0xFFF8FBFF)
val surfaceVariantDarkMediumContrast = Color(0xFF41484D)
val onSurfaceVariantDarkMediumContrast = Color(0xFFC5CCD2)
val scrimDarkMediumContrast = Color(0xFF000000)
val inverseSurfaceDarkMediumContrast = Color(0xFFDFE3E7)
val inverseOnSurfaceDarkMediumContrast = Color(0xFF262B2E)
val inversePrimaryDarkMediumContrast = Color(0xFF004E6A)
val primaryDarkHighContrast = Color(0xFFF8FBFF)
val onPrimaryDarkHighContrast = Color(0xFF000000)
val primaryContainerDarkHighContrast = Color(0xFF94D3F8)
val onPrimaryContainerDarkHighContrast = Color(0xFF000000)
val secondaryDarkHighContrast = Color(0xFFF8FBFF)
val onSecondaryDarkHighContrast = Color(0xFF000000)
val secondaryContainerDarkHighContrast = Color(0xFFBACEDC)
val onSecondaryContainerDarkHighContrast = Color(0xFF000000)
val tertiaryDarkHighContrast = Color(0xFFFEF9FF)
val onTertiaryDarkHighContrast = Color(0xFF000000)
val tertiaryContainerDarkHighContrast = Color(0xFFCEC5EE)
val onTertiaryContainerDarkHighContrast = Color(0xFF000000)
val errorDarkHighContrast = Color(0xFFFFF9F9)
val onErrorDarkHighContrast = Color(0xFF000000)
val errorContainerDarkHighContrast = Color(0xFFFFBAB1)
val onErrorContainerDarkHighContrast = Color(0xFF000000)
val backgroundDarkHighContrast = Color(0xFF0F1417)
val onBackgroundDarkHighContrast = Color(0xFFDFE3E7)
val surfaceDarkHighContrast = Color(0xFF0F1417)
val onSurfaceDarkHighContrast = Color(0xFFFFFFFF)
val surfaceVariantDarkHighContrast = Color(0xFF41484D)
val onSurfaceVariantDarkHighContrast = Color(0xFFF8FBFF)
val scrimDarkHighContrast = Color(0xFF000000)
val inverseSurfaceDarkHighContrast = Color(0xFFDFE3E7)
val inverseOnSurfaceDarkHighContrast = Color(0xFF000000)
val inversePrimaryDarkHighContrast = Color(0xFF002E40)
val customColorLight = Color(0xFF3A608F)
val onCustomColorLight = Color(0xFFFFFFFF)
val customColorContainerLight = Color(0xFFD3E3FF)
val onCustomColorContainerLight = Color(0xFF001C39)
val customColorLightMediumContrast = Color(0xFF1B4472)
val onCustomColorLightMediumContrast = Color(0xFFFFFFFF)
val customColorContainerLightMediumContrast = Color(0xFF5276A7)
val onCustomColorContainerLightMediumContrast = Color(0xFFFFFFFF)
val customColorLightHighContrast = Color(0xFF002344)
val onCustomColorLightHighContrast = Color(0xFFFFFFFF)
val customColorContainerLightHighContrast = Color(0xFF1B4472)
val onCustomColorContainerLightHighContrast = Color(0xFFFFFFFF)
val customColorDark = Color(0xFFA4C9FE)
val onCustomColorDark = Color(0xFF00315D)
val customColorContainerDark = Color(0xFF204876)
val onCustomColorContainerDark = Color(0xFFD3E3FF)
val customColorDarkMediumContrast = Color(0xFFABCDFF)
val onCustomColorDarkMediumContrast = Color(0xFF001730)
val customColorContainerDarkMediumContrast = Color(0xFF6E93C5)
val onCustomColorContainerDarkMediumContrast = Color(0xFF000000)
val customColorDarkHighContrast = Color(0xFFFBFAFF)
val onCustomColorDarkHighContrast = Color(0xFF000000)
val customColorContainerDarkHighContrast = Color(0xFFABCDFF)
val onCustomColorContainerDarkHighContrast = Color(0xFF000000)

View File

@@ -0,0 +1,282 @@
package org.jellyfin.androidtv.ui.shared.theme
import android.app.Activity
import androidx.tv.material3.MaterialTheme
import androidx.tv.material3.lightColorScheme
import androidx.tv.material3.darkColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalView
import androidx.core.view.WindowCompat
@Immutable
data class ExtendedColorScheme(
val customColor: ColorFamily,
)
private val lightScheme = lightColorScheme(
primary = primaryLight,
onPrimary = onPrimaryLight,
primaryContainer = primaryContainerLight,
onPrimaryContainer = onPrimaryContainerLight,
secondary = secondaryLight,
onSecondary = onSecondaryLight,
secondaryContainer = secondaryContainerLight,
onSecondaryContainer = onSecondaryContainerLight,
tertiary = tertiaryLight,
onTertiary = onTertiaryLight,
tertiaryContainer = tertiaryContainerLight,
onTertiaryContainer = onTertiaryContainerLight,
error = errorLight,
onError = onErrorLight,
errorContainer = errorContainerLight,
onErrorContainer = onErrorContainerLight,
background = backgroundLight,
onBackground = onBackgroundLight,
surface = surfaceLight,
onSurface = onSurfaceLight,
surfaceVariant = surfaceVariantLight,
onSurfaceVariant = onSurfaceVariantLight,
scrim = scrimLight,
inverseSurface = inverseSurfaceLight,
inverseOnSurface = inverseOnSurfaceLight,
inversePrimary = inversePrimaryLight
)
private val darkScheme = darkColorScheme(
primary = primaryDark,
onPrimary = onPrimaryDark,
primaryContainer = primaryContainerDark,
onPrimaryContainer = onPrimaryContainerDark,
secondary = secondaryDark,
onSecondary = onSecondaryDark,
secondaryContainer = secondaryContainerDark,
onSecondaryContainer = onSecondaryContainerDark,
tertiary = tertiaryDark,
onTertiary = onTertiaryDark,
tertiaryContainer = tertiaryContainerDark,
onTertiaryContainer = onTertiaryContainerDark,
error = errorDark,
onError = onErrorDark,
errorContainer = errorContainerDark,
onErrorContainer = onErrorContainerDark,
background = backgroundDark,
onBackground = onBackgroundDark,
surface = surfaceDark,
onSurface = onSurfaceDark,
surfaceVariant = surfaceVariantDark,
onSurfaceVariant = onSurfaceVariantDark,
scrim = scrimDark,
inverseSurface = inverseSurfaceDark,
inverseOnSurface = inverseOnSurfaceDark,
inversePrimary = inversePrimaryDark
)
private val mediumContrastLightColorScheme = lightColorScheme(
primary = primaryLightMediumContrast,
onPrimary = onPrimaryLightMediumContrast,
primaryContainer = primaryContainerLightMediumContrast,
onPrimaryContainer = onPrimaryContainerLightMediumContrast,
secondary = secondaryLightMediumContrast,
onSecondary = onSecondaryLightMediumContrast,
secondaryContainer = secondaryContainerLightMediumContrast,
onSecondaryContainer = onSecondaryContainerLightMediumContrast,
tertiary = tertiaryLightMediumContrast,
onTertiary = onTertiaryLightMediumContrast,
tertiaryContainer = tertiaryContainerLightMediumContrast,
onTertiaryContainer = onTertiaryContainerLightMediumContrast,
error = errorLightMediumContrast,
onError = onErrorLightMediumContrast,
errorContainer = errorContainerLightMediumContrast,
onErrorContainer = onErrorContainerLightMediumContrast,
background = backgroundLightMediumContrast,
onBackground = onBackgroundLightMediumContrast,
surface = surfaceLightMediumContrast,
onSurface = onSurfaceLightMediumContrast,
surfaceVariant = surfaceVariantLightMediumContrast,
onSurfaceVariant = onSurfaceVariantLightMediumContrast,
scrim = scrimLightMediumContrast,
inverseSurface = inverseSurfaceLightMediumContrast,
inverseOnSurface = inverseOnSurfaceLightMediumContrast,
inversePrimary = inversePrimaryLightMediumContrast
)
private val highContrastLightColorScheme = lightColorScheme(
primary = primaryLightHighContrast,
onPrimary = onPrimaryLightHighContrast,
primaryContainer = primaryContainerLightHighContrast,
onPrimaryContainer = onPrimaryContainerLightHighContrast,
secondary = secondaryLightHighContrast,
onSecondary = onSecondaryLightHighContrast,
secondaryContainer = secondaryContainerLightHighContrast,
onSecondaryContainer = onSecondaryContainerLightHighContrast,
tertiary = tertiaryLightHighContrast,
onTertiary = onTertiaryLightHighContrast,
tertiaryContainer = tertiaryContainerLightHighContrast,
onTertiaryContainer = onTertiaryContainerLightHighContrast,
error = errorLightHighContrast,
onError = onErrorLightHighContrast,
errorContainer = errorContainerLightHighContrast,
onErrorContainer = onErrorContainerLightHighContrast,
background = backgroundLightHighContrast,
onBackground = onBackgroundLightHighContrast,
surface = surfaceLightHighContrast,
onSurface = onSurfaceLightHighContrast,
surfaceVariant = surfaceVariantLightHighContrast,
onSurfaceVariant = onSurfaceVariantLightHighContrast,
scrim = scrimLightHighContrast,
inverseSurface = inverseSurfaceLightHighContrast,
inverseOnSurface = inverseOnSurfaceLightHighContrast,
inversePrimary = inversePrimaryLightHighContrast
)
private val mediumContrastDarkColorScheme = darkColorScheme(
primary = primaryDarkMediumContrast,
onPrimary = onPrimaryDarkMediumContrast,
primaryContainer = primaryContainerDarkMediumContrast,
onPrimaryContainer = onPrimaryContainerDarkMediumContrast,
secondary = secondaryDarkMediumContrast,
onSecondary = onSecondaryDarkMediumContrast,
secondaryContainer = secondaryContainerDarkMediumContrast,
onSecondaryContainer = onSecondaryContainerDarkMediumContrast,
tertiary = tertiaryDarkMediumContrast,
onTertiary = onTertiaryDarkMediumContrast,
tertiaryContainer = tertiaryContainerDarkMediumContrast,
onTertiaryContainer = onTertiaryContainerDarkMediumContrast,
error = errorDarkMediumContrast,
onError = onErrorDarkMediumContrast,
errorContainer = errorContainerDarkMediumContrast,
onErrorContainer = onErrorContainerDarkMediumContrast,
background = backgroundDarkMediumContrast,
onBackground = onBackgroundDarkMediumContrast,
surface = surfaceDarkMediumContrast,
onSurface = onSurfaceDarkMediumContrast,
surfaceVariant = surfaceVariantDarkMediumContrast,
onSurfaceVariant = onSurfaceVariantDarkMediumContrast,
scrim = scrimDarkMediumContrast,
inverseSurface = inverseSurfaceDarkMediumContrast,
inverseOnSurface = inverseOnSurfaceDarkMediumContrast,
inversePrimary = inversePrimaryDarkMediumContrast
)
private val highContrastDarkColorScheme = darkColorScheme(
primary = primaryDarkHighContrast,
onPrimary = onPrimaryDarkHighContrast,
primaryContainer = primaryContainerDarkHighContrast,
onPrimaryContainer = onPrimaryContainerDarkHighContrast,
secondary = secondaryDarkHighContrast,
onSecondary = onSecondaryDarkHighContrast,
secondaryContainer = secondaryContainerDarkHighContrast,
onSecondaryContainer = onSecondaryContainerDarkHighContrast,
tertiary = tertiaryDarkHighContrast,
onTertiary = onTertiaryDarkHighContrast,
tertiaryContainer = tertiaryContainerDarkHighContrast,
onTertiaryContainer = onTertiaryContainerDarkHighContrast,
error = errorDarkHighContrast,
onError = onErrorDarkHighContrast,
errorContainer = errorContainerDarkHighContrast,
onErrorContainer = onErrorContainerDarkHighContrast,
background = backgroundDarkHighContrast,
onBackground = onBackgroundDarkHighContrast,
surface = surfaceDarkHighContrast,
onSurface = onSurfaceDarkHighContrast,
surfaceVariant = surfaceVariantDarkHighContrast,
onSurfaceVariant = onSurfaceVariantDarkHighContrast,
scrim = scrimDarkHighContrast,
inverseSurface = inverseSurfaceDarkHighContrast,
inverseOnSurface = inverseOnSurfaceDarkHighContrast,
inversePrimary = inversePrimaryDarkHighContrast
)
val extendedLight = ExtendedColorScheme(
customColor = ColorFamily(
customColorLight,
onCustomColorLight,
customColorContainerLight,
onCustomColorContainerLight,
),
)
val extendedDark = ExtendedColorScheme(
customColor = ColorFamily(
customColorDark,
onCustomColorDark,
customColorContainerDark,
onCustomColorContainerDark,
),
)
val extendedLightMediumContrast = ExtendedColorScheme(
customColor = ColorFamily(
customColorLightMediumContrast,
onCustomColorLightMediumContrast,
customColorContainerLightMediumContrast,
onCustomColorContainerLightMediumContrast,
),
)
val extendedLightHighContrast = ExtendedColorScheme(
customColor = ColorFamily(
customColorLightHighContrast,
onCustomColorLightHighContrast,
customColorContainerLightHighContrast,
onCustomColorContainerLightHighContrast,
),
)
val extendedDarkMediumContrast = ExtendedColorScheme(
customColor = ColorFamily(
customColorDarkMediumContrast,
onCustomColorDarkMediumContrast,
customColorContainerDarkMediumContrast,
onCustomColorContainerDarkMediumContrast,
),
)
val extendedDarkHighContrast = ExtendedColorScheme(
customColor = ColorFamily(
customColorDarkHighContrast,
onCustomColorDarkHighContrast,
customColorContainerDarkHighContrast,
onCustomColorContainerDarkHighContrast,
),
)
@Immutable
data class ColorFamily(
val color: Color,
val onColor: Color,
val colorContainer: Color,
val onColorContainer: Color
)
val unspecified_scheme = ColorFamily(
Color.Unspecified, Color.Unspecified, Color.Unspecified, Color.Unspecified
)
@Composable
fun JellyfinMaterialTheme(
darkTheme: Boolean = true,
content: @Composable() () -> Unit
) {
val colorScheme = when {
darkTheme -> darkScheme
else -> lightScheme
}
val view = LocalView.current
if (!view.isInEditMode) {
SideEffect {
val window = (view.context as Activity).window
window.statusBarColor = colorScheme.primary.toArgb()
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
}
}
MaterialTheme(
colorScheme = colorScheme,
content = content
)
}