Files
Reflect/Shared/Views/SharingTemplates/Variations/AllMoodsVariations.swift
Trey t 0442eab1f8 Rebrand entire project from Feels to Reflect
Complete rename across all bundle IDs, App Groups, CloudKit containers,
StoreKit product IDs, data store filenames, URL schemes, logger subsystems,
Swift identifiers, user-facing strings (7 languages), file names, directory
names, Xcode project, schemes, assets, and documentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:47:16 -06:00

214 lines
7.7 KiB
Swift

//
// AllMoodsVariations.swift
// Reflect
//
// 3 design variations for the All Moods Total sharing template.
//
import SwiftUI
// MARK: - V2 "Gradient" Warm gradient, rounded cards, bold
struct AllMoodsV2: View {
let metrics: [MoodMetrics]
let totalCount: Int
@AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults)
private var moodTint: MoodTints = .Default
var image: UIImage {
shareView.asImage(size: CGSize(width: 666, height: 1190))
}
var shareView: some View {
ZStack {
// Gradient bg
LinearGradient(
colors: [Color(hex: "FFF5EE"), Color(hex: "FFE4D6"), Color(hex: "FFD4C2")],
startPoint: .top,
endPoint: .bottom
)
VStack(spacing: 0) {
Spacer().frame(height: 80)
// Title card
VStack(spacing: 12) {
Text("All Time Moods")
.font(.system(size: 22, weight: .semibold, design: .rounded))
.foregroundColor(Color(hex: "8B5E3C"))
Text("\(totalCount)")
.font(.system(size: 96, weight: .heavy, design: .rounded))
.foregroundColor(Color(hex: "4A2810"))
Text("entries tracked")
.font(.system(size: 16, weight: .medium, design: .rounded))
.foregroundColor(Color(hex: "8B5E3C").opacity(0.7))
}
Spacer().frame(height: 50)
// Mood circles row
HStack(spacing: 20) {
ForEach(metrics.sorted(by: { $0.mood.rawValue > $1.mood.rawValue }), id: \.mood) { metric in
VStack(spacing: 12) {
ZStack {
Circle()
.fill(moodTint.color(forMood: metric.mood))
.frame(width: 90, height: 90)
.shadow(color: moodTint.color(forMood: metric.mood).opacity(0.4), radius: 12, y: 6)
metric.mood.icon
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 36, height: 36)
.foregroundColor(.white)
}
Text("\(metric.percent, specifier: "%.0f")%")
.font(.system(size: 20, weight: .bold, design: .rounded))
.foregroundColor(Color(hex: "4A2810"))
Text("\(metric.total)")
.font(.system(size: 14, weight: .medium, design: .rounded))
.foregroundColor(Color(hex: "8B5E3C").opacity(0.6))
}
}
}
.padding(.horizontal, 24)
Spacer()
// Bottom card
HStack(alignment: .bottom) {
ForEach(metrics.sorted(by: { $0.percent > $1.percent }), id: \.mood) { metric in
VStack(spacing: 4) {
RoundedRectangle(cornerRadius: 8)
.fill(moodTint.color(forMood: metric.mood))
.frame(height: CGFloat(metric.percent) * 2.5)
Text(metric.mood.strValue)
.font(.system(size: 11, weight: .medium, design: .rounded))
.foregroundColor(Color(hex: "8B5E3C"))
}
.frame(maxWidth: .infinity)
}
}
.frame(height: 300, alignment: .bottom)
.padding(24)
.background(
RoundedRectangle(cornerRadius: 24)
.fill(.white.opacity(0.6))
)
.padding(.horizontal, 32)
Spacer().frame(height: 50)
VStack(spacing: 10) {
Image("ReflectAppIcon")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 96, height: 96)
.clipShape(RoundedRectangle(cornerRadius: 22))
Text("Reflect")
.font(.system(size: 28, weight: .semibold, design: .rounded))
.foregroundColor(Color(hex: "8B5E3C").opacity(0.4))
}
Spacer().frame(height: 50)
}
}
.frame(width: 666, height: 1190)
}
var body: some View { shareView }
}
// MARK: - V5 "Color Block" Mood colors fill proportional strips, white text
struct AllMoodsV5: View {
let metrics: [MoodMetrics]
let totalCount: Int
@AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults)
private var moodTint: MoodTints = .Default
var image: UIImage {
shareView.asImage(size: CGSize(width: 666, height: 1190))
}
var shareView: some View {
let sorted = metrics.sorted(by: { $0.mood.rawValue > $1.mood.rawValue })
let headerHeight: CGFloat = 80
let footerHeight: CGFloat = 180
let blocksHeight: CGFloat = 1190 - headerHeight - footerHeight
return VStack(spacing: 0) {
// Header dark band
ZStack {
Color(hex: "1C1C1E")
Text("\(totalCount) moods")
.font(.system(size: 20, weight: .bold, design: .rounded))
.foregroundColor(.white)
.tracking(2)
.textCase(.uppercase)
}
.frame(height: headerHeight)
// Color blocks fill proportionally, no gaps
ForEach(sorted, id: \.mood) { metric in
let blockHeight = max(blocksHeight * CGFloat(metric.percent / 100), 60)
ZStack {
moodTint.color(forMood: metric.mood)
HStack {
VStack(alignment: .leading, spacing: 4) {
Text(metric.mood.strValue.uppercased())
.font(.system(size: 14, weight: .bold, design: .rounded))
.tracking(2)
Text("\(metric.total) days")
.font(.system(size: 12, weight: .medium))
.opacity(0.7)
}
Spacer()
Text("\(metric.percent, specifier: "%.0f")%")
.font(.system(size: 42, weight: .heavy, design: .rounded))
}
.foregroundColor(.white)
.padding(.horizontal, 40)
}
.frame(height: blockHeight)
}
// Footer dark band
ZStack {
Color(hex: "1C1C1E")
VStack(spacing: 10) {
Image("ReflectAppIcon")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 96, height: 96)
.clipShape(RoundedRectangle(cornerRadius: 22))
Text("Reflect")
.font(.system(size: 28, weight: .bold, design: .rounded))
.foregroundColor(.white.opacity(0.3))
}
}
.frame(maxHeight: .infinity)
}
.background(Color(hex: "1C1C1E"))
.frame(width: 666, height: 1190)
}
var body: some View { shareView }
}