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

@@ -32,6 +32,7 @@ struct SuggestedTripCard: View {
Image(systemName: sport.iconName)
.font(.caption)
.foregroundStyle(sport.themeColor)
.accessibilityHidden(true)
}
}
}
@@ -76,12 +77,14 @@ struct SuggestedTripCard: View {
.stroke(Theme.surfaceGlow(colorScheme), lineWidth: 1)
}
.shadow(color: Theme.cardShadow(colorScheme), radius: 8, y: 4)
.accessibilityElement(children: .combine)
}
private var routePreview: some View {
let cities = suggestedTrip.trip.stops.map { $0.city }
let startCity = cities.first ?? ""
let endCity = cities.last ?? ""
let routeDescription = cities.joined(separator: " to ")
return VStack(alignment: .leading, spacing: Theme.Spacing.xs) {
// Start End display
@@ -94,6 +97,7 @@ struct SuggestedTripCard: View {
Image(systemName: "arrow.right")
.font(.caption2)
.foregroundStyle(Theme.warmOrange)
.accessibilityHidden(true)
Text(endCity)
.font(.subheadline)
@@ -108,11 +112,13 @@ struct SuggestedTripCard: View {
Circle()
.fill(index == 0 || index == cities.count - 1 ? Theme.warmOrange : Theme.routeGold.opacity(0.6))
.frame(width: 6, height: 6)
.accessibilityHidden(true)
if index < cities.count - 1 {
Rectangle()
.fill(Theme.routeGold.opacity(0.4))
.frame(width: 8, height: 2)
.accessibilityHidden(true)
}
}
}
@@ -120,6 +126,8 @@ struct SuggestedTripCard: View {
}
.frame(height: 12)
}
.accessibilityElement(children: .ignore)
.accessibilityLabel("Route: \(routeDescription)")
}
private var regionColor: Color {