| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- import AppKit
- import Foundation
- import SwiftUI
- @MainActor
- @Observable
- final class AppearanceManager {
- static let shared = AppearanceManager()
- private static let storageKey = "isDarkMode"
- var isDarkMode: Bool {
- didSet {
- guard isDarkMode != oldValue else { return }
- UserDefaults.standard.set(isDarkMode, forKey: Self.storageKey)
- }
- }
- var palette: ThemePalette {
- isDarkMode ? .dark : .light
- }
- var webUnderPageBackgroundColor: NSColor {
- Self.webUnderPageBackgroundColor(isDarkMode: isDarkMode)
- }
- static func webUnderPageBackgroundColor(isDarkMode: Bool) -> NSColor {
- NSColor(hex: (isDarkMode ? ThemePalette.dark : ThemePalette.light).webUnderPageBackgroundHex)
- }
- init() {
- if UserDefaults.standard.object(forKey: Self.storageKey) != nil {
- isDarkMode = UserDefaults.standard.bool(forKey: Self.storageKey)
- } else {
- isDarkMode = true
- }
- }
- }
- struct ThemePalette {
- let webUnderPageBackgroundHex: UInt
- let background: Color
- let sidebarBackground: Color
- let panelBackground: Color
- let cardBackground: Color
- let quickAccessBackground: Color
- let border: Color
- let cardBorder: Color
- let textPrimary: Color
- let textSecondary: Color
- let textTertiary: Color
- let hoverFill: Color
- let hoverBorder: Color
- let selectedRowFill: Color
- let scrim: Color
- static let dark = ThemePalette(
- webUnderPageBackgroundHex: 0x0B0E14,
- background: Color(hex: 0x0B0E14),
- sidebarBackground: Color(hex: 0x0B0E14),
- panelBackground: Color(hex: 0x11141C),
- cardBackground: Color(hex: 0x151922),
- quickAccessBackground: Color(hex: 0x151922),
- border: Color.white.opacity(0.06),
- cardBorder: Color.white.opacity(0.08),
- textPrimary: Color.white,
- textSecondary: Color(hex: 0x8E9297),
- textTertiary: Color(hex: 0x6B7280),
- hoverFill: Color.white.opacity(0.06),
- hoverBorder: Color.white.opacity(0.14),
- selectedRowFill: Color.white.opacity(0.05),
- scrim: Color.black.opacity(0.35)
- )
- static let light = ThemePalette(
- webUnderPageBackgroundHex: 0xFFFFFF,
- background: Color(hex: 0xF5F6F8),
- sidebarBackground: Color(hex: 0xFFFFFF),
- panelBackground: Color(hex: 0xF9FAFB),
- cardBackground: Color(hex: 0xFFFFFF),
- quickAccessBackground: Color(hex: 0xF0F2F5),
- border: Color(hex: 0xE5E7EB),
- cardBorder: Color(hex: 0xD1D5DB),
- textPrimary: Color(hex: 0x111827),
- textSecondary: Color(hex: 0x6B7280),
- textTertiary: Color(hex: 0x9CA3AF),
- hoverFill: Color.black.opacity(0.05),
- hoverBorder: Color(hex: 0x9CA3AF),
- selectedRowFill: Color.black.opacity(0.06),
- scrim: Color.black.opacity(0.25)
- )
- }
- private extension NSColor {
- convenience init(hex: UInt, alpha: CGFloat = 1.0) {
- self.init(
- red: CGFloat((hex >> 16) & 0xFF) / 255,
- green: CGFloat((hex >> 8) & 0xFF) / 255,
- blue: CGFloat(hex & 0xFF) / 255,
- alpha: alpha
- )
- }
- }
|