yattee/Shared/Views/DetailBadge.swift

112 lines
3.0 KiB
Swift
Raw Permalink Normal View History

import Defaults
2021-07-22 12:43:13 +00:00
import SwiftUI
struct DetailBadge: View {
enum Style {
case `default`, prominent, outstanding, informational
}
struct StyleModifier: ViewModifier {
let style: Style
func body(content: Content) -> some View {
Group {
switch style {
case .prominent:
content.modifier(ProminentStyleModifier())
case .outstanding:
content.modifier(OutstandingStyleModifier())
case .informational:
content.modifier(InformationalStyleModifier())
default:
content.modifier(DefaultStyleModifier())
}
}
}
}
struct DefaultStyleModifier: ViewModifier {
@Environment(\.colorScheme) private var colorScheme
2021-07-22 12:43:13 +00:00
func body(content: Content) -> some View {
2022-08-06 13:26:59 +00:00
content
.modifier(ControlBackgroundModifier())
2021-07-22 12:43:13 +00:00
}
}
struct ProminentStyleModifier: ViewModifier {
var font: Font {
Font.system(.body).weight(.semibold)
}
func body(content: Content) -> some View {
content
.font(font)
.modifier(DefaultStyleModifier())
}
}
struct OutstandingStyleModifier: ViewModifier {
var backgroundColor: Color {
Color("DetailBadgeOutstandingStyleBackgroundColor")
}
func body(content: Content) -> some View {
content
.textCase(.uppercase)
.background(backgroundColor)
.foregroundColor(.white)
}
}
struct InformationalStyleModifier: ViewModifier {
var backgroundColor: Color {
Color("DetailBadgeInformationalStyleBackgroundColor")
}
func body(content: Content) -> some View {
content
.background(backgroundColor)
.foregroundColor(.white)
}
}
var text: String
var style: Style = .default
@Default(.roundedThumbnails) private var roundedThumbnails
2021-07-22 12:43:13 +00:00
var body: some View {
2022-12-10 21:43:14 +00:00
let text = Text(text)
2021-07-22 12:43:13 +00:00
.truncationMode(.middle)
.padding(4)
#if os(tvOS)
.padding(.horizontal, 5)
#endif
2022-12-10 21:43:14 +00:00
Group {
if style == .default {
text
} else {
text
.modifier(StyleModifier(style: style))
}
}
.mask(RoundedRectangle(cornerRadius: roundedThumbnails ? 6 : 0))
2021-07-22 12:43:13 +00:00
}
}
struct DetailBadge_Previews: PreviewProvider {
static var previews: some View {
VStack {
DetailBadge(text: "Live", style: .outstanding)
DetailBadge(text: "Premieres", style: .informational)
DetailBadge(text: "Booyah", style: .prominent)
DetailBadge(
text: "Donec in neque mi. Phasellus quis sapien metus. Ut felis ante, posuere."
)
}
.frame(maxWidth: 500)
}
}