Refine primary and toolbar actions, align row buttons, normalize status surfaces, and split storage from destructive cleanup. Verified with Swift tests and the simulator build.
127 lines
5.8 KiB
Swift
127 lines
5.8 KiB
Swift
import SwiftUI
|
|
|
|
#if canImport(UIKit)
|
|
import UIKit
|
|
#elseif canImport(AppKit)
|
|
import AppKit
|
|
#endif
|
|
|
|
private enum AIPalette {
|
|
#if canImport(UIKit)
|
|
private static func dynamicColor(light: UIColor, dark: UIColor) -> Color {
|
|
Color(
|
|
UIColor { traits in
|
|
traits.userInterfaceStyle == .dark ? dark : light
|
|
})
|
|
}
|
|
|
|
private static func rgba(
|
|
_ red: CGFloat,
|
|
_ green: CGFloat,
|
|
_ blue: CGFloat,
|
|
_ alpha: CGFloat
|
|
) -> UIColor {
|
|
UIColor(red: red / 255, green: green / 255, blue: blue / 255, alpha: alpha)
|
|
}
|
|
|
|
private static func color(light: UIColor, dark: UIColor) -> Color {
|
|
dynamicColor(light: light, dark: dark)
|
|
}
|
|
|
|
static let canvas = color(light: rgba(245, 246, 248, 1), dark: rgba(6, 7, 9, 1))
|
|
static let surface = color(light: rgba(255, 255, 255, 1), dark: rgba(18, 20, 24, 1))
|
|
static let surfaceRaised = color(light: rgba(251, 252, 253, 1), dark: rgba(27, 30, 35, 1))
|
|
static let control = color(light: rgba(243, 245, 247, 1), dark: rgba(26, 29, 34, 1))
|
|
static let chrome = color(light: rgba(255, 255, 255, 0.82), dark: rgba(11, 12, 15, 0.82))
|
|
static let ink = color(light: rgba(15, 18, 22, 1), dark: rgba(243, 245, 247, 1))
|
|
static let muted = color(light: rgba(98, 107, 119, 1), dark: rgba(151, 160, 172, 1))
|
|
static let line = color(light: rgba(227, 230, 234, 1), dark: rgba(255, 255, 255, 0.09))
|
|
static let brand = color(light: rgba(13, 15, 18, 1), dark: rgba(8, 9, 11, 1))
|
|
static let primary = color(light: rgba(17, 20, 25, 1), dark: rgba(220, 178, 111, 1))
|
|
static let primaryTop = color(light: rgba(43, 49, 58, 1), dark: rgba(240, 209, 154, 1))
|
|
static let primaryBottom = color(light: rgba(15, 18, 22, 1), dark: rgba(198, 154, 92, 1))
|
|
static let onPrimary = color(light: rgba(255, 255, 255, 1), dark: rgba(12, 14, 17, 1))
|
|
static let danger = color(light: rgba(190, 65, 57, 1), dark: rgba(242, 124, 113, 1))
|
|
static let onDanger = color(light: rgba(255, 255, 255, 1), dark: rgba(22, 9, 8, 1))
|
|
static let warning = color(light: rgba(170, 111, 23, 1), dark: rgba(226, 166, 65, 1))
|
|
static let success = color(light: rgba(50, 150, 101, 1), dark: rgba(103, 198, 148, 1))
|
|
#elseif canImport(AppKit)
|
|
static let canvas = Color(red: 0.953, green: 0.961, blue: 0.973)
|
|
static let surface = Color.white
|
|
static let control = Color(red: 0.969, green: 0.976, blue: 0.984)
|
|
static let ink = Color(red: 0.110, green: 0.153, blue: 0.220)
|
|
static let muted = Color(red: 0.435, green: 0.486, blue: 0.561)
|
|
static let line = Color(red: 0.878, green: 0.898, blue: 0.922)
|
|
static let brand = Color(red: 0.075, green: 0.118, blue: 0.188)
|
|
static let surfaceRaised = Color(red: 0.984, green: 0.988, blue: 0.992)
|
|
static let chrome = Color.white.opacity(0.82)
|
|
static let onPrimary = Color.white
|
|
static let onDanger = Color.white
|
|
static let primary = Color(red: 0.067, green: 0.078, blue: 0.098)
|
|
static let primaryTop = Color(red: 0.17, green: 0.19, blue: 0.23)
|
|
static let primaryBottom = Color(red: 0.06, green: 0.07, blue: 0.09)
|
|
static let danger = Color(red: 0.745, green: 0.255, blue: 0.224)
|
|
static let warning = Color(red: 0.667, green: 0.435, blue: 0.09)
|
|
static let success = Color(red: 0.196, green: 0.588, blue: 0.396)
|
|
#else
|
|
private static func color(_ red: CGFloat, _ green: CGFloat, _ blue: CGFloat) -> Color {
|
|
Color(red: red / 255, green: green / 255, blue: blue / 255)
|
|
}
|
|
|
|
static let canvas = color(243, 245, 248)
|
|
static let surface = color(255, 255, 255)
|
|
static let control = color(247, 249, 251)
|
|
static let ink = color(28, 39, 56)
|
|
static let muted = color(111, 124, 143)
|
|
static let line = color(224, 229, 235)
|
|
static let brand = color(19, 30, 48)
|
|
static let surfaceRaised = color(251, 252, 253)
|
|
static let chrome = color(255, 255, 255, 0.82)
|
|
static let onPrimary = color(255, 255, 255)
|
|
static let onDanger = color(255, 255, 255)
|
|
static let primary = color(17, 20, 25)
|
|
static let primaryTop = color(43, 49, 58)
|
|
static let primaryBottom = color(15, 18, 22)
|
|
static let danger = color(190, 65, 57)
|
|
static let warning = color(170, 111, 23)
|
|
static let success = color(50, 150, 101)
|
|
#endif
|
|
}
|
|
|
|
public enum AITheme {
|
|
public static let canvas = AIPalette.canvas
|
|
public static let surface = AIPalette.surface
|
|
public static let surfaceRaised = AIPalette.surfaceRaised
|
|
public static let control = AIPalette.control
|
|
public static let chrome = AIPalette.chrome
|
|
public static let ink = AIPalette.ink
|
|
public static let muted = AIPalette.muted
|
|
public static let line = AIPalette.line
|
|
public static let brand = AIPalette.brand
|
|
public static let primary = AIPalette.primary
|
|
public static let primaryTop = AIPalette.primaryTop
|
|
public static let primaryBottom = AIPalette.primaryBottom
|
|
public static let onPrimary = AIPalette.onPrimary
|
|
public static let danger = AIPalette.danger
|
|
public static let onDanger = AIPalette.onDanger
|
|
public static let warning = AIPalette.warning
|
|
public static let success = AIPalette.success
|
|
|
|
public static let buttonHeight: CGFloat = 48
|
|
public static let compactButtonHeight: CGFloat = 44
|
|
public static let largeButtonHeight: CGFloat = 56
|
|
public static let toolbarButtonHeight: CGFloat = 44
|
|
public static let iconButtonSize: CGFloat = 44
|
|
public static let buttonRadius: CGFloat = 16
|
|
public static let cardRadius: CGFloat = 22
|
|
public static let inputRadius: CGFloat = 16
|
|
public static let inputHeight: CGFloat = 52
|
|
public static let segmentedControlHeight: CGFloat = 44
|
|
public static let compactButtonMinWidth: CGFloat = 72
|
|
public static let regularButtonMinWidth: CGFloat = 88
|
|
public static let toolbarButtonMinWidth: CGFloat = 96
|
|
public static let toolbarButtonWidth: CGFloat = 104
|
|
public static let footerSecondaryButtonWidth: CGFloat = 104
|
|
public static let listActionButtonWidth: CGFloat = 84
|
|
}
|