|
|
|
@ -17,17 +17,52 @@ import androidx.compose.runtime.remember
|
|
|
|
|
import androidx.compose.runtime.setValue
|
|
|
|
|
import androidx.compose.runtime.staticCompositionLocalOf
|
|
|
|
|
import androidx.compose.ui.graphics.Color
|
|
|
|
|
import androidx.compose.ui.platform.LocalContext
|
|
|
|
|
import mozilla.components.ui.colors.PhotonColors
|
|
|
|
|
import org.mozilla.fenix.ext.settings
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Indicates the theme that is displayed.
|
|
|
|
|
*/
|
|
|
|
|
enum class Theme {
|
|
|
|
|
Light,
|
|
|
|
|
Dark,
|
|
|
|
|
Private;
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
/**
|
|
|
|
|
* Returns the current [Theme] that is displayed.
|
|
|
|
|
*
|
|
|
|
|
* @param isPrivate Whether or not private browsing mode is enabled.
|
|
|
|
|
* @return the current [Theme] that is displayed.
|
|
|
|
|
*/
|
|
|
|
|
@Composable
|
|
|
|
|
fun getTheme(isPrivate: Boolean = LocalContext.current.settings().lastKnownMode.isPrivate) =
|
|
|
|
|
if (isPrivate) {
|
|
|
|
|
Private
|
|
|
|
|
} else if (isSystemInDarkTheme()) {
|
|
|
|
|
Dark
|
|
|
|
|
} else {
|
|
|
|
|
Light
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The theme for Mozilla Firefox for Android (Fenix).
|
|
|
|
|
*
|
|
|
|
|
* @param theme The current [Theme] that is displayed.
|
|
|
|
|
*/
|
|
|
|
|
@Composable
|
|
|
|
|
fun FirefoxTheme(
|
|
|
|
|
darkTheme: Boolean = isSystemInDarkTheme(),
|
|
|
|
|
theme: Theme = Theme.getTheme(),
|
|
|
|
|
content: @Composable () -> Unit
|
|
|
|
|
) {
|
|
|
|
|
val colors = if (darkTheme) darkColorPalette else lightColorPalette
|
|
|
|
|
val colors = when (theme) {
|
|
|
|
|
Theme.Light -> lightColorPalette
|
|
|
|
|
Theme.Dark -> darkColorPalette
|
|
|
|
|
Theme.Private -> privateColorPalette
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ProvideFirefoxColors(colors) {
|
|
|
|
|
MaterialTheme(
|
|
|
|
@ -42,10 +77,78 @@ object FirefoxTheme {
|
|
|
|
|
get() = localFirefoxColors.current
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private val privateColorPalette = FirefoxColors(
|
|
|
|
|
layer1 = PhotonColors.Ink50,
|
|
|
|
|
layer2 = PhotonColors.Ink50,
|
|
|
|
|
layer3 = PhotonColors.Ink50,
|
|
|
|
|
layer4Start = PhotonColors.Purple70,
|
|
|
|
|
layer4Center = PhotonColors.Violet80,
|
|
|
|
|
layer4End = PhotonColors.Ink05,
|
|
|
|
|
layerAccent = PhotonColors.Violet40,
|
|
|
|
|
layerAccentNonOpaque = PhotonColors.Violet50A32,
|
|
|
|
|
layerAccentOpaque = Color(0xFF423262),
|
|
|
|
|
scrim = PhotonColors.DarkGrey90A95,
|
|
|
|
|
gradientStart = PhotonColors.Violet70,
|
|
|
|
|
gradientEnd = PhotonColors.Violet40,
|
|
|
|
|
actionPrimary = PhotonColors.Violet60,
|
|
|
|
|
actionSecondary = PhotonColors.LightGrey05,
|
|
|
|
|
actionTertiary = PhotonColors.DarkGrey10,
|
|
|
|
|
actionQuarternary = PhotonColors.DarkGrey80,
|
|
|
|
|
formDefault = PhotonColors.LightGrey05,
|
|
|
|
|
formSelected = PhotonColors.Violet40,
|
|
|
|
|
formSurface = PhotonColors.DarkGrey05,
|
|
|
|
|
formDisabled = PhotonColors.DarkGrey05,
|
|
|
|
|
formOn = PhotonColors.Violet40,
|
|
|
|
|
formOff = PhotonColors.LightGrey05,
|
|
|
|
|
indicatorActive = PhotonColors.LightGrey90,
|
|
|
|
|
indicatorInactive = PhotonColors.DarkGrey05,
|
|
|
|
|
textPrimary = PhotonColors.LightGrey05,
|
|
|
|
|
textSecondary = PhotonColors.LightGrey40,
|
|
|
|
|
textDisabled = PhotonColors.LightGrey05A40,
|
|
|
|
|
textWarning = PhotonColors.Red20,
|
|
|
|
|
textWarningButton = PhotonColors.Red70,
|
|
|
|
|
textAccent = PhotonColors.Violet20,
|
|
|
|
|
textAccentDisabled = PhotonColors.Violet20A60,
|
|
|
|
|
textOnColorPrimary = PhotonColors.LightGrey05,
|
|
|
|
|
textOnColorSecondary = PhotonColors.LightGrey40,
|
|
|
|
|
textActionPrimary = PhotonColors.LightGrey05,
|
|
|
|
|
textActionSecondary = PhotonColors.DarkGrey90,
|
|
|
|
|
textActionTertiary = PhotonColors.LightGrey05,
|
|
|
|
|
textActionTertiaryActive = PhotonColors.LightGrey05,
|
|
|
|
|
iconPrimary = PhotonColors.LightGrey05,
|
|
|
|
|
iconPrimaryInactive = PhotonColors.LightGrey05A60,
|
|
|
|
|
iconSecondary = PhotonColors.LightGrey40,
|
|
|
|
|
iconActive = PhotonColors.Violet40,
|
|
|
|
|
iconDisabled = PhotonColors.LightGrey05A40,
|
|
|
|
|
iconOnColor = PhotonColors.LightGrey05,
|
|
|
|
|
iconNotice = PhotonColors.Blue30,
|
|
|
|
|
iconButton = PhotonColors.LightGrey05,
|
|
|
|
|
iconWarning = PhotonColors.Red20,
|
|
|
|
|
iconWarningButton = PhotonColors.Red70,
|
|
|
|
|
iconAccentViolet = PhotonColors.Violet20,
|
|
|
|
|
iconAccentBlue = PhotonColors.Blue20,
|
|
|
|
|
iconAccentPink = PhotonColors.Pink20,
|
|
|
|
|
iconAccentGreen = PhotonColors.Green20,
|
|
|
|
|
iconAccentYellow = PhotonColors.Yellow20,
|
|
|
|
|
iconActionPrimary = PhotonColors.LightGrey05,
|
|
|
|
|
iconActionSecondary = PhotonColors.DarkGrey90,
|
|
|
|
|
iconGradientStart = PhotonColors.Violet20,
|
|
|
|
|
iconGradientEnd = PhotonColors.Blue20,
|
|
|
|
|
borderPrimary = PhotonColors.DarkGrey05,
|
|
|
|
|
borderInverted = PhotonColors.LightGrey30,
|
|
|
|
|
borderFormDefault = PhotonColors.LightGrey05,
|
|
|
|
|
borderAccent = PhotonColors.Violet40,
|
|
|
|
|
borderDisabled = PhotonColors.LightGrey05A40,
|
|
|
|
|
borderWarning = PhotonColors.Red40
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
private val darkColorPalette = FirefoxColors(
|
|
|
|
|
layer1 = PhotonColors.DarkGrey60,
|
|
|
|
|
layer2 = PhotonColors.DarkGrey30,
|
|
|
|
|
layer3 = PhotonColors.DarkGrey80,
|
|
|
|
|
layer4Start = PhotonColors.Purple70,
|
|
|
|
|
layer4Center = PhotonColors.Violet80,
|
|
|
|
|
layer4End = PhotonColors.Ink05,
|
|
|
|
|
layerAccent = PhotonColors.Violet40,
|
|
|
|
|
layerAccentNonOpaque = PhotonColors.Violet50A32,
|
|
|
|
|
layerAccentOpaque = Color(0xFF423262),
|
|
|
|
@ -108,6 +211,9 @@ private val lightColorPalette = FirefoxColors(
|
|
|
|
|
layer1 = PhotonColors.LightGrey10,
|
|
|
|
|
layer2 = PhotonColors.White,
|
|
|
|
|
layer3 = PhotonColors.LightGrey20,
|
|
|
|
|
layer4Start = PhotonColors.Purple70,
|
|
|
|
|
layer4Center = PhotonColors.Violet80,
|
|
|
|
|
layer4End = PhotonColors.Ink05,
|
|
|
|
|
layerAccent = PhotonColors.Ink20,
|
|
|
|
|
layerAccentNonOpaque = PhotonColors.Violet70A12,
|
|
|
|
|
layerAccentOpaque = Color(0xFFEAE4F9),
|
|
|
|
@ -175,6 +281,9 @@ class FirefoxColors(
|
|
|
|
|
layer1: Color,
|
|
|
|
|
layer2: Color,
|
|
|
|
|
layer3: Color,
|
|
|
|
|
layer4Start: Color,
|
|
|
|
|
layer4Center: Color,
|
|
|
|
|
layer4End: Color,
|
|
|
|
|
layerAccent: Color,
|
|
|
|
|
layerAccentNonOpaque: Color,
|
|
|
|
|
layerAccentOpaque: Color,
|
|
|
|
@ -243,6 +352,15 @@ class FirefoxColors(
|
|
|
|
|
// Search
|
|
|
|
|
var layer3 by mutableStateOf(layer3)
|
|
|
|
|
private set
|
|
|
|
|
// Homescreen background, Toolbar
|
|
|
|
|
var layer4Start by mutableStateOf(layer4Start)
|
|
|
|
|
private set
|
|
|
|
|
// Homescreen background, Toolbar
|
|
|
|
|
var layer4Center by mutableStateOf(layer4Center)
|
|
|
|
|
private set
|
|
|
|
|
// Homescreen background, Toolbar
|
|
|
|
|
var layer4End by mutableStateOf(layer4End)
|
|
|
|
|
private set
|
|
|
|
|
// App Bar Top (edit), Text Cursor, Selected Tab Check
|
|
|
|
|
var layerAccent by mutableStateOf(layerAccent)
|
|
|
|
|
private set
|
|
|
|
@ -421,6 +539,9 @@ class FirefoxColors(
|
|
|
|
|
layer1 = other.layer1
|
|
|
|
|
layer2 = other.layer2
|
|
|
|
|
layer3 = other.layer3
|
|
|
|
|
layer4Start = other.layer4Start
|
|
|
|
|
layer4Center = other.layer4Center
|
|
|
|
|
layer4End = other.layer4End
|
|
|
|
|
layerAccent = other.layerAccent
|
|
|
|
|
layerAccentNonOpaque = other.layerAccentNonOpaque
|
|
|
|
|
layerAccentOpaque = other.layerAccentOpaque
|
|
|
|
@ -483,6 +604,9 @@ class FirefoxColors(
|
|
|
|
|
layer1 = layer1,
|
|
|
|
|
layer2 = layer2,
|
|
|
|
|
layer3 = layer3,
|
|
|
|
|
layer4Start = layer4Start,
|
|
|
|
|
layer4Center = layer4Center,
|
|
|
|
|
layer4End = layer4End,
|
|
|
|
|
layerAccent = layerAccent,
|
|
|
|
|
layerAccentNonOpaque = layerAccentNonOpaque,
|
|
|
|
|
layerAccentOpaque = layerAccentOpaque,
|
|
|
|
|