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