[ui5-li | ui5-list]: inner RadioButton announces 'Item Selection.' instead of option label in single-select mode (WCAG 4.1.2)
Los mantenedores suelen responder en 2 días
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 78/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- typescript, web-dev
- Área
- accessibility, frontend
Línea de trabajo
Empieza en packages/main/src/ListItemTemplate.tsx, en selectionElement(), e inspecciona la semántica de accesibilidad del RadioButton de selección única y del li externo descrita en el issue. Comprueba si ocultar el control interno conserva el anuncio de la opción para los lectores de pantalla y, después, ejecuta las pruebas de accesibilidad o de elementos de lista pertinentes. La tarea estará terminada cuando las opciones de selección única anuncien sus etiquetas visibles sin el genérico «Item Selection».
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Bug Description
In single-select ui5-list mode (e.g. inside ui5-view-settings-dialog), each ui5-li renders an inner RadioButton via the selectionElement() function in ListItemTemplate.tsx. That RadioButton carries a hardcoded aria-label of "Item Selection." (from the i18n key ARIA_LABEL_LIST_ITEM_RADIO_BUTTON).
NVDA (and other screen readers that pierce the shadow DOM) focuses the inner div[role="radio"] inside the RadioButton shadow root and announces:
"Item Selection. radio button not checked"
The actual option label (e.g. "Ascending", "Completion Date", "Title") is never announced, because the inner radio button only carries the generic i18n string.
Root cause chain:
# packages/main/src/i18n/messagebundle_en.properties
ARIA_LABEL_LIST_ITEM_RADIO_BUTTON=Item Selection.
// packages/main/src/ListItem.ts (line ~531)
ariaLabelRadioButton: ListItem.i18nBundle.getText(ARIA_LABEL_LIST_ITEM_RADIO_BUTTON),
// packages/main/src/ListItemTemplate.tsx — selectionElement()
case this.modeSingleSelect:
return (
<RadioButton
part="radio"
disabled={this.isInactive}
accessibleName={this._accInfo.ariaLabelRadioButton} // ← "Item Selection."
tabindex={-1}
id={`${this._id}-singleSelectionElement`}
class="ui5-li-singlesel-radiobtn"
checked={this.selected}
onChange={this.onSingleSelectionComponentPress}
/>
);
The inner RadioButton's div[role="radio"] therefore gets aria-label="Item Selection.", which is what screen readers announce.
The outer <li> element already carries the correct ARIA semantics:
role="radio"aria-checkedaria-posinset/aria-setsize- The option label is exposed via its text content /
aria-labelledby
The inner RadioButton is purely decorative — it is redundant and its generic label conflicts with the accessible name on the host.
Affected Component
ui5-li / ui5-list (in SingleSelect / SingleSelectBegin / SingleSelectEnd mode)
Observed via ui5-view-settings-dialog (sort option list), which uses a single-select List internally.
Expected Behaviour
Screen readers should announce each option with its visible label (e.g. "Ascending radio button not checked"), not the generic string "Item Selection.".
Fix options (in order of preference):
-
(Preferred — minimal, upstream) Add
aria-hidden="true"on the innerRadioButtoninselectionElement()whenmodeSingleSelect. The outer<li role="radio">already provides all ARIA semantics; hiding the inner radio button removes the duplicate and the misleading announcement. -
(Alternative) Derive
ariaLabelRadioButtonfrom the list item's own accessible text (e.g. the item's text content oraccessibleNameprop) instead of the hardcoded i18n string — so the inner radio button, if not hidden, at least announces the correct label.
Isolated Example
Playground: https://ui5.github.io/webcomponents/components/fiori/ViewSettingsDialog/
Steps: Open the playground, click the sort/filter dialog, Tab to a sort option. NVDA will announce "Item Selection. radio button not checked" for each option instead of the option's label.
Steps to Reproduce
- Navigate to a page with a single-select
ui5-list(e.g. theViewSettingsDialogplayground or any sort dialog) - Tab to a list item in the single-select list
- Observe: screen reader announces "Item Selection. radio button not checked" — the option label is not announced
Expected: each option is announced with its visible label ("Ascending", "Descending", "Completion Date", etc.)
Log Output, Stack Trace or Screenshots
Source references confirmed in current main branch:
messagebundle_en.properties→ARIA_LABEL_LIST_ITEM_RADIO_BUTTON=Item Selection.ListItem.ts→ariaLabelRadioButton: ListItem.i18nBundle.getText(ARIA_LABEL_LIST_ITEM_RADIO_BUTTON)ListItemTemplate.tsx→selectionElement()passesaccessibleName={this._accInfo.ariaLabelRadioButton}to innerRadioButton
Priority
High
Environment Info
UI5 Web Components Version
2.x (root cause in source confirmed against current main branch)
Browser
- Chrome
- Edge
- Firefox
- Safari
Operating System
macOS, Windows
Additional Info
Organization
SAP-SF
- Lenguaje dominante
- TypeScript
- Estrellas
- 1.8k
- Forks
- 290
- Merge medio
- 2 d 14 h
- PR fusionados (30 d)
- 54
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de UI5/webcomponents
-
[Button]: crash on Safari 17 due to missing ElementInternals.states guard in _setBadgeOverlayStyleAbiertobug TOPIC B
Dificultad 1/5 Menos de una hora Aptitud para principiantes 87/100
UI5/webcomponents#14270 · 1 comentario ·
Los mantenedores suelen responder en 2 días
-
[Feature Request][Side Navigation][A11Y]: Enhance user experience navigating components tree itemsPosiblemente ocupada @TeodorTaushanov la tomó hace 5 días. Abiertobug Medium Prio TOPIC RD
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
UI5/webcomponents#14232 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 2 días
-
enhancement feature request TOPIC RD
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
UI5/webcomponents#14222 · 1 comentario ·
Los mantenedores suelen responder en 2 días
-
[SF][A11y][ui5-select] Conflicting ARIA: role="combobox" rendered with aria-roledescription="Listbox" (confuses screen-reader users)Posiblemente ocupada @PetyaMarkovaBogdanova la tomó hace 9 días. Abiertobug Medium Prio TOPIC P
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
UI5/webcomponents#14212 · 2 comentarios · 1 asignado ·
Los mantenedores suelen responder en 2 días
-
(ui5-search): Loading state sample is brokenPosiblemente ocupada @ndeshev la tomó hace 9 días. Abiertobug Low Prio TOPIC RL
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
UI5/webcomponents#14210 · 1 asignado ·
Los mantenedores suelen responder en 2 días
Todos los issues de UI5/webcomponents
Issues similares
-
area:cards enhancement ready-for-agent
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
fil-donadoni/tolaria#8883 ·
Los mantenedores suelen responder en 1 día
-
xsd:integer cast from a string rejects negative numbers, a leading + and surrounding whitespaceAbiertobug 🐛
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
comunica/comunica#1960 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Waiting for: Product Owner
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
getsentry/sentry-javascript#26203 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
bytedance/flowgram.ai#1235 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
devswha/herdr-web-ui#3325 ·