NFR-A11Y-2 — Accessibility.accessible-* appears five times in the whole interface, all five on one control.
The state of it
The five are on the parameter slider in adjust.slint. Nothing is set from the Rust side at all. Everything else across eighteen Slint files is unnamed to AT-SPI and to TalkBack — the library grid, the develop canvas, the mask list, the crop overlay, the import flow, the settings.
Acceptance
Every interactive control carries a role and an accessible name.
Names come from labels::resolve, so they localise with everything else (#35) rather than becoming a second set of hardcoded strings.
State that is currently carried by drawing — a lit clipping marker, a selected mask, a picked frame — is exposed as accessible state, not just as pixels.
Keyboard focus order is defined and visible in the develop and library views.
Sequencing
Worth doing alongside #35, not after it: both pass through labels::resolve, and doing them separately means touching all eighteen files twice.
Related
#38 — spike S13, Slint's Android accessibility, which the requirement's own caveat asks for and which has almost nothing to test against until this lands.
#37 — the colour-label interface, which should be built with an accessible shape from the outset rather than retrofitted.
See docs/outstanding.md §6.
**NFR-A11Y-2 — Accessibility.** `accessible-*` appears five times in the whole interface, all five on one control.
## The state of it
The five are on the parameter slider in `adjust.slint`. **Nothing is set from the Rust side at all.** Everything else across eighteen Slint files is unnamed to AT-SPI and to TalkBack — the library grid, the develop canvas, the mask list, the crop overlay, the import flow, the settings.
## Acceptance
- [ ] Every interactive control carries a role and an accessible name.
- [ ] Names come from `labels::resolve`, so they localise with everything else (#35) rather than becoming a second set of hardcoded strings.
- [ ] State that is currently carried by drawing — a lit clipping marker, a selected mask, a picked frame — is exposed as accessible state, not just as pixels.
- [ ] Keyboard focus order is defined and visible in the develop and library views.
## Sequencing
Worth doing **alongside #35**, not after it: both pass through `labels::resolve`, and doing them separately means touching all eighteen files twice.
## Related
- #38 — spike S13, Slint's Android accessibility, which the requirement's own caveat asks for and which has almost nothing to test against until this lands.
- #37 — the colour-label interface, which should be built with an accessible shape from the outset rather than retrofitted.
See `docs/outstanding.md` §6.
Do alongside#35 (same eighteen files) and #37 (build the label UI accessible from the outset). Unblocks#38, which has almost nothing to test against until this lands.
**Do alongside** #35 (same eighteen files) and #37 (build the label UI accessible from the outset).
**Unblocks** #38, which has almost nothing to test against until this lands.
Progress check (2026-09-24). This undercounts: there are 91 accessible-* lines across widgets/controls/toolrail/adjust/launch/app.slint (8e4befa, 2026-08-30), enforced by ui/dr-ui/tests/ui_controls_are_accessible.rs.
Still missing: the library grid, canvas, mask list, crop overlay, import and settings have none. Names are hardcoded English rather than taken from labels::resolve. State that is only drawn (clipping marker, selected mask, pick) is not exposed, except the show-original toggle. No focus order.
Progress check (2026-09-24). This undercounts: there are 91 `accessible-*` lines across widgets/controls/toolrail/adjust/launch/app.slint (8e4befa, 2026-08-30), enforced by `ui/dr-ui/tests/ui_controls_are_accessible.rs`.
Still missing: the library grid, canvas, mask list, crop overlay, import and settings have none. Names are hardcoded English rather than taken from `labels::resolve`. State that is only drawn (clipping marker, selected mask, pick) is not exposed, except the show-original toggle. No focus order.
Progress check (2026-09-26, v0.16.0): 125 accessible-* lines across 11 Slint files, up from 91 in 6 on 2026-09-24. New since then: the shared ScrollBar in widgets.slint, the duplicate-originals review (duplicates.slint), and the film list popup (the Film row has a button role). Still as listed on 2026-09-24: the library grid, canvas, mask list, crop overlay and import have none; names are hardcoded English rather than from labels::resolve; drawn-only state (clipping, the selected mask, pick) is not exposed; no focus order.
Progress check (2026-09-26, v0.16.0): 125 `accessible-*` lines across 11 Slint files, up from 91 in 6 on 2026-09-24. New since then: the shared `ScrollBar` in widgets.slint, the duplicate-originals review (duplicates.slint), and the film list popup (the Film row has a button role). Still as listed on 2026-09-24: the library grid, canvas, mask list, crop overlay and import have none; names are hardcoded English rather than from `labels::resolve`; drawn-only state (clipping, the selected mask, pick) is not exposed; no focus order.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
NFR-A11Y-2 — Accessibility.
accessible-*appears five times in the whole interface, all five on one control.The state of it
The five are on the parameter slider in
adjust.slint. Nothing is set from the Rust side at all. Everything else across eighteen Slint files is unnamed to AT-SPI and to TalkBack — the library grid, the develop canvas, the mask list, the crop overlay, the import flow, the settings.Acceptance
labels::resolve, so they localise with everything else (#35) rather than becoming a second set of hardcoded strings.Sequencing
Worth doing alongside #35, not after it: both pass through
labels::resolve, and doing them separately means touching all eighteen files twice.Related
See
docs/outstanding.md§6.Do alongside #35 (same eighteen files) and #37 (build the label UI accessible from the outset).
Unblocks #38, which has almost nothing to test against until this lands.
Progress check (2026-09-24). This undercounts: there are 91
accessible-*lines across widgets/controls/toolrail/adjust/launch/app.slint (8e4befa, 2026-08-30), enforced byui/dr-ui/tests/ui_controls_are_accessible.rs.Still missing: the library grid, canvas, mask list, crop overlay, import and settings have none. Names are hardcoded English rather than taken from
labels::resolve. State that is only drawn (clipping marker, selected mask, pick) is not exposed, except the show-original toggle. No focus order.Progress check (2026-09-26, v0.16.0): 125
accessible-*lines across 11 Slint files, up from 91 in 6 on 2026-09-24. New since then: the sharedScrollBarin widgets.slint, the duplicate-originals review (duplicates.slint), and the film list popup (the Film row has a button role). Still as listed on 2026-09-24: the library grid, canvas, mask list, crop overlay and import have none; names are hardcoded English rather than fromlabels::resolve; drawn-only state (clipping, the selected mask, pick) is not exposed; no focus order.