Skip to content

[Observability:Streams] Improve Streams table accessibility#225659

Merged
rStelmach merged 16 commits intoelastic:mainfrom
rStelmach:224738-observabilitystreams-documents-and-retention-columns-on-streams-homepage-are-not-keyboard-accessible-and-dont-have-focus
Aug 7, 2025
Merged

[Observability:Streams] Improve Streams table accessibility#225659
rStelmach merged 16 commits intoelastic:mainfrom
rStelmach:224738-observabilitystreams-documents-and-retention-columns-on-streams-homepage-are-not-keyboard-accessible-and-dont-have-focus

Conversation

@rStelmach
Copy link
Contributor

@rStelmach rStelmach commented Jun 27, 2025

closes: #224738

Summary 📚

Documents and Retention columns on the Streams home page were not focusable, so keyboard users couldn’t reach the data and screen-reader users heard nothing.

This PR adds:

  • tabIndex and descriptive aria-labels to the Documents and Retention cells, their loading states, and relevant icons/badges.
  • Focusable, labelled wrapper around the Documents histogram and a matching ariaLabel on the chart canvas.
  • Properly labelled ILM policy badge/link, DSL text, ∞ icon, and error badge in the Retention column.
  • Accessible column headers and a table caption.
  • Removal of redundant roles that triggered axe-core

How to test 🧪

  • Open Observability → Streams with populated data.
  • Navigate the table using a keyboard
  • Turn on VoiceOver and navigate through the table elements.

@rStelmach rStelmach requested a review from a team as a code owner June 27, 2025 14:46
@rStelmach rStelmach added Project:Accessibility Team:obs-onboarding Observability Onboarding Team backport:version Backport to applied version labels Feature:Streams This is the label for the Streams Project v9.1.0 v8.19.0 labels Jun 27, 2025
@elasticmachine
Copy link
Contributor

Pinging @elastic/obs-ux-logs-team (Team:obs-ux-logs)

@elasticmachine
Copy link
Contributor

Pinging @elastic/kibana-accessibility (Project:Accessibility)

rStelmach and others added 4 commits June 30, 2025 09:18
…tention-columns-on-streams-homepage-are-not-keyboard-accessible-and-dont-have-focus
…tention-columns-on-streams-homepage-are-not-keyboard-accessible-and-dont-have-focus
…tention-columns-on-streams-homepage-are-not-keyboard-accessible-and-dont-have-focus
Copy link
Contributor

@awahab07 awahab07 left a comment

Choose a reason for hiding this comment

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

Great to see this implementation.

Is it possible to extract the i18n texts out into a separate file to keep the component definition clean?

I checked the page with VoiceOver on and observed a few things:

Focusing Documents column

Navigating via Tab also focuses the "Documents" column. It should not as there's no actionable element in that column.

However, navigating via control+option+▶️ / ◀️, it should focus the "Documents" column, but the column as a whole while announcing the number of documents. Currently it first focuses the number and then the chart. The chart should stay hidden for VoiceOver.

As an example, see APM -> Hosts table (notice from 00:32):

APM.Hosts.Table.-.Voice.Over.mov

VoiceOver over announces a few bits:

  1. It announces the stream name twice when focused, once for link and once for the stream name (notice at 00:18)
  2. Whenever "Documents" column is focused, it re-introduces the table (notice at 00:24 and 00:44)
  3. After describing the ∞, it calls it 'image' (see at 00:33). I believe such icons should be aria-hidden. Though it should describe it's purpose only.
Streams-home-page-A11y.mov

Copy link
Contributor

@awahab07 awahab07 left a comment

Choose a reason for hiding this comment

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

Thanks for the refactor, it's more readable now.

I tested the VoiceOver again and looks better now.

There's still a point where it re-introduces the table every time the streams link gets in focus as a result of Tab stepping (See 00:16 and 0035). It doesn't occur when it's navigated via control+option (see 00:55).

Check if it's because inside the Retention Column, both the EuiBadge and EuiLink have aria-labels and when focus goes inside onto EuiLink, it's considered outside of table. (see 00:27 where the focus steps inside). See if it's possible to make only one element Tab focusable (and the link is still navigable via keyboard).

