| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- 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
- }
- init() {
- if UserDefaults.standard.object(forKey: Self.storageKey) != nil {
- isDarkMode = UserDefaults.standard.bool(forKey: Self.storageKey)
- } else {
- isDarkMode = true
- }
- }
- }
- struct ThemePalette {
- 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(
- 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(
- 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)
- )
- }
|