Skip to content

Instantly share code, notes, and snippets.

@VladislavSmolyanoy
Last active March 31, 2025 04:52
Show Gist options
  • Save VladislavSmolyanoy/4486cdfc727121ff8ce977e61d42017b to your computer and use it in GitHub Desktop.
Save VladislavSmolyanoy/4486cdfc727121ff8ce977e61d42017b to your computer and use it in GitHub Desktop.
Pretty Button Styling for macOS Apps (from SwiftyLaunch)
// Source: SwiftyLaunch
import SwiftUI
let commonButtonRadius = 7.5
let commonButtonHeight = 35.0
let commonButtonFontStyle: Font = .system(.title3, weight: .semibold)
public struct CTAButtonStyle: ButtonStyle {
private let disabled: Bool
init(disabled: Bool) {
self.disabled = disabled
}
public func makeBody(configuration: Configuration) -> some View {
configuration.label
.font(commonButtonFontStyle)
.frame(height: commonButtonHeight)
.padding(.horizontal)
.foregroundStyle(Color.white)
.background(Color.accentColor.gradient)
.clipShape(RoundedRectangle(cornerRadius: commonButtonRadius, style: .continuous))
.overlay(
RoundedRectangle(cornerRadius: commonButtonRadius)
.strokeBorder(.quaternary, lineWidth: 0.5)
)
.opacity(configuration.isPressed ? 0.9 : 1)
.opacity(disabled ? 0.4 : 1)
}
}
extension ButtonStyle where Self == CTAButtonStyle {
public static func cta(disabled: Bool = false) -> Self {
CTAButtonStyle(disabled: disabled)
}
}
public struct SecondaryButtonStyle: ButtonStyle {
private let disabled: Bool
public init(disabled: Bool = false) {
self.disabled = disabled
}
public func makeBody(configuration: Configuration) -> some View {
configuration.label
.font(commonButtonFontStyle)
.frame(height: commonButtonHeight)
.padding(.horizontal)
.foregroundStyle(Color(nsColor: disabled ? NSColor.disabledControlTextColor : NSColor.secondaryLabelColor))
.background(.quaternary)
.clipShape(RoundedRectangle(cornerRadius: commonButtonRadius, style: .continuous))
.overlay(
RoundedRectangle(cornerRadius: commonButtonRadius)
.strokeBorder(.quaternary, lineWidth: 0.5)
)
.opacity(configuration.isPressed ? 0.7 : 1)
.opacity(disabled ? 0.7 : 1)
}
}
extension ButtonStyle where Self == SecondaryButtonStyle {
public static func secondary(disabled: Bool = false) -> Self {
SecondaryButtonStyle(disabled: disabled)
}
}
// Usage example straight from the SwiftyLaunch app
HStack {
Spacer()
HStack {
Button("Go Back") {
// back action
}
.buttonStyle(.secondary())
.keyboardShortcut(.cancelAction)
Button(true ? "Generate App" : "Next") {
// next action
}
.contentTransition(.numericText())
.buttonStyle(.cta(disabled: false))
.disabled(false)
.keyboardShortcut(.defaultAction)
}
.padding(12.5)
.background(.thinMaterial)
.clipShape(RoundedRectangle(cornerRadius: 15, style: .continuous))
}
.padding()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment