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

@@ -33,7 +33,7 @@ struct ProgressMapView: View {
isVisited: isVisited(stadium),
isSelected: selectedStadium?.id == stadium.id,
onTap: {
withAnimation(.spring(response: 0.3)) {
Theme.Animation.withMotion(.spring(response: 0.3)) {
if selectedStadium?.id == stadium.id {
selectedStadium = nil
} else {
@@ -51,7 +51,7 @@ struct ProgressMapView: View {
.overlay(alignment: .bottomTrailing) {
if mapViewModel.shouldShowResetButton {
Button {
withAnimation(.easeInOut(duration: 0.5)) {
Theme.Animation.withMotion(.easeInOut(duration: 0.5)) {
cameraPosition = .region(MapInteractionViewModel.defaultRegion)
mapViewModel.resetToDefault()
selectedStadium = nil
@@ -108,6 +108,7 @@ struct StadiumMapPin: View {
.fill(pinColor)
.frame(width: 10, height: 6)
.offset(y: -2)
.accessibilityHidden(true)
// Stadium name (when selected)
if isSelected {
@@ -128,7 +129,10 @@ struct StadiumMapPin: View {
}
}
.buttonStyle(.plain)
.animation(.spring(response: 0.3), value: isSelected)
.accessibilityLabel("\(stadium.name), \(isVisited ? "visited" : "not visited")")
.accessibilityValue(isSelected ? "Selected" : "Not selected")
.accessibilityAddTraits(isSelected ? .isSelected : [])
.animation(Theme.Animation.prefersReducedMotion ? nil : .spring(response: 0.3), value: isSelected)
}
private var pinColor: Color {