Update signing configuration to use 88oakapps.feels identifiers

- Update App Group IDs from group.com.tt.feels to group.com.88oakapps.feels
- Update iCloud container IDs from iCloud.com.tt.feels to iCloud.com.88oakapps.feels
- Sync code constants with entitlements across all targets (iOS, Watch, Widget)
- Update documentation in CLAUDE.md and PROJECT_OVERVIEW.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-29 10:01:49 -06:00
parent b6290403b0
commit 810ac2d649
28 changed files with 12289 additions and 13332 deletions

View File

@@ -32,46 +32,49 @@ struct VotingView: View {
}
}
// MARK: - Small Widget: 3 over 2 grid (no text - just mood buttons)
// MARK: - Small Widget: 3 over 2 grid centered in 50%|50% vertical split
private var smallLayout: some View {
VStack(spacing: 8) {
// Top row: Great, Good, Average
VStack(spacing: 0) {
// Top half: Great, Good, Average
HStack(spacing: 12) {
ForEach([Mood.great, .good, .average], id: \.rawValue) { mood in
moodButton(for: mood, size: 40)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
// Bottom row: Bad, Horrible
// Bottom half: Bad, Horrible
HStack(spacing: 12) {
ForEach([Mood.bad, .horrible], id: \.rawValue) { mood in
moodButton(for: mood, size: 40)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
}
.padding(.horizontal, 8)
.padding(.vertical, 8)
}
// MARK: - Medium Widget: Single row
// MARK: - Medium Widget: Vertical split - text top, voting bottom
private var mediumLayout: some View {
VStack(spacing: 12) {
VStack(spacing: 0) {
// Top: Text left-aligned, centered horizontally
Text(hasSubscription ? promptText : "Subscribe to track your mood")
.font(.headline)
.foregroundStyle(.primary)
.multilineTextAlignment(.center)
.multilineTextAlignment(.leading)
.lineLimit(2)
.minimumScaleFactor(0.8)
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
.padding(.horizontal, 16)
// Bottom: Voting buttons with equal spacing, centered
HStack(spacing: 0) {
ForEach([Mood.great, .good, .average, .bad, .horrible], id: \.rawValue) { mood in
moodButtonMedium(for: mood)
.frame(maxWidth: .infinity)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
.padding(.horizontal, 12)
.padding(.vertical, 16)
}
@ViewBuilder
@@ -146,29 +149,40 @@ struct LargeVotingView: View {
}
var body: some View {
VStack(spacing: 16) {
Spacer()
GeometryReader { geo in
VStack(spacing: 0) {
// Top 25%: Title centered x,y
Text(hasSubscription ? promptText : "Subscribe to track your mood")
.font(.title3.weight(.semibold))
.foregroundStyle(.primary)
.multilineTextAlignment(.center)
.lineLimit(2)
.minimumScaleFactor(0.8)
.padding(.horizontal, 12)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.frame(height: geo.size.height * 0.25)
Text(hasSubscription ? promptText : "Subscribe to track your mood")
.font(.title3.weight(.semibold))
.foregroundStyle(.primary)
.multilineTextAlignment(.center)
.lineLimit(2)
.minimumScaleFactor(0.8)
.padding(.horizontal, 8)
// Bottom 75%: Voting buttons in two rows
VStack(spacing: 0) {
// Top row at 33%: Great, Good, Average
HStack(spacing: 16) {
ForEach([Mood.great, .good, .average], id: \.rawValue) { mood in
moodButton(for: mood)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
// Large mood buttons in a row - flexible spacing
HStack(spacing: 0) {
ForEach([Mood.great, .good, .average, .bad, .horrible], id: \.rawValue) { mood in
moodButton(for: mood)
.frame(maxWidth: .infinity)
// Bottom row at 66%: Bad, Horrible
HStack(spacing: 16) {
ForEach([Mood.bad, .horrible], id: \.rawValue) { mood in
moodButton(for: mood)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
.frame(height: geo.size.height * 0.75)
}
Spacer()
}
.padding(.horizontal, 12)
.padding(.vertical, 16)
}
@ViewBuilder