93 lines
2.3 KiB
Swift
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))
|
|
)
|
|
}
|
|
}
|
|
}
|