AppearanceManager.swift 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import Foundation
  2. import SwiftUI
  3. @MainActor
  4. @Observable
  5. final class AppearanceManager {
  6. static let shared = AppearanceManager()
  7. private static let storageKey = "isDarkMode"
  8. var isDarkMode: Bool {
  9. didSet {
  10. guard isDarkMode != oldValue else { return }
  11. UserDefaults.standard.set(isDarkMode, forKey: Self.storageKey)
  12. }
  13. }
  14. var palette: ThemePalette {
  15. isDarkMode ? .dark : .light
  16. }
  17. init() {
  18. if UserDefaults.standard.object(forKey: Self.storageKey) != nil {
  19. isDarkMode = UserDefaults.standard.bool(forKey: Self.storageKey)
  20. } else {
  21. isDarkMode = true
  22. }
  23. }
  24. }
  25. struct ThemePalette {
  26. let background: Color
  27. let sidebarBackground: Color
  28. let panelBackground: Color
  29. let cardBackground: Color
  30. let quickAccessBackground: Color
  31. let border: Color
  32. let cardBorder: Color
  33. let textPrimary: Color
  34. let textSecondary: Color
  35. let textTertiary: Color
  36. let hoverFill: Color
  37. let hoverBorder: Color
  38. let selectedRowFill: Color
  39. let scrim: Color
  40. static let dark = ThemePalette(
  41. background: Color(hex: 0x0B0E14),
  42. sidebarBackground: Color(hex: 0x0B0E14),
  43. panelBackground: Color(hex: 0x11141C),
  44. cardBackground: Color(hex: 0x151922),
  45. quickAccessBackground: Color(hex: 0x151922),
  46. border: Color.white.opacity(0.06),
  47. cardBorder: Color.white.opacity(0.08),
  48. textPrimary: Color.white,
  49. textSecondary: Color(hex: 0x8E9297),
  50. textTertiary: Color(hex: 0x6B7280),
  51. hoverFill: Color.white.opacity(0.06),
  52. hoverBorder: Color.white.opacity(0.14),
  53. selectedRowFill: Color.white.opacity(0.05),
  54. scrim: Color.black.opacity(0.35)
  55. )
  56. static let light = ThemePalette(
  57. background: Color(hex: 0xF5F6F8),
  58. sidebarBackground: Color(hex: 0xFFFFFF),
  59. panelBackground: Color(hex: 0xF9FAFB),
  60. cardBackground: Color(hex: 0xFFFFFF),
  61. quickAccessBackground: Color(hex: 0xF0F2F5),
  62. border: Color(hex: 0xE5E7EB),
  63. cardBorder: Color(hex: 0xD1D5DB),
  64. textPrimary: Color(hex: 0x111827),
  65. textSecondary: Color(hex: 0x6B7280),
  66. textTertiary: Color(hex: 0x9CA3AF),
  67. hoverFill: Color.black.opacity(0.05),
  68. hoverBorder: Color(hex: 0x9CA3AF),
  69. selectedRowFill: Color.black.opacity(0.06),
  70. scrim: Color.black.opacity(0.25)
  71. )
  72. }