AppTheme.swift 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import SwiftUI
  2. enum AppTheme {
  3. static let windowWidth: CGFloat = 1100
  4. static let windowHeight: CGFloat = 720
  5. static let windowMinWidth: CGFloat = windowWidth
  6. static let windowMinHeight: CGFloat = windowHeight
  7. static let sidebarWidth: CGFloat = 240
  8. static let headerTopInset: CGFloat = 24
  9. static let logoMarkSize: CGFloat = 36
  10. /// Extra top inset so the sidebar logo clears the window traffic lights.
  11. static let trafficLightClearance: CGFloat = 16
  12. static let contentPadding: CGFloat = 40
  13. static let contentCardPadding: CGFloat = 14
  14. static let contentCardTopPadding: CGFloat = 18
  15. static let contentCardLeadingPadding: CGFloat = 20
  16. static let contentCardBottomPadding: CGFloat = 16
  17. static let contentCardSpacing: CGFloat = 10
  18. static let yourContentLogoHeight: CGFloat = 46
  19. static var sidebarLogoTopInset: CGFloat {
  20. headerTopInset + trafficLightClearance
  21. }
  22. static let sidebarLogoBottomSpacing: CGFloat = 20
  23. /// Aligns tool page titles with the sidebar "Gramora" label.
  24. static var brandLabelTopInset: CGFloat {
  25. headerTopInset + (logoMarkSize - 22) / 2
  26. }
  27. static let cardCornerRadius: CGFloat = 16
  28. static let buttonCornerRadius: CGFloat = 14
  29. static let navItemCornerRadius: CGFloat = 10
  30. static let inputCornerRadius: CGFloat = 12
  31. static let textEditorHorizontalInset: CGFloat = 20
  32. static let textEditorVerticalInset: CGFloat = 20
  33. static let compactTextEditorHeight: CGFloat = 240
  34. private static var isDark: Bool {
  35. UserDefaults.standard.bool(forKey: ThemeManager.storageKey)
  36. }
  37. static var background: Color {
  38. isDark
  39. ? Color(red: 0.08, green: 0.09, blue: 0.11)
  40. : Color(red: 0.973, green: 0.980, blue: 0.984)
  41. }
  42. static var sidebarBackground: Color {
  43. isDark
  44. ? Color(red: 0.11, green: 0.12, blue: 0.15)
  45. : Color.white
  46. }
  47. static var cardBackground: Color {
  48. isDark
  49. ? Color(red: 0.14, green: 0.15, blue: 0.18)
  50. : Color.white
  51. }
  52. static var surface: Color { cardBackground }
  53. static var sectionBackground: Color {
  54. isDark
  55. ? Color(red: 0.12, green: 0.13, blue: 0.16)
  56. : Color(red: 0.98, green: 0.99, blue: 0.99)
  57. }
  58. static var panelBackground: Color {
  59. isDark
  60. ? Color(red: 0.10, green: 0.11, blue: 0.13)
  61. : Color(red: 0.96, green: 0.97, blue: 0.98)
  62. }
  63. static var textPrimary: Color {
  64. isDark
  65. ? Color(red: 0.94, green: 0.95, blue: 0.97)
  66. : Color(red: 0.10, green: 0.14, blue: 0.22)
  67. }
  68. static var textSecondary: Color {
  69. isDark
  70. ? Color(red: 0.74, green: 0.77, blue: 0.82)
  71. : Color(red: 0.28, green: 0.32, blue: 0.38)
  72. }
  73. static var textMuted: Color {
  74. isDark
  75. ? Color(red: 0.54, green: 0.57, blue: 0.62)
  76. : Color(red: 0.42, green: 0.46, blue: 0.50)
  77. }
  78. static var border: Color {
  79. isDark
  80. ? Color(red: 0.24, green: 0.26, blue: 0.30)
  81. : Color(red: 0.78, green: 0.82, blue: 0.87)
  82. }
  83. static var inputBorder: Color { border }
  84. static let teal = Color(red: 0.0, green: 0.651, blue: 0.494)
  85. static let tealDark = Color(red: 0.0, green: 0.55, blue: 0.42)
  86. static var tealLight: Color {
  87. isDark
  88. ? Color(red: 0.0, green: 0.651, blue: 0.494).opacity(0.16)
  89. : Color(red: 0.90, green: 0.97, blue: 0.94)
  90. }
  91. static let gradientStart = Color(red: 0.0, green: 0.62, blue: 0.47)
  92. static let gradientEnd = Color(red: 0.20, green: 0.78, blue: 0.60)
  93. static var premiumBackground: Color {
  94. isDark
  95. ? Color(red: 0.0, green: 0.651, blue: 0.494).opacity(0.12)
  96. : Color(red: 0.91, green: 0.97, blue: 0.95)
  97. }
  98. static var premiumBorder: Color {
  99. isDark
  100. ? Color(red: 0.0, green: 0.651, blue: 0.494).opacity(0.28)
  101. : Color(red: 0.82, green: 0.93, blue: 0.88)
  102. }
  103. static var cardShadow: Color {
  104. Color.black.opacity(isDark ? 0.24 : 0.06)
  105. }
  106. static var clearBackground: Color {
  107. isDark
  108. ? Color(red: 0.28, green: 0.12, blue: 0.14)
  109. : Color(red: 1.0, green: 0.95, blue: 0.94)
  110. }
  111. static var clearBackgroundHover: Color {
  112. isDark
  113. ? Color(red: 0.34, green: 0.14, blue: 0.16)
  114. : Color(red: 1.0, green: 0.91, blue: 0.90)
  115. }
  116. static let clearForeground = Color(red: 0.82, green: 0.32, blue: 0.36)
  117. static let clearForegroundHover = Color(red: 0.72, green: 0.22, blue: 0.28)
  118. static var clearBorder: Color {
  119. isDark
  120. ? Color(red: 0.82, green: 0.32, blue: 0.36).opacity(0.35)
  121. : Color(red: 0.94, green: 0.80, blue: 0.80)
  122. }
  123. static let clearShadow = Color(red: 0.82, green: 0.32, blue: 0.36).opacity(0.18)
  124. static var toolbarBackgroundHover: Color {
  125. isDark
  126. ? Color(red: 0.18, green: 0.19, blue: 0.22)
  127. : Color(red: 0.96, green: 0.99, blue: 0.98)
  128. }
  129. static let toolbarForegroundHover = teal
  130. static var toolbarBorderHover: Color {
  131. teal.opacity(isDark ? 0.45 : 0.35)
  132. }
  133. static var toolbarShadow: Color {
  134. Color.black.opacity(isDark ? 0.18 : 0.03)
  135. }
  136. static var toolbarShadowHover: Color {
  137. Color.black.opacity(isDark ? 0.28 : 0.08)
  138. }
  139. static let gradientStartHover = Color(red: 0.0, green: 0.68, blue: 0.52)
  140. static let gradientEndHover = Color(red: 0.25, green: 0.84, blue: 0.66)
  141. static let primaryShadow = teal.opacity(0.30)
  142. static let primaryShadowHover = teal.opacity(0.42)
  143. static var navBackgroundHover: Color {
  144. isDark
  145. ? Color(red: 0.0, green: 0.651, blue: 0.494).opacity(0.14)
  146. : Color(red: 0.88, green: 0.96, blue: 0.93)
  147. }
  148. static let navForegroundHover = teal
  149. static var primaryGradient: LinearGradient {
  150. LinearGradient(
  151. colors: [gradientStart, gradientEnd],
  152. startPoint: .leading,
  153. endPoint: .trailing
  154. )
  155. }
  156. static var primaryGradientHover: LinearGradient {
  157. LinearGradient(
  158. colors: [gradientStartHover, gradientEndHover],
  159. startPoint: .leading,
  160. endPoint: .trailing
  161. )
  162. }
  163. }