60 lines
1.7 KiB
Swift
60 lines
1.7 KiB
Swift
import SwiftUI
|
|
|
|
public struct AIButtonStyle: ButtonStyle {
|
|
public enum Kind: Hashable {
|
|
case primary
|
|
case secondary
|
|
case danger
|
|
|
|
var foregroundColor: Color {
|
|
switch self {
|
|
case .primary, .danger: return .white
|
|
case .secondary: return AITheme.ink
|
|
}
|
|
}
|
|
|
|
var backgroundColor: Color {
|
|
switch self {
|
|
case .primary: return AITheme.primary
|
|
case .secondary: return AITheme.surface
|
|
case .danger: return AITheme.danger
|
|
}
|
|
}
|
|
}
|
|
|
|
public enum Size: Hashable {
|
|
case compact
|
|
case regular
|
|
case large
|
|
}
|
|
|
|
private let kind: Kind
|
|
private let size: Size
|
|
|
|
public init(kind: Kind = .secondary, size: Size = .regular) {
|
|
self.kind = kind
|
|
self.size = size
|
|
}
|
|
|
|
public func makeBody(configuration: Configuration) -> some View {
|
|
let height: CGFloat = switch size {
|
|
case .compact: AITheme.compactButtonHeight
|
|
case .large: AITheme.largeButtonHeight
|
|
case .regular: AITheme.buttonHeight
|
|
}
|
|
|
|
configuration.label
|
|
.font(.system(size: 15, weight: .semibold))
|
|
.foregroundStyle(kind.foregroundColor)
|
|
.frame(minWidth: 44, minHeight: height)
|
|
.padding(.horizontal, 14)
|
|
.background(kind.backgroundColor)
|
|
.clipShape(RoundedRectangle(cornerRadius: AITheme.buttonRadius))
|
|
.overlay {
|
|
RoundedRectangle(cornerRadius: AITheme.buttonRadius)
|
|
.strokeBorder(kind == .secondary ? AITheme.line : .clear)
|
|
}
|
|
.opacity(configuration.isPressed ? 0.78 : 1)
|
|
}
|
|
}
|