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

@@ -259,7 +259,15 @@ enum Theme {
}
static var darkSurfaceGlow: Color {
warmOrange.opacity(0.15)
switch current {
case .teal: return Color(hex: "92AEAB")
case .orbit: return Color(hex: "708BAA")
case .retro: return Color(hex: "87A0BA")
case .clutch: return Color(hex: "6D8399")
case .monochrome: return Color(hex: "707070")
case .sunset: return Color(hex: "84719A")
case .midnight: return Color(hex: "7F95B0")
}
}
static var darkTextPrimary: Color {
@@ -288,13 +296,13 @@ enum Theme {
static var darkTextMuted: Color {
switch current {
case .teal: return Color(hex: "7FADA8")
case .orbit: return Color(hex: "8090A0")
case .retro: return Color(hex: "7898B8")
case .clutch: return Color(hex: "8898A8")
case .monochrome: return Color(hex: "707070")
case .sunset: return Color(hex: "9D8AA8")
case .midnight: return Color(hex: "64748B")
case .teal: return Color(hex: "B4CFCC")
case .orbit: return Color(hex: "A0B1C3")
case .retro: return Color(hex: "A4BBCF")
case .clutch: return Color(hex: "A8B7C6")
case .monochrome: return Color(hex: "B0B0B0")
case .sunset: return Color(hex: "C9B5D3")
case .midnight: return Color(hex: "A3B3C8")
}
}
@@ -329,7 +337,15 @@ enum Theme {
static var lightCardBackgroundElevated: Color { lightBackground1 }
static var lightSurfaceBorder: Color {
warmOrange.opacity(0.3)
switch current {
case .teal: return Color(hex: "568E88")
case .orbit: return Color(hex: "5F86AE")
case .retro: return Color(hex: "5D90B8")
case .clutch: return Color(hex: "6E8194")
case .monochrome: return Color(hex: "7A7A7A")
case .sunset: return Color(hex: "B98474")
case .midnight: return Color(hex: "7789A3")
}
}
static var lightTextPrimary: Color {
@@ -358,12 +374,12 @@ enum Theme {
static var lightTextMuted: Color {
switch current {
case .teal: return Color(hex: "5A9A94")
case .orbit: return Color(hex: "5A7A9A")
case .retro: return Color(hex: "5A8AAA")
case .clutch: return Color(hex: "6A7A8A")
case .teal: return Color(hex: "497F79")
case .orbit: return Color(hex: "537596")
case .retro: return Color(hex: "4A7A99")
case .clutch: return Color(hex: "5A6B7E")
case .monochrome: return Color(hex: "707070")
case .sunset: return Color(hex: "9A6A5A")
case .sunset: return Color(hex: "8A5A4A")
case .midnight: return Color(hex: "64748B")
}
}
@@ -442,6 +458,20 @@ enum Theme {
static var gentleSpring: SwiftUI.Animation {
.spring(response: 0.5, dampingFraction: 0.8)
}
/// Whether the system Reduce Motion preference is enabled.
static var prefersReducedMotion: Bool {
UIAccessibility.isReduceMotionEnabled
}
/// Performs a state change with animation, or instantly if Reduce Motion is enabled.
static func withMotion(_ animation: SwiftUI.Animation = spring, _ body: () -> Void) {
if prefersReducedMotion {
body()
} else {
withAnimation(animation) { body() }
}
}
}
}