Skip to content

Sidebar navigation items are completely inaccessible to screen readers on Windows #2097

@Futyn-Maker

Description

@Futyn-Maker

Search first

  • I searched and no similar issues were found

Platform/OS

Windows

OS version

Windows 11 Pro 10.0.22631

Hiddify Version

4.1.1 / 4.1.2 dev (built from source)

What Happened?

The desktop sidebar navigation (Home, Profiles, Settings, Logs, About) is completely invisible to the NVDA (and maybe other) screen reader on Windows. When using screen readers, these navigation items:

  • Cannot be found via NVDA object navigation (Insert+Numpad arrows)
  • Are not announced when receiving keyboard focus via Tab
  • Do not seem to be appear in the Windows UI Automation (UIA) accessibility tree at all

The items are focusable through the app's custom keyboard handling (press Left arrow to enter the sidebar, then Tab to move between items), and can even be activated by pressing Enter/Space. However, NVDA remains completely silent throughout — no element names, no roles, no state information. A blind user must memorize the order of items and navigate by counting Tab presses.

For comparison, other interactive elements in the app (the connection button, "View all profiles" link, etc.) are properly announced by NVDA.

Minimal Reproducible Example (MRE)

  1. Launch Hiddify on Windows with NVDA screen reader running
  2. Press Left arrow to move focus into the sidebar navigation area
  3. Press Tab repeatedly to move through sidebar items (Home, Profiles, Settings, Logs, About)
  4. Observe that NVDA announces nothing at each Tab stop — complete silence
  5. For comparison: press Right arrow to move to the content area, then Tab to the connection button — NVDA correctly announces "Click to connect, button"

Expected Behavior

When navigating sidebar items with Tab, NVDA should announce each item's name and role, for example: "Home, Tab 1 of 5, button, selected" — similar to how the bottom navigation bar works on mobile, and similar to how other interactive elements in the app are announced.

Additional Context

I tried to conduct a small analysis of the problem and fix it myself, but I didn't succeed. Here is what I found.

The desktop sidebar uses Flutter's NavigationRail widget (lib/core/router/adaptive_layout/my_adaptive_layout.dart). This widget seem to have a confirmed upstream accessibility deficiency.

I try to do the following:

  • Wrapping destination icons in Semantics(button: true, enabled: true) — flags merge correctly in the semantics tree but are still not exposed to UIA
  • Adding Semantics(label: ..., button: true) to the icon's semanticLabel — blocked by NavigationRail's internal Semantics(explicitChildNodes: true) barrier
  • Placing a TextButton in NavigationRail's leading slot — also invisible to NVDA, confirming the entire NavigationRail subtree is inaccessible

Application Config Options

No response

Relevant log output

No response

Are you willing to submit a PR? If you know how to fix the bug.

  • I'm willing to submit a PR (Thank you!)

Metadata

Metadata

Assignees

No one assigned

    Labels

    StalebugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions