import AppKitimport SwiftUI @MainActorstruct PreferenceToggleRow: View { let title: String let subtitle: String? @Binding var binding: Bool var body: some View { VStack(alignment: .leading, spacing: 6) { Toggle(isOn: self.$binding) { Text(self.title) .font(.body) } .toggleStyle(.checkbox) if let subtitle, !subtitle.isEmpty { Text(subtitle) .font(.footnote) .foregroundStyle(.tertiary) .fixedSize(horizontal: false, vertical: true) } } }} @MainActorstruct SettingsSection<Content: View>: View { let title: String? let caption: String? let contentSpacing: CGFloat private let content: () -> Content init( title: String? = nil, caption: String? = nil, contentSpacing: CGFloat = 14, @ViewBuilder content: @escaping () -> Content) { self.title = title self.caption = caption self.contentSpacing = contentSpacing self.content = content } var body: some View { VStack(alignment: .leading, spacing: 10) { if let title, !title.isEmpty { Text(title) .font(.subheadline.weight(.semibold)) } if let caption { Text(caption) .font(.footnote) .foregroundStyle(.tertiary) .fixedSize(horizontal: false, vertical: true) } VStack(alignment: .leading, spacing: self.contentSpacing) { self.content() } .frame(maxWidth: .infinity, alignment: .leading) } }} @MainActorstruct AboutLinkRow: View { let icon: String let title: String let url: String @State private var hovering = false var body: some View { Button { if let url = URL(string: self.url) { NSWorkspace.shared.open(url) } } label: { HStack(spacing: 6) { Image(systemName: self.icon) Text(self.title) .underline(self.hovering, color: .accentColor) } .frame(maxWidth: .infinity) .foregroundColor(.accentColor) } .buttonStyle(.plain) .contentShape(Rectangle()) .onHover { self.hovering = $0 } }}
import AppKit
import SwiftUI
@MainActor
struct PreferenceToggleRow: View {
let title: String
let subtitle: String?
@Binding var binding: Bool
var body: some View {
VStack(alignment: .leading, spacing: 6) {
Toggle(isOn: self.$binding) {
Text(self.title)
.font(.body)
}
.toggleStyle(.checkbox)
if let subtitle, !subtitle.isEmpty {
Text(subtitle)
.font(.footnote)
.foregroundStyle(.tertiary)
.fixedSize(horizontal: false, vertical: true)
}
}
}
}
@MainActor
struct SettingsSection<Content: View>: View {
let title: String?
let caption: String?
let contentSpacing: CGFloat
private let content: () -> Content
init(
title: String? = nil,
caption: String? = nil,
contentSpacing: CGFloat = 14,
@ViewBuilder content: @escaping () -> Content)
{
self.title = title
self.caption = caption
self.contentSpacing = contentSpacing
self.content = content
}
var body: some View {
VStack(alignment: .leading, spacing: 10) {
if let title, !title.isEmpty {
Text(title)
.font(.subheadline.weight(.semibold))
}
if let caption {
Text(caption)
.font(.footnote)
.foregroundStyle(.tertiary)
.fixedSize(horizontal: false, vertical: true)
}
VStack(alignment: .leading, spacing: self.contentSpacing) {
self.content()
}
.frame(maxWidth: .infinity, alignment: .leading)
}
}
}
@MainActor
struct AboutLinkRow: View {
let icon: String
let title: String
let url: String
@State private var hovering = false
var body: some View {
Button {
if let url = URL(string: self.url) { NSWorkspace.shared.open(url) }
} label: {
HStack(spacing: 6) {
Image(systemName: self.icon)
Text(self.title)
.underline(self.hovering, color: .accentColor)
}
.frame(maxWidth: .infinity)
.foregroundColor(.accentColor)
}
.buttonStyle(.plain)
.contentShape(Rectangle())
.onHover { self.hovering = $0 }
}
}