forked from shadowfacts/Tusker
176 lines
5.3 KiB
Swift
176 lines
5.3 KiB
Swift
//
|
|
// Colors.swift
|
|
// Tusker
|
|
//
|
|
// Created by Shadowfacts on 1/31/23.
|
|
// Copyright © 2023 Shadowfacts. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import SwiftUI
|
|
|
|
extension UIColor {
|
|
static let appBackground = UIColor { traitCollection in
|
|
if case .dark = traitCollection.userInterfaceStyle,
|
|
!traitCollection.pureBlackDarkMode {
|
|
return UIColor(hue: 230/360, saturation: 23/100, brightness: 10/100, alpha: 1)
|
|
} else {
|
|
return .systemBackground
|
|
}
|
|
}
|
|
|
|
static let appSecondaryBackground = UIColor { traitCollection in
|
|
if case .dark = traitCollection.userInterfaceStyle,
|
|
!traitCollection.pureBlackDarkMode {
|
|
if traitCollection.userInterfaceLevel == .elevated {
|
|
return UIColor(hue: 230/360, saturation: 23/100, brightness: 10/100, alpha: 1)
|
|
} else {
|
|
return UIColor(hue: 230/360, saturation: 23/100, brightness: 5/100, alpha: 1)
|
|
}
|
|
} else {
|
|
return .secondarySystemBackground
|
|
}
|
|
}
|
|
|
|
static let appGroupedBackground = UIColor { traitCollection in
|
|
if case .dark = traitCollection.userInterfaceStyle,
|
|
!traitCollection.pureBlackDarkMode {
|
|
return .appSecondaryBackground
|
|
} else {
|
|
return .systemGroupedBackground
|
|
}
|
|
}
|
|
|
|
static let appSelectedCellBackground = UIColor { traitCollection in
|
|
if case .dark = traitCollection.userInterfaceStyle,
|
|
!traitCollection.pureBlackDarkMode {
|
|
return UIColor(hue: 230/360, saturation: 20/100, brightness: 27/100, alpha: 1)
|
|
} else {
|
|
return .systemFill
|
|
}
|
|
}
|
|
|
|
static let appGroupedCellBackground = UIColor { traitCollection in
|
|
if case .dark = traitCollection.userInterfaceStyle {
|
|
if traitCollection.pureBlackDarkMode {
|
|
return .secondarySystemBackground
|
|
} else {
|
|
return .appFill
|
|
}
|
|
} else {
|
|
return .systemBackground
|
|
}
|
|
}
|
|
|
|
static let appFill = UIColor { traitCollection in
|
|
if case .dark = traitCollection.userInterfaceStyle,
|
|
!traitCollection.pureBlackDarkMode {
|
|
return UIColor(hue: 230/360, saturation: 20/100, brightness: 17/100, alpha: 1)
|
|
} else {
|
|
return .systemFill
|
|
}
|
|
}
|
|
}
|
|
|
|
extension Color {
|
|
static let appBackground = Color(uiColor: .appBackground)
|
|
static let appGroupedBackground = Color(uiColor: .appGroupedBackground)
|
|
static let appSecondaryBackground = Color(uiColor: .appSecondaryBackground)
|
|
static let appSelectedCellBackground = Color(uiColor: .appGroupedCellBackground)
|
|
static let appGroupedCellBackground = Color(uiColor: .appGroupedCellBackground)
|
|
static let appFill = Color(uiColor: .appFill)
|
|
}
|
|
|
|
#if !os(visionOS)
|
|
@available(iOS, obsoleted: 17.0)
|
|
private let traitsKey: String = ["Traits", "Defined", "client", "_"].reversed().joined()
|
|
@available(iOS, obsoleted: 17.0)
|
|
private let key = "tusker_usePureBlackDarkMode"
|
|
#endif
|
|
|
|
@available(iOS 17.0, *)
|
|
private struct PureBlackDarkModeTrait: UITraitDefinition {
|
|
static let defaultValue = true
|
|
static let affectsColorAppearance = true
|
|
}
|
|
|
|
extension UITraitCollection {
|
|
var pureBlackDarkMode: Bool {
|
|
if #available(iOS 17.0, *) {
|
|
return self[PureBlackDarkModeTrait.self]
|
|
} else {
|
|
#if os(visionOS)
|
|
return true // unreachable
|
|
#else
|
|
return obsoletePureBlackDarkMode
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#if !os(visionOS)
|
|
@available(iOS, obsoleted: 17.0)
|
|
var obsoletePureBlackDarkMode: Bool {
|
|
get {
|
|
// default to true to match OS behavior
|
|
(value(forKey: traitsKey) as? [String: Any])?[key] as? Bool ?? true
|
|
}
|
|
set {
|
|
var dict = value(forKey: traitsKey) as? [String: Any] ?? [:]
|
|
dict[key] = newValue
|
|
setValue(dict, forKey: traitsKey)
|
|
}
|
|
}
|
|
#endif
|
|
|
|
convenience init(pureBlackDarkMode: Bool) {
|
|
if #available(iOS 17.0, visionOS 1.0, *) {
|
|
self.init(PureBlackDarkModeTrait.self, value: pureBlackDarkMode)
|
|
} else {
|
|
self.init()
|
|
#if os(visionOS)
|
|
// unreachable
|
|
#else
|
|
self.obsoletePureBlackDarkMode = pureBlackDarkMode
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
|
|
@available(iOS 17.0, *)
|
|
extension UIMutableTraits {
|
|
var pureBlackDarkMode: Bool {
|
|
get { self[PureBlackDarkModeTrait.self] }
|
|
set { self[PureBlackDarkModeTrait.self] = newValue }
|
|
}
|
|
}
|
|
|
|
@available(iOS 17.0, *)
|
|
private struct PureBlackDarkModeKey: UITraitBridgedEnvironmentKey {
|
|
static let defaultValue: Bool = false
|
|
|
|
static func read(from traitCollection: UITraitCollection) -> Bool {
|
|
traitCollection[PureBlackDarkModeTrait.self]
|
|
}
|
|
|
|
static func write(to mutableTraits: inout any UIMutableTraits, value: Bool) {
|
|
mutableTraits[PureBlackDarkModeTrait.self] = value
|
|
}
|
|
}
|
|
|
|
extension EnvironmentValues {
|
|
var pureBlackDarkMode: Bool {
|
|
get {
|
|
if #available(iOS 17.0, *) {
|
|
self[PureBlackDarkModeKey.self]
|
|
} else {
|
|
true
|
|
}
|
|
}
|
|
set {
|
|
if #available(iOS 17.0, *) {
|
|
self[PureBlackDarkModeKey.self] = newValue
|
|
}
|
|
}
|
|
}
|
|
}
|