feat: add WCAG AA accessibility app-wide, fix CloudKit container config, remove debug logs

- Add VoiceOver labels, hints, and element grouping across all 60+ views
- Add Reduce Motion support (Theme.Animation.prefersReducedMotion) to all animations
- Replace fixed font sizes with semantic Dynamic Type styles
- Hide decorative elements from VoiceOver with .accessibilityHidden(true)
- Add .minimumHitTarget() modifier ensuring 44pt touch targets
- Add AccessibilityAnnouncer utility for VoiceOver announcements
- Improve color contrast values in Theme.swift for WCAG AA compliance
- Extract CloudKitContainerConfig for explicit container identity
- Remove PostHog debug console log from AnalyticsManager

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-02-11 09:27:23 -06:00
parent e9c15d70b1
commit d63d311cab
77 changed files with 982 additions and 263 deletions

View File

@@ -0,0 +1,14 @@
//
// CloudKitContainerConfig.swift
// SportsTime
//
import CloudKit
enum CloudKitContainerConfig {
nonisolated static let identifier = "iCloud.com.88oakapps.SportsTime"
nonisolated static func makeContainer() -> CKContainer {
CKContainer(identifier: identifier)
}
}

View File

@@ -109,8 +109,7 @@ actor CloudKitService {
private let deltaOverlapSeconds: TimeInterval = 120
private init() {
// Use target entitlements (debug/prod) instead of hardcoding a container ID.
self.container = CKContainer.default()
self.container = CloudKitContainerConfig.makeContainer()
self.publicDatabase = container.publicCloudDatabase
}

View File

@@ -5,7 +5,7 @@ import CloudKit
actor ItineraryItemService {
static let shared = ItineraryItemService()
private let container = CKContainer.default()
private let container = CloudKitContainerConfig.makeContainer()
private var database: CKDatabase { container.privateCloudDatabase }
private let recordType = "ItineraryItem"

View File

@@ -108,8 +108,9 @@ struct LocationPermissionView: View {
var body: some View {
VStack(spacing: 16) {
Image(systemName: "location.circle.fill")
.font(.system(size: 60))
.font(.largeTitle)
.foregroundStyle(.blue)
.accessibilityHidden(true)
Text("Enable Location")
.font(.title2)

View File

@@ -52,8 +52,7 @@ actor PollService {
private var pollSubscriptionID: CKSubscription.ID?
private init() {
// Respect target entitlements so Debug and production stay isolated.
self.container = CKContainer.default()
self.container = CloudKitContainerConfig.makeContainer()
self.publicDatabase = container.publicCloudDatabase
}

View File

@@ -63,7 +63,7 @@ final class VisitPhotoService {
init(modelContext: ModelContext) {
self.modelContext = modelContext
self.container = CKContainer.default()
self.container = CloudKitContainerConfig.makeContainer()
self.privateDatabase = container.privateCloudDatabase
}