67 lines
2.4 KiB
Swift
67 lines
2.4 KiB
Swift
import SwiftUI
|
|
import Bedrock
|
|
|
|
struct RitualFocusCardView: View {
|
|
private let title: String
|
|
private let theme: String
|
|
private let dayLabel: String
|
|
private let completionSummary: String
|
|
private let progress: Double
|
|
private let iconName: String
|
|
|
|
init(
|
|
title: String,
|
|
theme: String,
|
|
dayLabel: String,
|
|
completionSummary: String,
|
|
progress: Double,
|
|
iconName: String = "sparkles"
|
|
) {
|
|
self.title = title
|
|
self.theme = theme
|
|
self.dayLabel = dayLabel
|
|
self.completionSummary = completionSummary
|
|
self.progress = progress
|
|
self.iconName = iconName
|
|
}
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading, spacing: Design.Spacing.medium) {
|
|
HStack(spacing: Design.Spacing.small) {
|
|
// Icon
|
|
SymbolIcon(iconName, size: .row, color: AppAccent.primary)
|
|
.accessibilityHidden(true)
|
|
|
|
// Title
|
|
StyledLabel(title, .heading, emphasis: .primary)
|
|
|
|
Spacer(minLength: Design.Spacing.medium)
|
|
|
|
// Day label - needs additional modifiers (padding, background)
|
|
Text(dayLabel)
|
|
.typography(.caption)
|
|
.foregroundStyle(AppTextColors.secondary)
|
|
.padding(.horizontal, Design.Spacing.small)
|
|
.padding(.vertical, Design.Spacing.xxxSmall)
|
|
.background(AppAccent.light.opacity(Design.Opacity.light))
|
|
.clipShape(.rect(cornerRadius: Design.CornerRadius.medium))
|
|
.accessibilityLabel(Text(dayLabel))
|
|
}
|
|
|
|
StyledLabel(theme, .subheading, emphasis: .secondary)
|
|
|
|
VStack(alignment: .leading, spacing: Design.Spacing.xSmall) {
|
|
ProgressView(value: progress)
|
|
.tint(AppAccent.primary)
|
|
StyledLabel(completionSummary, .caption, emphasis: .secondary)
|
|
}
|
|
}
|
|
.padding(Design.Spacing.large)
|
|
.background(AppSurface.card)
|
|
.clipShape(.rect(cornerRadius: Design.CornerRadius.large))
|
|
.shadow(color: AppBorder.subtle.opacity(Design.Opacity.medium), radius: AppMetrics.Shadow.radiusSmall, x: AppMetrics.Shadow.xOffsetNone, y: AppMetrics.Shadow.yOffsetSmall)
|
|
.accessibilityElement(children: .combine)
|
|
.accessibilityLabel(Text(title))
|
|
}
|
|
}
|