Files
sing-box-for-apple/ApplicationLibrary/Views/Dashboard/Cards/ProfileSelectorButton.swift
T

93 lines
2.3 KiB
Swift

import Library
import SwiftUI
struct ProfileSelectorButton: View {
let selectedItem: ProfilePreview?
@Binding var isPickerPresented: Bool
var body: some View {
Button {
isPickerPresented = true
} label: {
HStack {
Text(selectedItem?.name ?? "Select Profile")
.font(.system(size: buttonFontSize, weight: .medium))
.foregroundStyle(.primary)
Spacer()
Image(systemName: "chevron.up.chevron.down")
.font(.system(size: chevronSize, weight: .semibold))
.foregroundStyle(.secondary)
}
.padding(.horizontal, 14)
.frame(height: buttonHeight)
.contentShape(Rectangle())
}
#if os(tvOS)
.buttonStyle(SelectorButtonStyle())
#else
.buttonStyle(.plain)
.selectorBackground()
#endif
}
private var buttonHeight: CGFloat {
#if os(tvOS)
60
#elseif os(macOS)
32
#else
44
#endif
}
private var buttonFontSize: CGFloat {
#if os(macOS)
13
#else
17
#endif
}
private var chevronSize: CGFloat {
#if os(macOS)
10
#else
12
#endif
}
}
#if os(tvOS)
private struct SelectorButtonStyle: ButtonStyle {
@Environment(\.isFocused) private var isFocused
func makeBody(configuration: Configuration) -> some View {
configuration.label
.background(
RoundedRectangle(cornerRadius: 12)
.fill(isFocused ? Color.white : Color.secondary.opacity(0.1))
)
.foregroundStyle(isFocused ? .black : .primary)
.animation(.easeInOut(duration: 0.15), value: isFocused)
}
}
#endif
// MARK: - View Extension
extension View {
@ViewBuilder
func selectorBackground() -> some View {
if #available(iOS 26.0, macOS 26.0, tvOS 26.0, *) {
glassEffect(.regular.interactive(), in: .rect(cornerRadius: 12))
} else {
background(
RoundedRectangle(cornerRadius: 12)
.fill(Color.secondary.opacity(0.1))
)
}
}
}