Skip to content

a11y: Hide decorative Config-screen glyphs from VoiceOver#2120

Merged
garthvh merged 1 commit into
meshtastic:mainfrom
bruschill:a11y/pr5-config-labels
Jul 20, 2026
Merged

a11y: Hide decorative Config-screen glyphs from VoiceOver#2120
garthvh merged 1 commit into
meshtastic:mainfrom
bruschill:a11y/pr5-config-labels

Conversation

@bruschill

Copy link
Copy Markdown
Contributor

What changed?

A conservative VoiceOver pass over the Settings → Config screens: 4 standalone decorative Image(systemName:) glyphs that sit beside an already-labeled control are marked .accessibilityHidden(true) so VoiceOver no longer announces an opaque symbol name (e.g. "checkmark seal fill").

  • LoRaConfig — licensed-band status icon (the adjacent "Licensed band" title + state-branched description already convey licensed/unlicensed) and the antenna.radiowaves… icon before the Transmit-Power Stepper.
  • AmbientLightingConfig — the eyedropper before the ColorPicker and directcurrent before the Current Stepper.
  • 2 files changed, +9.

Why did it change?

Auditing the Config screens showed that nearly every glyph is already inside Label(text, systemImage:), where SwiftUI exposes the title as the accessibility label and treats the symbol as decorative — so those rows already read correctly and need no change. The only real gaps were these 4 standalone glyphs, where VoiceOver would otherwise read a meaningless symbol name. Hiding (not labeling) is correct because each is adjacent to already-spoken text; labeling would produce redundant announcements.

How is this tested?

Built the Meshtastic scheme for iOS Simulator (iPhone 17 Pro, Xcode 26) → ** BUILD SUCCEEDED **. SwiftLint clean. Passed a focused Swift/SwiftUI review (approve, no nits) confirming the licensed-band description is state-branched so hiding the glyph loses no information, and that .accessibilityHidden scopes only to the decorative Image without affecting sibling controls.

Screenshots/Videos (when applicable)

N/A — no visual change; affects spoken VoiceOver output only.

Checklist

  • My code adheres to the project's coding and style guidelines.
  • I have conducted a self-review of my code.
  • I have commented my code, particularly in complex areas.
  • I have verified whether these changes require updates to the in-app documentation under docs/user/ or docs/developer/. No doc update is needed (non-visual a11y annotation) — please apply the skip-docs-check label.
  • I have tested the change to ensure that it works as intended.

@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@bruschill, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 59 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4936ae10-ba2f-4a65-9bdd-4360bc0dd022

📥 Commits

Reviewing files that changed from the base of the PR and between e531f15 and af5c3ad.

📒 Files selected for processing (2)
  • Meshtastic/Views/Settings/Config/LoRaConfig.swift
  • Meshtastic/Views/Settings/Config/Module/AmbientLightingConfig.swift

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@bruschill bruschill added the skip-docs-check Use this label to skip the automatic docs audit label Jul 19, 2026

@garthvh garthvh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approved after detailed review (accessibility correctness verified; CI green). Part of the a11y series.

@garthvh
garthvh merged commit 0b507e1 into meshtastic:main Jul 20, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-docs-check Use this label to skip the automatic docs audit

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants