Dimillian / Dimillian/IceCubesApp
Accessibility: tap-gesture rows, unlabeled controls, and Reduce Motion gaps
Nobody has claimed this yet.
- Dominant language
- Swift
- Stars
- 7.1k
- Forks
- 720
- PR merge metrics
- No merged PRs in 30d
Description
Search that this request don't already exist before creating it.
- Searched existing issues. Related but distinct: #2004 (unlabeled avatar button on the status detail page) and #2255 (VoiceOver post language). Neither covers the items below.
Description
While auditing the app with VoiceOver and Dynamic Type, I found a recurring set of accessibility gaps. Grouping them here rather than filing separately, since they share root causes.
1. onTapGesture on non-interactive containers
Several tappable rows are built as HStack/Label with .onTapGesture. SwiftUI does not expose these as buttons, so VoiceOver announces static text with no hint that it is actionable, and Switch Control / Full Keyboard Access cannot reach them at all.
Affected: theme picker swatches (ThemePreviewView), account media tab row (MediaTab), notification requests header (NotificationsHeaderFilteredView), conversation avatars (ConversationMessageView), tag group rows (TagsGroupSettingView).
2. Timeline quick-access pills are drag-only
Reordering pinned pills is implemented purely as a drag gesture, so there is no way to reorder them without precise pointer input — unreachable via VoiceOver or Switch Control.
3. Unlabeled icon-only buttons
Icon-only controls with no accessibilityLabel announce as "button" alone: the streaming toggle, the media viewer dismiss button, the message send button, the push-notification settings button, and the tag group toolbar button.
4. Alt text not surfaced in the fullscreen viewer
MediaUIAttachmentImageView receives only a URL, so attachment descriptions authors wrote are dropped in the fullscreen viewer.
5. Dynamic Type clamped below accessibility sizes
StatusActionButton clamps to .large / .medium, so reply/boost/favourite icons and counts stop scaling well before the accessibility text sizes.
6. Reduce Motion not honoured
Spring and bouncy animations run unconditionally in the toast overlay, message send transition, and media blur overlay, ignoring accessibilityReduceMotion.
7. Two hardcoded English strings
Label("Reply", …) and Label("Direct Messages", …) bypass the string catalog, so they stay English in every locale. Localized keys already exist for both.
Environment
- OS: iOS 27 (also present on iOS 26)
- IceCubesApp version:
main@ b2db303
I have a branch addressing all of the above and am happy to open a PR if the approach looks right. It converts the tap-gesture rows to Button, adds VoiceOver rotor actions for pill reordering, plumbs alt text through, raises the Dynamic Type clamps, gates the animations on Reduce Motion, and adds five new string-catalog keys without modifying existing entries.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the affected SwiftUI views named in the issue: ThemePreviewView, MediaTab, NotificationsHeaderFilteredView, ConversationMessageView, TagsGroupSettingView, StatusActionButton, and MediaUIAttachmentImageView. Audit the listed controls, gestures, text sizing, image descriptions, animations, and localization with VoiceOver and Dynamic Type; done means all seven accessibility gaps are addressed, though the issue notes that another contributor already has a branch covering them.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- swift
- Domain
- accessibility, mobile
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 35/100