# Feature AGILE-448 - Make selection and context actions in Backlogs fully accessible to assistive technology

Project: Stream agile
Status: in specification
URL: https://community.openproject.org/work_packages/AGILE-448

## Planning

| Attribute | Value |
| --- | --- |
| Date |  |
| Priority | Medium |
| Target versions | 18.0.0 |
| Sprint |  |
| Backlog bucket | ⏭️ Next up |
| Votes |  |
| List | a11y report 2026 |
| Roadmap |  |
| Relevance |  |

## OPEN POINTS / FEEDBACK

_No work packages_

## Features and Chunks

| ID | Subject | Type | Status | Assignee | Target versions | Spent time |
| --- | --- | --- | --- | --- | --- | --- |
| AGILE-423 | Make Backlogs batch selection operable with VoiceOver | Implementation | in specification |  |  |  |
| AGILE-424 | Improve accessible feedback for Backlogs batch selection | Implementation | in specification |  |  |  |

## Bugs and other work packages

_No work packages_

## Technical Details

| Attribute | Value |
| --- | --- |
| Module | Modules and project features / Backlogs, Accessibility, Frontend components and Primer design system |
| Feature Flag |  |
| Requires doc change | Yes |
| Enterprise plan | Community (COM) |

## Details

| Attribute | Value |
| --- | --- |
| Pull preview |  |
| Mockups |  |
| Accessibility | Yes |

## People

| Attribute | Value |
| --- | --- |
| Assignee | Alexander Coles |
| Accountable |  |
| Product manager |  |
| Developers | OP Dev Polaris Team, Behrokh Satarnejad |
| Designer | Julia Racsko |
| Ordered by |  |
| Signed off by |  |
| Interest by |  |

## Estimates and progress

| Attribute | Value |
| --- | --- |
| PD (min) |  |
| PD (max) |  |
| Work |  |
| Labor costs |  |

## Description

**As** a keyboard or screen-reader user working with Backlogs cards
**I want to** navigate cards, identify and change their selection state, and reach their context actions with assistive technology
**so that** I can do backlog refinement and sprint planning without a pointer, with the same selection rules pointer users have.

### Background

Backlogs multi-selection in <mention class="mention" data-id="AGILE-181" data-type="work_package" data-text="#AGILE-181">#AGILE-181</mention> established shared pointer and keyboard anchor/range rules, delivered by <mention class="mention" data-id="AGILE-361" data-type="work_package" data-text="#AGILE-361">#AGILE-361</mention> and its stack (<mention class="mention" data-id="AGILE-362" data-type="work_package" data-text="#AGILE-362">#AGILE-362</mention>/#AGILE-363/#AGILE-364). Pointer and plain-keyboard selection work today; screen-reader operability and feedback do not. Review of the delivery ([Henriette's review](https://github.com/opf/openproject/pull/24525#pullrequestreview-5142945740)) surfaced the gap: VoiceOver cursor navigation steps through a card's inner links rather than the card, Space scrolls the page instead of toggling selection, and count-only announcements may be insufficient feedback.

This feature parents the follow-up work that closes that gap. The analogous effort for the work package table is <mention class="mention" data-id="DREAM-846" data-type="work_package" data-text="#DREAM-846">#DREAM-846</mention>; selection rules, announcement wording and interaction documentation stay aligned with it.

### Current state

  - Cards are `<article>` focus hosts with `tabindex`, an accessible name and advertised shortcuts (`Enter`, **Shift+F10**), without a composite-widget role.
  - Selection state is exposed only through a hidden `aria-describedby` description; change announcements are count-based live-region messages.
  - Focus is lost to the document body when a list expands (**Show more**) and is not provably preserved when opening the details pane morphs the page.
  - The supported interaction is not documented where end users can discover it.

### Scope and children

  - <mention class="mention" data-id="AGILE-423" data-type="work_package" data-text="#AGILE-423">#AGILE-423</mention> — screen-reader operability: navigation, event handling, focus retention, and the documented interaction.
  - <mention class="mention" data-id="AGILE-424" data-type="work_package" data-text="#AGILE-424">#AGILE-424</mention> — accessible feedback: selected-state exposure, concise plural-aware announcements, wording agreed with Behrang, coordination with <mention class="mention" data-id="AGILE-364" data-type="work_package" data-text="#AGILE-364">#AGILE-364</mention> menu announcements.
  - A markup-level follow-up (role-structure or explicit selection control) only if the <mention class="mention" data-id="AGILE-423" data-type="work_package" data-text="#AGILE-423">#AGILE-423</mention> decision gate triggers it — see Open decisions.

### Acceptance criteria (umbrella)

  - A screen-reader user can complete the core flows end to end: identify a card and its selection state, toggle it, build a batch, reach and invoke applicable batch actions, and recover focus afterwards.
  - The supported interaction is documented per screen reader (VoiceOver, NVDA; JAWS best-effort) and reachable from the in-app keyboard-shortcuts help.
  - Verified with VoiceOver in Chrome and Safari, with an NVDA smoke pass in Chrome and Firefox; unavailable combinations are labeled unverified, not claimed.
  - Keyboard focus, selection membership, the range anchor and the work package open in the details pane remain distinct — navigation alone changes none of the others.

### Open decisions

  - **Role structure for cards.** The current position (recorded in <mention class="mention" data-id="AGILE-181" data-type="work_package" data-text="#AGILE-181">#AGILE-181</mention> and restated in #DREAM-846's technical notes) is that cards deliberately avoid listbox/grid roles. #AGILE-423's phase 0 re-evaluates this with an instrumented diagnosis of the current model and a prototype comparing article, `grid` and grid-with-cell-entry variants. If the evidence escalates to a markup change, a dedicated child WP is created here with design sign-off; the table's role decision remains \#DREAM-860's and is not pre-empted.
  - **Adoption of AGILE-181's deferred items** (background-click clearing, persistent visible selection count, modified double-click, shared platform detection, split-view scroll loss) — referenced as candidates, not adopted by this feature.

### Coordination

  - Announcement wording and the state/announcement balance are shared with the work package table through <mention class="mention" data-id="AGILE-424" data-type="work_package" data-text="#AGILE-424">#AGILE-424</mention>, so Backlogs and the table speak the same way (<mention class="mention" data-id="DREAM-846" data-type="work_package" data-text="#DREAM-846">#DREAM-846</mention>).
  - Row-count/index conventions, where relevant, follow \#DREAM-858's BorderBoxTable work.

### Out of scope

  - Work package table, card view and Boards (<mention class="mention" data-id="DREAM-846" data-type="work_package" data-text="#DREAM-846">#DREAM-846</mention> stream).
  - Permission-independent selection, wider select-all scopes, mobile/tablet long-press (remain deferred under <mention class="mention" data-id="AGILE-181" data-type="work_package" data-text="#AGILE-181">#AGILE-181</mention>).
  - A persistent visible selection count: unscheduled separate work, coordinated with <mention class="mention" data-id="DREAM-846" data-type="work_package" data-text="#DREAM-846">#DREAM-846</mention>; <mention class="mention" data-id="AGILE-424" data-type="work_package" data-text="#AGILE-424">#AGILE-424</mention> remains the feedback coordination point, not the count's owner.
  - Batch move mechanics beyond what operability requires (owned by <mention class="mention" data-id="AGILE-278" data-type="work_package" data-text="#AGILE-278">#AGILE-278</mention> and the delivered stack).
