54 lines
1.8 KiB
Swift
54 lines
1.8 KiB
Swift
import SwiftUI
|
|
|
|
/// Mirrors the Kotlin `WidgetPalette` in WidgetRenderer.kt so day/week widgets
|
|
/// look identical across platforms. All values are hex tokens from the in-app
|
|
/// LightAppTheme / DarkAppTheme — do not swap to system colors, the whole
|
|
/// point is platform-independent branding.
|
|
struct WidgetPalette {
|
|
let background: Color
|
|
let textPrimary: Color
|
|
let textSecondary: Color
|
|
let divider: Color
|
|
let breakBlock: Color
|
|
let watermarkOpacity: Double
|
|
|
|
static let light = WidgetPalette(
|
|
background: Color(red: 0xFC / 255, green: 0xF7 / 255, blue: 0xF5 / 255),
|
|
textPrimary: Color(red: 0x11 / 255, green: 0x11 / 255, blue: 0x11 / 255),
|
|
textSecondary: Color(red: 0x55 / 255, green: 0x55 / 255, blue: 0x55 / 255),
|
|
divider: Color.black.opacity(0x22 / 255.0),
|
|
breakBlock: Color.black.opacity(0x0C / 255.0),
|
|
watermarkOpacity: 0.014
|
|
)
|
|
|
|
static let dark = WidgetPalette(
|
|
background: Color(red: 0x1F / 255, green: 0x17 / 255, blue: 0x16 / 255),
|
|
textPrimary: Color(red: 0xF1 / 255, green: 0xF1 / 255, blue: 0xF1 / 255),
|
|
textSecondary: Color(red: 0xB0 / 255, green: 0xB0 / 255, blue: 0xB0 / 255),
|
|
divider: Color.white.opacity(0x33 / 255.0),
|
|
breakBlock: Color.white.opacity(0x14 / 255.0),
|
|
watermarkOpacity: 0.025
|
|
)
|
|
|
|
static func resolve(themeMode: String, colorScheme: ColorScheme) -> WidgetPalette {
|
|
let isDark: Bool
|
|
switch themeMode {
|
|
case "light": isDark = false
|
|
case "dark": isDark = true
|
|
default: isDark = colorScheme == .dark
|
|
}
|
|
return isDark ? .dark : .light
|
|
}
|
|
}
|
|
|
|
private struct WidgetPaletteKey: EnvironmentKey {
|
|
static let defaultValue = WidgetPalette.light
|
|
}
|
|
|
|
extension EnvironmentValues {
|
|
var widgetPalette: WidgetPalette {
|
|
get { self[WidgetPaletteKey.self] }
|
|
set { self[WidgetPaletteKey.self] = newValue }
|
|
}
|
|
}
|