90 lines · 2.4 KB · Swift
RawDownload
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 }    }}