Skip to content

a11y: Critical VoiceOver labels for icon/color-only UI#5

Closed
bruschill wants to merge 1 commit into
a11y/pr2-localizationfrom
a11y/pr1-critical-labels
Closed

a11y: Critical VoiceOver labels for icon/color-only UI#5
bruschill wants to merge 1 commit into
a11y/pr2-localizationfrom
a11y/pr1-critical-labels

Conversation

@bruschill

Copy link
Copy Markdown
Owner

Summary

Adds the Critical semantic accessibility labels from the audit — cases where meaning was conveyed to sighted users by icon/color only and was completely invisible to VoiceOver.

This is PR 1 of an accessibility initiative. It is stacked on #4 (base branch a11y/pr2-localization) because it shares the String Catalog and MQTTConfig.swift — review/merge #4 first, or review this diff against that base.

Changes

  • MessageText.swift — message status badges (encrypted lock, signed/verified shield, store-forward envelope) + detection-sensor and translate overlays were bare Images with no label. Refactored the badge tuple into an Identifiable CornerBadge struct (resolves a large_tuple lint; stable id) and added .accessibilityLabels.
  • LoRaSignalStrengthIndicator.swift — had zero accessibility (bars+color only). Now mirrors the BLE indicator: .accessibilityElement(children: .ignore) + label + value.
  • MQTTConfig.swift / ChannelForm.swift — precision sliders announced only "50%"; added label + value and hid the semantically-inverted plus/minus marker images.
  • AppSettings.swift — purge-days slider announces a plural-aware day count.
  • SecurityConfig.swift — destructive "Delete key backup" / "Regenerate private key" buttons now have labels instead of reading as SF Symbol names.
  • Localizable.xcstrings — +10 keys (%lld days is plural-aware, matching the sibling After %lld Days).

Verification

  • BUILD SUCCEEDED (iPhone 17 Pro sim)
  • ✅ SwiftLint clean (tuple→struct refactor clears large_tuple)
  • ✅ Passed internal Swift/SwiftUI review — badge conditionals unchanged (no behavior regression), slider a11y correctly placed, stable badge id, plural-aware value; no Swift 6/concurrency issues.

Notes

  • VoiceOver-only, no visible-UI change → docs-staleness advisory can be dismissed with skip-docs-check.

Expose meaning that was previously conveyed only visually:
- Message status badges (PKI-encrypted lock, XEdDSA-signed shield, store-forward
  envelope) plus detection-sensor and translate overlays now have labels.
- LoRaSignalStrengthIndicator gains label + value, mirroring the BLE indicator.
- Position-precision sliders (MQTT, ChannelForm) announce their value and hide
  the decorative plus/minus marker images from VoiceOver.
- Purge-stale-nodes days slider announces a plural-aware day count.
- Destructive crypto buttons (delete key backup, regenerate private key) get
  labels instead of reading as raw SF Symbol names.

Refactors the message badge tuple into an Identifiable CornerBadge struct
(resolves a large_tuple lint) with a stable id. Adds 10 source keys.
@bruschill

Copy link
Copy Markdown
Owner Author

Superseded by upstream meshtastic#2124 (reopened against upstream with the project PR template). Closing this staging PR.

@bruschill bruschill closed this Jul 19, 2026
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