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:
@@ -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() }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user