summaryrefslogtreecommitdiff
path: root/Docs/ACCESSIBILITY.md
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-07-21 20:47:34 -0500
committerChristian Cleberg <[email protected]>2026-07-21 21:40:44 -0500
commitc220e26bb496e455a5bdb6a8dc22abf09ecfed5f (patch)
tree1709346960c291f9f7c304724c89432e7194affa /Docs/ACCESSIBILITY.md
parentdc479a3ba0d27fe86509d0eb2d27b01132c2b37f (diff)
downloaddomain-dig-c220e26bb496e455a5bdb6a8dc22abf09ecfed5f.tar.gz
domain-dig-c220e26bb496e455a5bdb6a8dc22abf09ecfed5f.tar.bz2
domain-dig-c220e26bb496e455a5bdb6a8dc22abf09ecfed5f.zip
feat(a11y): color independence, reduce motion, reduce transparency (#21 phase 5)
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.
Diffstat (limited to 'Docs/ACCESSIBILITY.md')
-rw-r--r--Docs/ACCESSIBILITY.md25
1 files changed, 25 insertions, 0 deletions
diff --git a/Docs/ACCESSIBILITY.md b/Docs/ACCESSIBILITY.md
index bc6f061..b35f02c 100644
--- a/Docs/ACCESSIBILITY.md
+++ b/Docs/ACCESSIBILITY.md
@@ -238,6 +238,31 @@ pre-commit that blocks every commit. A hook routinely bypassed with
and cipher suites; extend it wherever the view model emits a fingerprint,
serial, or record string.
+## Color independence, motion, transparency
+
+- **Status is never colour-only.** In-app badges already pair a symbol with the
+ colour. The widget status dot is now an SF Symbol
+ (`checkmark.circle.fill` / `exclamationmark.triangle.fill` /
+ `exclamationmark.octagon.fill`) — the same vocabulary as the badges, so a
+ status reads consistently across surfaces and survives greyscale.
+- **`accessibilityDifferentiateWithoutColor`** adds redundant shape only when the
+ user asks for it, avoiding clutter otherwise: the Dashboard summary-card dot
+ becomes a per-filter symbol, the selected quick-filter chip gains a checkmark
+ and border (selection was fill-colour only), and `LabeledValueRow` prefixes a
+ warning/failure symbol.
+- **`accessibilityReduceMotion`** guards all five animation sites via
+ `withAnimation(reduceMotion ? nil : …)` / `.animation(reduceMotion ? nil : …)`:
+ `AppCopyButton`'s check cross-fade, `CollapsibleSectionView`'s expand/collapse,
+ `TimelineDiffView`'s scroll, and `WatchlistView`'s list reorder.
+- **`accessibilityReduceTransparency`** swaps the single `.thinMaterial` for an
+ opaque `AppSurfaceElevated` capsule.
+
+These cannot be verified by `simctl`, which toggles only Increase Contrast — the
+other three settings live in the simulator's Settings app. They are correct by
+construction and build-clean; their runtime behaviour is part of the Phase 6
+manual pass. `SweepActivityController` was dropped from the motion list: it is
+pure ActivityKit lifecycle with no animation to guard.
+
### What the automated audit cannot check
`performAccessibilityAudit()` validates descriptions, traits, contrast, hit