From c220e26bb496e455a5bdb6a8dc22abf09ecfed5f Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Tue, 21 Jul 2026 20:47:34 -0500 Subject: feat(a11y): color independence, reduce motion, reduce transparency (#21 phase 5) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Audit unchanged at 11 dark / 14 light — expected, as none of these settings are exercised by performAccessibilityAudit, and simctl can toggle only Increase Contrast, not Differentiate Without Color, Reduce Motion, or Reduce Transparency. Correct by construction and build-clean; runtime behaviour is verified in the Phase 6 manual pass. Color independence: - Widget status is now an SF Symbol (checkmark.circle.fill / exclamationmark.triangle.fill / exclamationmark.octagon.fill), the same vocabulary as the in-app badges, replacing a silent colour-only dot on both the domain rows and the small-view count pills. Status now survives greyscale and reads consistently across surfaces. - Under accessibilityDifferentiateWithoutColor: the Dashboard summary-card dot becomes a per-filter symbol, the selected quick-filter chip gains a checkmark and a border (selection was fill-colour only, and also gains the .isSelected trait), and LabeledValueRow prefixes a warning/failure symbol. All gated on the setting so the default UI stays uncluttered. Reduce motion: all five withAnimation/.animation sites now pass nil under accessibilityReduceMotion — AppCopyButton's check cross-fade, CollapsibleSectionView's expand/collapse, TimelineDiffView's scroll, and WatchlistView's list reorder. Reduce transparency: the single .thinMaterial capsule falls back to an opaque AppSurfaceElevated fill under accessibilityReduceTransparency. The SweepActivityController item from the plan is dropped: it is pure ActivityKit lifecycle with no animation, confirmed back in the issue triage. --- DomainDig/TimelineView.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'DomainDig/TimelineView.swift') diff --git a/DomainDig/TimelineView.swift b/DomainDig/TimelineView.swift index 9b79adf..6979ca0 100644 --- a/DomainDig/TimelineView.swift +++ b/DomainDig/TimelineView.swift @@ -168,6 +168,7 @@ private struct TimelineRow: View { } struct TimelineDiffView: View { + @Environment(\.accessibilityReduceMotion) private var reduceMotion @Bindable var viewModel: DomainViewModel let diff: DomainDiff @Binding var focusedSectionID: String? @@ -218,7 +219,7 @@ struct TimelineDiffView: View { private func scroll(proxy: ScrollViewProxy) { guard let focusedSectionID else { return } - withAnimation { + withAnimation(reduceMotion ? nil : .default) { proxy.scrollTo(focusedSectionID, anchor: .top) } } -- cgit v1.2.3