mirror of
https://github.com/avinal/nikki.git
synced 2026-07-03 21:40:09 +05:30
Add Windows Phone Metro theme system
Color system: - Dark (#1F1F1F bg), Light (white bg), AMOLED (pure black bg) - All 20 WP8 accent colors (Lime through Taupe) - User-selectable accent color persisted in DataStore - Default: Cobalt (#0050EF) Typography (WP scale): - 54sp Light for page titles, 32sp Light for pivot headers - 24sp Light for section headers, 17sp body, 15sp normal, 14sp small - SemiBold for emphasis, Light for large display text Flat surfaces only — no elevation, no tonal surfaces, no Material chrome. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Avinal Kumar <avinal.xlvii@gmail.com>
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
package com.avinal.memos.ui.theme
|
||||
|
||||
import androidx.compose.material3.ColorScheme
|
||||
import androidx.compose.material3.darkColorScheme
|
||||
import androidx.compose.material3.lightColorScheme
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.compositionLocalOf
|
||||
import androidx.compose.ui.graphics.Color
|
||||
|
||||
val PriorityP1 = Color(0xFFE51400)
|
||||
val PriorityP2 = Color(0xFFF0A30A)
|
||||
val PriorityP3 = Color(0xFF1BA1E2)
|
||||
val LabelGreen = Color(0xFF60A917)
|
||||
val DuePurple = Color(0xFF6A00FF)
|
||||
val OverdueRed = Color(0xFFE51400)
|
||||
|
||||
// --- WP8 Accent Colors ---
|
||||
data class AccentColor(val name: String, val color: Color)
|
||||
|
||||
val WpAccentColors = listOf(
|
||||
AccentColor("Lime", Color(0xFFA4C400)),
|
||||
AccentColor("Green", Color(0xFF60A917)),
|
||||
AccentColor("Emerald", Color(0xFF008A00)),
|
||||
AccentColor("Teal", Color(0xFF00ABA9)),
|
||||
AccentColor("Cyan", Color(0xFF1BA1E2)),
|
||||
AccentColor("Cobalt", Color(0xFF0050EF)),
|
||||
AccentColor("Indigo", Color(0xFF6A00FF)),
|
||||
AccentColor("Violet", Color(0xFFAA00FF)),
|
||||
AccentColor("Pink", Color(0xFFF472D0)),
|
||||
AccentColor("Magenta", Color(0xFFD80073)),
|
||||
AccentColor("Crimson", Color(0xFFA20025)),
|
||||
AccentColor("Red", Color(0xFFE51400)),
|
||||
AccentColor("Orange", Color(0xFFFA6800)),
|
||||
AccentColor("Amber", Color(0xFFF0A30A)),
|
||||
AccentColor("Yellow", Color(0xFFE3C800)),
|
||||
AccentColor("Brown", Color(0xFF825A2C)),
|
||||
AccentColor("Olive", Color(0xFF6D8764)),
|
||||
AccentColor("Steel", Color(0xFF647687)),
|
||||
AccentColor("Mauve", Color(0xFF76608A)),
|
||||
AccentColor("Taupe", Color(0xFF87794E)),
|
||||
)
|
||||
|
||||
val LocalAccentColor = compositionLocalOf { Color(0xFF0050EF) }
|
||||
|
||||
// --- Metro Theme Variants ---
|
||||
enum class MetroTheme(val label: String) {
|
||||
DARK("dark"),
|
||||
LIGHT("light"),
|
||||
AMOLED("amoled"),
|
||||
}
|
||||
|
||||
fun metroColorScheme(theme: MetroTheme, accent: Color): ColorScheme = when (theme) {
|
||||
MetroTheme.DARK -> darkColorScheme(
|
||||
background = Color(0xFF1F1F1F),
|
||||
onBackground = Color.White,
|
||||
surface = Color(0xFF1F1F1F),
|
||||
onSurface = Color.White,
|
||||
surfaceVariant = Color(0xFF2A2A2A),
|
||||
onSurfaceVariant = Color(0xFF999999),
|
||||
primary = accent,
|
||||
onPrimary = Color.White,
|
||||
secondary = Color(0xFF333333),
|
||||
onSecondary = Color(0xFFCCCCCC),
|
||||
error = Color(0xFFE51400),
|
||||
onError = Color.White,
|
||||
outline = Color(0xFF666666),
|
||||
outlineVariant = Color(0xFF444444),
|
||||
)
|
||||
MetroTheme.LIGHT -> lightColorScheme(
|
||||
background = Color.White,
|
||||
onBackground = Color.Black,
|
||||
surface = Color.White,
|
||||
onSurface = Color.Black,
|
||||
surfaceVariant = Color(0xFFF0F0F0),
|
||||
onSurfaceVariant = Color(0xFF666666),
|
||||
primary = accent,
|
||||
onPrimary = Color.White,
|
||||
secondary = Color(0xFFE8E8E8),
|
||||
onSecondary = Color(0xFF333333),
|
||||
error = Color(0xFFE51400),
|
||||
onError = Color.White,
|
||||
outline = Color(0xFFCCCCCC),
|
||||
outlineVariant = Color(0xFFE0E0E0),
|
||||
)
|
||||
MetroTheme.AMOLED -> darkColorScheme(
|
||||
background = Color.Black,
|
||||
onBackground = Color.White,
|
||||
surface = Color.Black,
|
||||
onSurface = Color.White,
|
||||
surfaceVariant = Color(0xFF111111),
|
||||
onSurfaceVariant = Color(0xFF999999),
|
||||
primary = accent,
|
||||
onPrimary = Color.White,
|
||||
secondary = Color(0xFF1A1A1A),
|
||||
onSecondary = Color(0xFFCCCCCC),
|
||||
error = Color(0xFFE51400),
|
||||
onError = Color.White,
|
||||
outline = Color(0xFF555555),
|
||||
outlineVariant = Color(0xFF333333),
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.avinal.memos.ui.theme
|
||||
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import com.avinal.memos.util.LocalAppDependencies
|
||||
|
||||
@Composable
|
||||
fun MemosAppTheme(content: @Composable () -> Unit) {
|
||||
val deps = LocalAppDependencies.current
|
||||
val themeName by deps.tokenStore.theme.collectAsState(initial = "DARK")
|
||||
val accentName by deps.tokenStore.accentColor.collectAsState(initial = "Cobalt")
|
||||
|
||||
val metroTheme = try { MetroTheme.valueOf(themeName) } catch (_: Exception) { MetroTheme.DARK }
|
||||
val accent = WpAccentColors.find { it.name == accentName }?.color ?: Color(0xFF0050EF)
|
||||
|
||||
CompositionLocalProvider(LocalAccentColor provides accent) {
|
||||
MaterialTheme(
|
||||
colorScheme = metroColorScheme(metroTheme, accent),
|
||||
typography = MetroTypography,
|
||||
content = content,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.avinal.memos.ui.theme
|
||||
|
||||
import androidx.compose.material3.Typography
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.sp
|
||||
|
||||
val MetroTypography = Typography(
|
||||
displayLarge = TextStyle(fontSize = 54.sp, fontWeight = FontWeight.Light, letterSpacing = (-0.5).sp),
|
||||
displayMedium = TextStyle(fontSize = 32.sp, fontWeight = FontWeight.Light, letterSpacing = 0.sp),
|
||||
displaySmall = TextStyle(fontSize = 24.sp, fontWeight = FontWeight.Light, letterSpacing = 0.sp),
|
||||
headlineLarge = TextStyle(fontSize = 32.sp, fontWeight = FontWeight.Light, letterSpacing = 0.sp),
|
||||
headlineMedium = TextStyle(fontSize = 24.sp, fontWeight = FontWeight.Light, letterSpacing = 0.sp),
|
||||
headlineSmall = TextStyle(fontSize = 19.sp, fontWeight = FontWeight.Normal, letterSpacing = 0.sp),
|
||||
titleLarge = TextStyle(fontSize = 24.sp, fontWeight = FontWeight.Light, letterSpacing = 0.sp),
|
||||
titleMedium = TextStyle(fontSize = 17.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 0.sp),
|
||||
titleSmall = TextStyle(fontSize = 15.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 0.sp),
|
||||
bodyLarge = TextStyle(fontSize = 17.sp, fontWeight = FontWeight.Normal, letterSpacing = 0.sp),
|
||||
bodyMedium = TextStyle(fontSize = 15.sp, fontWeight = FontWeight.Normal, letterSpacing = 0.sp),
|
||||
bodySmall = TextStyle(fontSize = 14.sp, fontWeight = FontWeight.Normal, letterSpacing = 0.sp),
|
||||
labelLarge = TextStyle(fontSize = 15.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 0.sp),
|
||||
labelMedium = TextStyle(fontSize = 14.sp, fontWeight = FontWeight.Normal, letterSpacing = 0.sp),
|
||||
labelSmall = TextStyle(fontSize = 12.sp, fontWeight = FontWeight.Normal, letterSpacing = 0.sp),
|
||||
)
|
||||
Reference in New Issue
Block a user