|
|
import AppKit
|
|
|
import SwiftUI
|
|
|
|
|
|
/// Musubi design tokens. Source of truth: design/tokens.json and docs/03-design.md.
|
|
|
public enum Theme {
|
|
|
public enum Color {
|
|
|
public static let sumi = adaptive(dark: 0x14151B, light: 0xF4F4F6) // background
|
|
|
public static let kasumi = adaptive(dark: 0x1E2029, light: 0xFFFFFF) // surface
|
|
|
public static let usuzumi = adaptive(dark: 0x2B2E3A, light: 0xDADBE2) // lines
|
|
|
public static let washi = adaptive(dark: 0xECE9E2, light: 0x16171D) // text
|
|
|
public static let nezumi = adaptive(dark: 0x8E8C96, light: 0x6A6974) // muted text
|
|
|
public static let ai = adaptive(dark: 0x8A99F2, light: 0x4F63D9) // the one brand accent
|
|
|
|
|
|
// Status colours – only for states, never decoration.
|
|
|
public static let shu = SwiftUI.Color(hex: 0xE5484D) // tally PGM, talk active
|
|
|
public static let moegi = SwiftUI.Color(hex: 0x3DBE7A) // tally preview, connection ok
|
|
|
public static let kohaku = SwiftUI.Color(hex: 0xE8A23A) // warning
|
|
|
}
|
|
|
|
|
|
public enum Radius { public static let card: CGFloat = 12, button: CGFloat = 8, chip: CGFloat = 6 }
|
|
|
public enum Space { public static let unit: CGFloat = 8, card: CGFloat = 16 }
|
|
|
public enum Stroke { public static let line: CGFloat = 1, cord: CGFloat = 2, knot: CGFloat = 6 }
|
|
|
|
|
|
public enum Font {
|
|
|
public static let title = SwiftUI.Font.system(.title3, weight: .semibold)
|
|
|
public static let body = SwiftUI.Font.system(.body)
|
|
|
public static let caption = SwiftUI.Font.system(.caption)
|
|
|
public static let number = SwiftUI.Font.system(.body, design: .monospaced).monospacedDigit()
|
|
|
}
|
|
|
|
|
|
private static func adaptive(dark: UInt32, light: UInt32) -> SwiftUI.Color {
|
|
|
SwiftUI.Color(nsColor: NSColor(name: nil) { appearance in
|
|
|
appearance.bestMatch(from: [.darkAqua, .aqua]) == .darkAqua
|
|
|
? NSColor(hex: dark) : NSColor(hex: light)
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
|
|
|
extension SwiftUI.Color {
|
|
|
public init(hex: UInt32) { self.init(nsColor: NSColor(hex: hex)) }
|
|
|
}
|
|
|
|
|
|
extension NSColor {
|
|
|
public convenience init(hex: UInt32) {
|
|
|
self.init(srgbRed: CGFloat((hex >> 16) & 0xFF) / 255,
|
|
|
green: CGFloat((hex >> 8) & 0xFF) / 255,
|
|
|
blue: CGFloat(hex & 0xFF) / 255,
|
|
|
alpha: 1)
|
|
|
}
|
|
|
}
|