Streams-re-introduction-of-table-stream-links.mov

rStelmach and others added 7 commits July 31, 2025 10:32
…tention-columns-on-streams-homepage-are-not-keyboard-accessible-and-dont-have-focus
…tention-columns-on-streams-homepage-are-not-keyboard-accessible-and-dont-have-focus
…-observabilitystreams-documents-and-retention-columns-on-streams-homepage-are-not-keyboard-accessible-and-dont-have-focus
Copy link
Contributor

@awahab07 awahab07 left a comment

Choose a reason for hiding this comment

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

Thanks for the changes, it LGTM now.

I pushed a few tweaks. Please do have a look in case I missed something. Here's a preview of how it behaves now:

streams-a11y-after-tweaks.mov

<EuiIcon type="visLine" size="m" />
);

const chartDescription = React.useMemo(() => {
Copy link
Contributor

Choose a reason for hiding this comment

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

Removed the chart aria labels as it's now aria-hidden="true".


return (
<span
tabIndex={0}
Copy link
Contributor

Choose a reason for hiding this comment

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

Removed the Tab key focus from the infinity icon as it's not actionable. Without it, it captures the Tab focus (see at 00:06 below)

Streams-a11y-infinite-retention-focusable.mov

@rStelmach
Copy link
Contributor Author

rStelmach commented Aug 4, 2025

@awahab07
Thank you, looks great!

@flash1293
Copy link
Contributor

@rStelmach what's missing to get this merged?

@rStelmach
Copy link
Contributor Author

@flash1293 I need extra review from someone from streams

Copy link
Contributor

@tonyghiani tonyghiani left a comment

Choose a reason for hiding this comment

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

Codewise LGTM, there are some conflicts to fix, then should be good to go

…tention-columns-on-streams-homepage-are-not-keyboard-accessible-and-dont-have-focus
@elasticmachine
Copy link
Contributor

💚 Build Succeeded

Metrics [docs]

Module Count

Fewer modules leads to a faster build time

id before after diff
streamsApp 535 536 +1

Async chunks

Total size of all lazy-loaded chunks that will be downloaded as the user navigates the app

id before after diff
streamsApp 618.9KB 621.3KB +2.4KB

History

@rStelmach rStelmach merged commit d1ffef1 into elastic:main Aug 7, 2025
12 checks passed
@kibanamachine
Copy link
Contributor

Starting backport for target branches: 8.19, 9.1

https://github.com/elastic/kibana/actions/runs/16801120467

@kibanamachine
Copy link
Contributor

💔 All backports failed

Status Branch Result
8.19 Backport failed because of merge conflicts
9.1 Backport failed because of merge conflicts

Manual backport

To create the backport manually run:

node scripts/backport --pr 225659

Questions ?

Please refer to the Backport tool documentation

gergoabraham pushed a commit to gergoabraham/kibana that referenced this pull request Aug 7, 2025
…225659)

closes: elastic#224738 

## Summary 📚 

Documents and Retention columns on the Streams home page were not
focusable, so keyboard users couldn’t reach the data and screen-reader
users heard nothing.

This PR adds:
- `tabIndex` and descriptive `aria-labels` to the Documents and
Retention cells, their loading states, and relevant icons/badges.
- Focusable, labelled wrapper around the Documents histogram and a
matching `ariaLabel` on the chart canvas.
- Properly labelled ILM policy badge/link, DSL text, ∞ icon, and error
badge in the Retention column.
- Accessible column headers and a table caption.
- Removal of redundant roles that triggered axe-core


## How to test 🧪 

- Open Observability → Streams with populated data.
- Navigate the table using a keyboard
- Turn on VoiceOver and navigate through the table elements.

---------

Co-authored-by: Joe Reuter <johannes.reuter@elastic.co>
Co-authored-by: Abdul Zahid <awahab07@yahoo.com>
denar50 pushed a commit to denar50/kibana that referenced this pull request Aug 8, 2025
…225659)

closes: elastic#224738 

## Summary 📚 

Documents and Retention columns on the Streams home page were not
focusable, so keyboard users couldn’t reach the data and screen-reader
users heard nothing.

This PR adds:
- `tabIndex` and descriptive `aria-labels` to the Documents and
Retention cells, their loading states, and relevant icons/badges.
- Focusable, labelled wrapper around the Documents histogram and a
matching `ariaLabel` on the chart canvas.
- Properly labelled ILM policy badge/link, DSL text, ∞ icon, and error
badge in the Retention column.
- Accessible column headers and a table caption.
- Removal of redundant roles that triggered axe-core


## How to test 🧪 

- Open Observability → Streams with populated data.
- Navigate the table using a keyboard
- Turn on VoiceOver and navigate through the table elements.

---------

Co-authored-by: Joe Reuter <johannes.reuter@elastic.co>
Co-authored-by: Abdul Zahid <awahab07@yahoo.com>
@kibanamachine kibanamachine added the backport missing Added to PRs automatically when the are determined to be missing a backport. label Aug 8, 2025
@kibanamachine
Copy link
Contributor

Friendly reminder: Looks like this PR hasn’t been backported yet.
To create automatically backports add a backport:* label or prevent reminders by adding the backport:skip label.
You can also create backports manually by running node scripts/backport --pr 225659 locally
cc: @rStelmach

3 similar comments
@kibanamachine
Copy link
Contributor

Friendly reminder: Looks like this PR hasn’t been backported yet.
To create automatically backports add a backport:* label or prevent reminders by adding the backport:skip label.
You can also create backports manually by running node scripts/backport --pr 225659 locally
cc: @rStelmach

@kibanamachine
Copy link
Contributor

Friendly reminder: Looks like this PR hasn’t been backported yet.
To create automatically backports add a backport:* label or prevent reminders by adding the backport:skip label.
You can also create backports manually by running node scripts/backport --pr 225659 locally
cc: @rStelmach

@kibanamachine
Copy link
Contributor

Friendly reminder: Looks like this PR hasn’t been backported yet.
To create automatically backports add a backport:* label or prevent reminders by adding the backport:skip label.
You can also create backports manually by running node scripts/backport --pr 225659 locally
cc: @rStelmach

@gbamparop
Copy link
Contributor

Friendly reminder: Looks like this PR hasn’t been backported yet.

@rStelmach should this be skipped?

@rStelmach
Copy link
Contributor Author

rStelmach commented Aug 14, 2025

@gbamparop
I overlooked it. I will create those backports in a sec

EDIT: I would skip backports for this PR

@rStelmach rStelmach added backport:skip This PR does not require backporting and removed backport:version Backport to applied version labels labels Aug 14, 2025
@kibanamachine kibanamachine removed the backport missing Added to PRs automatically when the are determined to be missing a backport. label Aug 14, 2025
NicholasPeretti pushed a commit to NicholasPeretti/kibana that referenced this pull request Aug 18, 2025
…225659)

closes: elastic#224738 

## Summary 📚 

Documents and Retention columns on the Streams home page were not
focusable, so keyboard users couldn’t reach the data and screen-reader
users heard nothing.

This PR adds:
- `tabIndex` and descriptive `aria-labels` to the Documents and
Retention cells, their loading states, and relevant icons/badges.
- Focusable, labelled wrapper around the Documents histogram and a
matching `ariaLabel` on the chart canvas.
- Properly labelled ILM policy badge/link, DSL text, ∞ icon, and error
badge in the Retention column.
- Accessible column headers and a table caption.
- Removal of redundant roles that triggered axe-core


## How to test 🧪 

- Open Observability → Streams with populated data.
- Navigate the table using a keyboard
- Turn on VoiceOver and navigate through the table elements.

---------

Co-authored-by: Joe Reuter <johannes.reuter@elastic.co>
Co-authored-by: Abdul Zahid <awahab07@yahoo.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport:skip This PR does not require backporting Feature:Streams This is the label for the Streams Project Project:Accessibility release_note:fix Team:obs-onboarding Observability Onboarding Team v8.19.0 v9.1.0 v9.2.0

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Observability:Streams] Documents and retention columns on streams homepage are not keyboard accessible and don't have focus

7 participants