76 lines
2.1 KiB
Swift
76 lines
2.1 KiB
Swift
import SwiftUI
|
|
|
|
struct MacroBar: View {
|
|
let label: String
|
|
let current: Double
|
|
let goal: Double
|
|
let color: Color
|
|
var showGrams: Bool = true
|
|
|
|
private var progress: Double {
|
|
guard goal > 0 else { return 0 }
|
|
return min(current / goal, 1.0)
|
|
}
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading, spacing: 4) {
|
|
HStack {
|
|
Text(label)
|
|
.font(.caption)
|
|
.fontWeight(.medium)
|
|
.foregroundStyle(Color.text3)
|
|
Spacer()
|
|
if showGrams {
|
|
Text("\(Int(current))g / \(Int(goal))g")
|
|
.font(.caption)
|
|
.foregroundStyle(Color.text3)
|
|
} else {
|
|
Text("\(Int(current)) / \(Int(goal))")
|
|
.font(.caption)
|
|
.foregroundStyle(Color.text3)
|
|
}
|
|
}
|
|
|
|
GeometryReader { geo in
|
|
ZStack(alignment: .leading) {
|
|
Capsule()
|
|
.fill(color.opacity(0.12))
|
|
.frame(height: 6)
|
|
|
|
Capsule()
|
|
.fill(color)
|
|
.frame(width: geo.size.width * progress, height: 6)
|
|
.animation(.easeOut(duration: 0.5), value: progress)
|
|
}
|
|
}
|
|
.frame(height: 6)
|
|
}
|
|
}
|
|
}
|
|
|
|
struct MacroBarCompact: View {
|
|
let current: Double
|
|
let goal: Double
|
|
let color: Color
|
|
|
|
private var progress: Double {
|
|
guard goal > 0 else { return 0 }
|
|
return min(current / goal, 1.0)
|
|
}
|
|
|
|
var body: some View {
|
|
GeometryReader { geo in
|
|
ZStack(alignment: .leading) {
|
|
Capsule()
|
|
.fill(color.opacity(0.12))
|
|
|
|
Capsule()
|
|
.fill(color)
|
|
.frame(width: geo.size.width * progress)
|
|
.animation(.easeOut(duration: 0.5), value: progress)
|
|
}
|
|
}
|
|
.frame(height: 4)
|
|
}
|
|
}
|