Skip to content

fix(WhereUI): summarize calendars and widgets for VoiceOver - #256

Merged
kyleve merged 3 commits into
mainfrom
codex/calendar-widget-accessibility
Aug 13, 2026
Merged

fix(WhereUI): summarize calendars and widgets for VoiceOver#256
kyleve merged 3 commits into
mainfrom
codex/calendar-widget-accessibility

Conversation

@kyleve

@kyleve kyleve commented Aug 13, 2026

Copy link
Copy Markdown
Owner

Posted by an AI agent on kyleve's behalf.

Summary

  • User-facing: expose each calendar month as one VoiceOver element summarizing region totals, exact multi-region overlaps, unresolved/evidence counts, and planned days
  • User-facing: expose every Home Screen and Lock Screen widget family as one explicit accessibility label/value pair
  • Internal: derive deterministic exact-combination tallies in WhereCore and keep widget snapshot persistence unchanged
  • Internal: document CircleCI artifact triage in the repository's GitHub workflow skill
  • add localized formatting coverage and reviewed VoiceOver-annotated snapshot references

Why

Calendar day cells and month footer rows were individually reachable, producing hundreds of VoiceOver stops for a year. Year-total widget rows had the same problem, while Today and Lock Screen variants used inconsistent implicit combinations.

Review focus

  • overlap tallies represent exact region sets and remain independent of focused-calendar filtering
  • month summary ordering is region totals, overlaps, unresolved days, evidence days, then planned days
  • forecast controls remain separate interactive accessibility elements after the current month

Compatibility

No persistence, backup, CloudKit, or WidgetSnapshot wire format changes.

Testing

  • ./swiftformat --lint
  • ./xcstrings --lint
  • ./test --all — 1,863 tests passed
  • six directly affected WhereUI snapshot suites — 6 tests passed against reviewed accessibility references
  • WidgetFeaturesViewSnapshotTests and YearViewSnapshotTests — 2 tests passed after reviewing the containing-view accessibility references
  • ./sync-agents
  • GitHub workflow skill frontmatter validated with Ruby because the bundled Python validator's environment lacks PyYAML

}

public init(regions: Set<Region>, days: Int) {
precondition(regions.count > 1, "A region combination requires at least two regions.")

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO a thing we should assert in debug and otherwise log in prod

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why isn't this listing the whole description?

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on kyleve’s behalf.

This is an AccessibilitySnapshot renderer bug rather than a truncated widget value. The widget exposes the full label and value, but the SwiftUI legend compresses the description to one line. I reproduced it at the pinned 0.12.0 revision and opened cashapp/AccessibilitySnapshot#355: cashapp/AccessibilitySnapshot#355

The upstream regression exercises the real snapshot container and fails without the fix. Allowing the description to use its multiline intrinsic height renders the full value across two lines.

@kyleve
kyleve merged commit 2a6c695 into main Aug 13, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant