v0.2.4: One UI 9 & Material 3 Expressive UI/UX Redesign

This commit is contained in:
2026-08-20 23:28:53 +00:00
parent ef55fae424
commit 779ddb497d
@@ -10,6 +10,7 @@ import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@@ -18,117 +19,131 @@ import androidx.core.view.WindowCompat
import com.hotdeal.alarm.domain.model.SiteType import com.hotdeal.alarm.domain.model.SiteType
// ============================================ // ============================================
// Material You Style - Premium Color Palette // One UI 9 & Material 3 Expressive Color Palette
// ============================================ // ============================================
// Light Theme - Premium Palette // Light Theme - Clean Frost & Vibrant Indigo
private val LightPrimary = Color(0xFF0061A4) private val LightPrimary = Color(0xFF2563EB) // Electric Indigo
private val LightOnPrimary = Color(0xFFFFFFFF) private val LightOnPrimary = Color(0xFFFFFFFF)
private val LightPrimaryContainer = Color(0xFFD1E4FF) private val LightPrimaryContainer = Color(0xFFDBEAFE)
private val LightOnPrimaryContainer = Color(0xFF001D36) private val LightOnPrimaryContainer = Color(0xFF1E3A8A)
private val LightSecondary = Color(0xFF535F70) private val LightSecondary = Color(0xFF475569) // Slate
private val LightOnSecondary = Color(0xFFFFFFFF) private val LightOnSecondary = Color(0xFFFFFFFF)
private val LightSecondaryContainer = Color(0xFFD7E3F8) private val LightSecondaryContainer = Color(0xFFF1F5F9)
private val LightOnSecondaryContainer = Color(0xFF101C2B) private val LightOnSecondaryContainer = Color(0xFF0F172A)
private val LightTertiary = Color(0xFF6B5778) private val LightTertiary = Color(0xFF0D9488) // Modern Teal
private val LightOnTertiary = Color(0xFFFFFFFF) private val LightOnTertiary = Color(0xFFFFFFFF)
private val LightTertiaryContainer = Color(0xFFF2DAFF) private val LightTertiaryContainer = Color(0xFFCCFBF1)
private val LightOnTertiaryContainer = Color(0xFF251431) private val LightOnTertiaryContainer = Color(0xFF115E59)
private val LightBackground = Color(0xFFFDFCFF) private val LightBackground = Color(0xFFF8FAFC) // Clean Ultra Frost
private val LightOnBackground = Color(0xFF1A1C1E) private val LightOnBackground = Color(0xFF0F172A)
private val LightSurface = Color(0xFFFDFCFF) private val LightSurface = Color(0xFFFFFFFF)
private val LightOnSurface = Color(0xFF1A1C1E) private val LightOnSurface = Color(0xFF0F172A)
private val LightSurfaceVariant = Color(0xFFDFE2EB) private val LightSurfaceVariant = Color(0xFFF1F5F9)
private val LightOnSurfaceVariant = Color(0xFF43474E) private val LightOnSurfaceVariant = Color(0xFF475569)
private val LightError = Color(0xFFBA1A1A) private val LightError = Color(0xFFDC2626)
private val LightOnError = Color(0xFFFFFFFF) private val LightOnError = Color(0xFFFFFFFF)
private val LightErrorContainer = Color(0xFFFFDAD6) private val LightErrorContainer = Color(0xFFFEE2E2)
private val LightOnErrorContainer = Color(0xFF410002) private val LightOnErrorContainer = Color(0xFF991B1B)
private val LightOutline = Color(0xFF73777F) private val LightOutline = Color(0xFF94A3B8)
private val LightOutlineVariant = Color(0xFFC3C6CF) private val LightOutlineVariant = Color(0xFFE2E8F0)
private val LightInverseSurface = Color(0xFF2F3033) private val LightInverseSurface = Color(0xFF0F172A)
private val LightInverseOnSurface = Color(0xFFF1F0F4) private val LightInverseOnSurface = Color(0xFFF8FAFC)
private val LightInversePrimary = Color(0xFF9ECAFF) private val LightInversePrimary = Color(0xFF60A5FA)
private val LightSurfaceTint = Color(0xFF0061A4) private val LightSurfaceTint = Color(0xFF2563EB)
// Dark Theme - Premium Palette // Dark Theme - Deep OLED Slate (One UI 9)
private val DarkPrimary = Color(0xFF9ECAFF) private val DarkPrimary = Color(0xFF60A5FA) // Luminous Indigo
private val DarkOnPrimary = Color(0xFF003258) private val DarkOnPrimary = Color(0xFF0F172A)
private val DarkPrimaryContainer = Color(0xFF00497D) private val DarkPrimaryContainer = Color(0xFF1E3A8A)
private val DarkOnPrimaryContainer = Color(0xFFD1E4FF) private val DarkOnPrimaryContainer = Color(0xFFDBEAFE)
private val DarkSecondary = Color(0xFFBBC7DB) private val DarkSecondary = Color(0xFF94A3B8)
private val DarkOnSecondary = Color(0xFF253140) private val DarkOnSecondary = Color(0xFF0F172A)
private val DarkSecondaryContainer = Color(0xFF3B4858) private val DarkSecondaryContainer = Color(0xFF1E293B)
private val DarkOnSecondaryContainer = Color(0xFFD7E3F8) private val DarkOnSecondaryContainer = Color(0xFFF1F5F9)
private val DarkTertiary = Color(0xFFD6BEE4) private val DarkTertiary = Color(0xFF2DD4BF)
private val DarkOnTertiary = Color(0xFF3B2948) private val DarkOnTertiary = Color(0xFF042F2E)
private val DarkTertiaryContainer = Color(0xFF523F5F) private val DarkTertiaryContainer = Color(0xFF115E59)
private val DarkOnTertiaryContainer = Color(0xFFF2DAFF) private val DarkOnTertiaryContainer = Color(0xFFCCFBF1)
private val DarkBackground = Color(0xFF1A1C1E) private val DarkBackground = Color(0xFF0B0F19) // Deep OLED Slate
private val DarkOnBackground = Color(0xFFE2E2E6) private val DarkOnBackground = Color(0xFFF1F5F9)
private val DarkSurface = Color(0xFF1A1C1E) private val DarkSurface = Color(0xFF111827) // Elev 1
private val DarkOnSurface = Color(0xFFE2E2E6) private val DarkOnSurface = Color(0xFFF1F5F9)
private val DarkSurfaceVariant = Color(0xFF43474E) private val DarkSurfaceVariant = Color(0xFF1F2937) // Elev 2
private val DarkOnSurfaceVariant = Color(0xFFC3C6CF) private val DarkOnSurfaceVariant = Color(0xFF9CA3AF)
private val DarkError = Color(0xFFFFB4AB) private val DarkError = Color(0xFFF87171)
private val DarkOnError = Color(0xFF690005) private val DarkOnError = Color(0xFF450A0A)
private val DarkErrorContainer = Color(0xFF93000A) private val DarkErrorContainer = Color(0xFF7F1D1D)
private val DarkOnErrorContainer = Color(0xFFFFDAD6) private val DarkOnErrorContainer = Color(0xFFFECACA)
private val DarkOutline = Color(0xFF8D9199) private val DarkOutline = Color(0xFF4B5563)
private val DarkOutlineVariant = Color(0xFF43474E) private val DarkOutlineVariant = Color(0xFF374151)
private val DarkInverseSurface = Color(0xFFE2E2E6) private val DarkInverseSurface = Color(0xFFF1F5F9)
private val DarkInverseOnSurface = Color(0xFF2F3033) private val DarkInverseOnSurface = Color(0xFF0F172A)
private val DarkInversePrimary = Color(0xFF0061A4) private val DarkInversePrimary = Color(0xFF2563EB)
private val DarkSurfaceTint = Color(0xFF9ECAFF) private val DarkSurfaceTint = Color(0xFF60A5FA)
// ============================================ // ============================================
// Site Colors - Premium Tones // One UI 9 Premium Accents & Brand Tones
// ============================================ // ============================================
// 뽐뿌 - Premium Pink // 뽐뿌 - Rose Magenta
val PpomppuColor = Color(0xFFE91E63) val PpomppuColor = Color(0xFFE11D48)
val PpomppuColorLight = Color(0xFFFCE4EC) val PpomppuColorLight = Color(0xFFFFF1F2)
val PpomppuColorDark = Color(0xFFC2185B) val PpomppuColorDark = Color(0xFF881337)
// 클리앙 - Premium Green // 클리앙 - Emerald Green
val ClienColor = Color(0xFF2E7D32) val ClienColor = Color(0xFF059669)
val ClienColorLight = Color(0xFFE8F5E9) val ClienColorLight = Color(0xFFECFDF5)
val ClienColorDark = Color(0xFF1B5E20) val ClienColorDark = Color(0xFF064E3B)
// 루리웹 - Premium Blue // 루리웹 - Royal Cobalt
val RuriwebColor = Color(0xFF1565C0) val RuriwebColor = Color(0xFF2563EB)
val RuriwebColorLight = Color(0xFFE3F2FD) val RuriwebColorLight = Color(0xFFEFF6FF)
val RuriwebColorDark = Color(0xFF0D47A1) val RuriwebColorDark = Color(0xFF1E3A8A)
// 쿨엔조이 - Premium Orange // 쿨엔조이 - Neon Sunset Orange
val CoolenjoyColor = Color(0xFFEF6C00) val CoolenjoyColor = Color(0xFFEA580C)
val CoolenjoyColorLight = Color(0xFFFFF3E0) val CoolenjoyColorLight = Color(0xFFFFF7ED)
val CoolenjoyColorDark = Color(0xFFE65100) val CoolenjoyColorDark = Color(0xFF7C2D12)
// 아카라이브 - Premium Teal // 아카라이브 - Vibrant Emerald Teal
val ArcaLiveColor = Color(0xFF00897B) val ArcaLiveColor = Color(0xFF0D9488)
val ArcaLiveColorLight = Color(0xFFE0F2F1) val ArcaLiveColorLight = Color(0xFFF0FDFA)
val ArcaLiveColorDark = Color(0xFF004D40) val ArcaLiveColorDark = Color(0xFF134E4A)
// Keyword Match - Light Red Theme // Hot / Popular Flame
val KeywordMatchColor = Color(0xFFE53935) val HotDealFlameColor = Color(0xFFFF5722)
val KeywordMatchColorLight = Color(0xFFFFEBEE) val HotDealFlameGradient = Brush.horizontalGradient(
listOf(Color(0xFFFF3D00), Color(0xFFFF9100))
)
// Favorite - Premium Red // Keyword Match - Amber Gold Luxury Glow
val FavoriteColor = Color(0xFFE53935) val KeywordGold = Color(0xFFF59E0B)
val KeywordGoldLight = Color(0xFFFEF3C7)
val KeywordGoldDark = Color(0xFF78350F)
val KeywordGoldGradient = Brush.horizontalGradient(
listOf(Color(0xFFF59E0B), Color(0xFFD97706))
)
// Favorite - Premium Crimson Heart
val FavoriteColor = Color(0xFFEF4444)
// One UI 9 Micro Rim Border Color
val AmbientBorderColorLight = Color(0x1F0F172A)
val AmbientBorderColorDark = Color(0x33FFFFFF)
/** /**
* 사이트별 색상 가져오기 * 사이트별 대표 색상
*/ */
fun getSiteColor(siteType: SiteType?): Color { fun getSiteColor(siteType: SiteType?): Color {
return when (siteType) { return when (siteType) {
@@ -137,12 +152,12 @@ fun getSiteColor(siteType: SiteType?): Color {
SiteType.RURIWEB -> RuriwebColor SiteType.RURIWEB -> RuriwebColor
SiteType.COOLENJOY -> CoolenjoyColor SiteType.COOLENJOY -> CoolenjoyColor
SiteType.ARCALIVE -> ArcaLiveColor SiteType.ARCALIVE -> ArcaLiveColor
null -> Color.Gray null -> Color(0xFF64748B)
} }
} }
/** /**
* 사이트별 라이트 배경색 가져오기 * 사이트별 라이트 소프트 틴트
*/ */
fun getSiteColorLight(siteType: SiteType?): Color { fun getSiteColorLight(siteType: SiteType?): Color {
return when (siteType) { return when (siteType) {
@@ -151,12 +166,12 @@ fun getSiteColorLight(siteType: SiteType?): Color {
SiteType.RURIWEB -> RuriwebColorLight SiteType.RURIWEB -> RuriwebColorLight
SiteType.COOLENJOY -> CoolenjoyColorLight SiteType.COOLENJOY -> CoolenjoyColorLight
SiteType.ARCALIVE -> ArcaLiveColorLight SiteType.ARCALIVE -> ArcaLiveColorLight
null -> Color.LightGray.copy(alpha = 0.3f) null -> Color(0xFFF1F5F9)
} }
} }
/** /**
* 사이트별 다크 배경색 가져오기 * 사이트별 다크 서브 틴트
*/ */
fun getSiteColorDark(siteType: SiteType?): Color { fun getSiteColorDark(siteType: SiteType?): Color {
return when (siteType) { return when (siteType) {
@@ -165,7 +180,7 @@ fun getSiteColorDark(siteType: SiteType?): Color {
SiteType.RURIWEB -> RuriwebColorDark SiteType.RURIWEB -> RuriwebColorDark
SiteType.COOLENJOY -> CoolenjoyColorDark SiteType.COOLENJOY -> CoolenjoyColorDark
SiteType.ARCALIVE -> ArcaLiveColorDark SiteType.ARCALIVE -> ArcaLiveColorDark
null -> Color.DarkGray null -> Color(0xFF1E293B)
} }
} }
@@ -249,14 +264,14 @@ fun HotDealTheme(
darkTheme -> DarkColorScheme darkTheme -> DarkColorScheme
else -> LightColorScheme else -> LightColorScheme
} }
val view = LocalView.current val view = LocalView.current
if (!view.isInEditMode) { if (!view.isInEditMode) {
SideEffect { SideEffect {
val window = (view.context as Activity).window val window = (view.context as Activity).window
// 시스템 바 색상을 앱 배경색과 일치시켜 이질감 제거 // One UI 9 Edge-to-Edge 완벽 투명 처리
window.statusBarColor = colorScheme.surface.toArgb() window.statusBarColor = colorScheme.background.toArgb()
window.navigationBarColor = colorScheme.surface.toArgb() window.navigationBarColor = colorScheme.background.toArgb()
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme
WindowCompat.getInsetsController(window, view).isAppearanceLightNavigationBars = !darkTheme WindowCompat.getInsetsController(window, view).isAppearanceLightNavigationBars = !darkTheme
} }