v1.1 polish: accessibility, error logging, localization, and code quality sweep
- Wrap 30+ production print() statements in #if DEBUG guards across 18 files - Add VoiceOver labels, hints, and traits to Watch app, Live Activities, widgets - Add .accessibilityAddTraits(.isButton) to 15+ onTapGesture views - Add text alternatives for color-only indicators (progress dots, mood circles) - Localize raw string literals in NoteEditorView, EntryDetailView, widgets - Replace 25+ silent try? with do/catch + AppLogger error logging - Replace hardcoded font sizes with semantic Dynamic Type fonts - Fix FIXME in IconPickerView (log icon change errors) - Extract magic animation delays to named constants across 8 files - Add widget empty state "Log your first mood!" messaging - Hide decorative images from VoiceOver, add labels to ColorPickers - Remove stale TODO in Color+Codable (alpha change deferred for migration) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -13,6 +13,10 @@ enum InsightsTab: String, CaseIterable {
|
||||
}
|
||||
|
||||
struct InsightsView: View {
|
||||
private enum AnimationConstants {
|
||||
static let refreshDelay: UInt64 = 500_000_000 // 0.5 seconds in nanoseconds
|
||||
}
|
||||
|
||||
@AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system
|
||||
@AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults) private var moodTint: MoodTints = .Default
|
||||
@AppStorage(UserDefaultsStore.Keys.moodImages.rawValue, store: GroupUserDefaults.groupDefaults) private var imagePack: MoodImages = .FontAwesome
|
||||
@@ -40,6 +44,7 @@ struct InsightsView: View {
|
||||
HStack(spacing: 4) {
|
||||
Image(systemName: "sparkles")
|
||||
.font(.caption.weight(.medium))
|
||||
.accessibilityHidden(true)
|
||||
Text("AI")
|
||||
.font(.caption.weight(.semibold))
|
||||
}
|
||||
@@ -148,7 +153,7 @@ struct InsightsView: View {
|
||||
.refreshable {
|
||||
viewModel.refreshInsights()
|
||||
// Small delay to show refresh animation
|
||||
try? await Task.sleep(nanoseconds: 500_000_000)
|
||||
try? await Task.sleep(nanoseconds: AnimationConstants.refreshDelay)
|
||||
}
|
||||
.disabled(iapManager.shouldShowPaywall)
|
||||
}
|
||||
@@ -173,6 +178,7 @@ struct InsightsView: View {
|
||||
|
||||
Image(systemName: "sparkles")
|
||||
.font(.largeTitle)
|
||||
.accessibilityHidden(true)
|
||||
.foregroundStyle(
|
||||
LinearGradient(
|
||||
colors: [.purple, .blue],
|
||||
@@ -202,6 +208,7 @@ struct InsightsView: View {
|
||||
} label: {
|
||||
HStack {
|
||||
Image(systemName: "sparkles")
|
||||
.accessibilityHidden(true)
|
||||
Text("Get Personal Insights")
|
||||
}
|
||||
.font(.headline.weight(.bold))
|
||||
|
||||
Reference in New Issue
Block a user