Skip to content

[ILM] A11y: Announce invalid field#260673

Merged
SoniaSanzV merged 5 commits intoelastic:mainfrom
SoniaSanzV:a11y/index_lifecycle_policies-timing_error_announcement#219056
Apr 10, 2026
Merged

[ILM] A11y: Announce invalid field#260673
SoniaSanzV merged 5 commits intoelastic:mainfrom
SoniaSanzV:a11y/index_lifecycle_policies-timing_error_announcement#219056

Conversation

@SoniaSanzV
Copy link
Copy Markdown
Contributor

@SoniaSanzV SoniaSanzV commented Apr 1, 2026

Closes #219056

Summary

  • Fixes a screen reader gap on Index Lifecycle Policies → Edit policy where the Timing field showed a validation error visually, but NVDA would only announce a generic invalid state when the error was triggered via the units control.
  • Wires the Timing error message to both the min-age number input and its units select so the specific error text is announced when either control is focused while invalid.

Test plan

  • Manual (Windows 11 Pro, Chrome 131, NVDA)
    • Stack Management → Index Lifecycle Policies → Edit policy
    • Navigate to the Delete phase, then to the Timing controls for “Move data into phase when”
    • Trigger an invalid state for Timing
    • Focus the number input
      • Expected: NVDA announces the specific validation error text (not only “invalid entry”)
    • Change the units select to a value that produces the same invalid state, then move focus away and back to the units select
      • Expected: NVDA announces the same specific validation error text for the invalid field
  • Automated

Before/after notes

  • References: WCAG 2.2 SC 3.3.1 (Error Identification) https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html
  • Before/after behavior
    • Before: Error text was visible below the Timing field, but NVDA did not announce it when the error was produced by interacting with the units control (only a generic “invalid entry”).
    • After: The specific Timing error text is programmatically associated to both Timing controls and is announced by NVDA when focusing either control while invalid.

Evidence

Screenshot 2026-04-01 at 12 23 37
@SoniaSanzV SoniaSanzV self-assigned this Apr 1, 2026
@SoniaSanzV SoniaSanzV requested a review from a team as a code owner April 1, 2026 10:35
@SoniaSanzV SoniaSanzV added Team:Kibana Management Dev Tools, Index Management, Upgrade Assistant, ILM, Ingest Node Pipelines, and more t// backport:all-open Backport to all branches that could still receive a release labels Apr 1, 2026
@elasticmachine
Copy link
Copy Markdown
Contributor

Pinging @elastic/kibana-management (Team:Kibana Management)

@elasticmachine
Copy link
Copy Markdown
Contributor

💚 Build Succeeded

Metrics [docs]

Async chunks

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

id before after diff
indexLifecycleManagement 150.2KB 150.3KB +113.0B

History

cc @SoniaSanzV

Copy link
Copy Markdown
Member

@sabarasaba sabarasaba left a comment

Choose a reason for hiding this comment

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

changes lgtm!

@SoniaSanzV SoniaSanzV merged commit c2ef716 into elastic:main Apr 10, 2026
18 checks passed
@SoniaSanzV SoniaSanzV deleted the a11y/index_lifecycle_policies-timing_error_announcement#219056 branch April 10, 2026 07:48
@kibanamachine
Copy link
Copy Markdown
Contributor

Starting backport for target branches: 8.19, 9.2, 9.3

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

kibanamachine pushed a commit to kibanamachine/kibana that referenced this pull request Apr 10, 2026
Closes elastic#219056

## Summary
- Fixes a screen reader gap on Index Lifecycle Policies → Edit policy
where the Timing field showed a validation error visually, but NVDA
would only announce a generic invalid state when the error was triggered
via the units control.
- Wires the Timing error message to both the min-age number input and
its units select so the specific error text is announced when either
control is focused while invalid.

### Test plan
- Manual (Windows 11 Pro, Chrome 131, NVDA)
  - Stack Management → Index Lifecycle Policies → Edit policy
- Navigate to the Delete phase, then to the Timing controls for “Move
data into phase when”
  - Trigger an invalid state for Timing
  - Focus the number input
- **Expected**: NVDA announces the specific validation error text (not
only “invalid entry”)
- Change the units select to a value that produces the same invalid
state, then move focus away and back to the units select
- **Expected**: NVDA announces the same specific validation error text
for the invalid field
- Automated

### Before/after notes
- References: WCAG 2.2 SC 3.3.1 (Error Identification)
https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html
- Before/after behavior
- **Before**: Error text was visible below the Timing field, but NVDA
did not announce it when the error was produced by interacting with the
units control (only a generic “invalid entry”).
- **After**: The specific Timing error text is programmatically
associated to both Timing controls and is announced by NVDA when
focusing either control while invalid.

### Evidence
<img width="654" height="303" alt="Screenshot 2026-04-01 at 12 23 37"
src="https://github.com/user-attachments/assets/45ec7310-8acc-476d-8f10-294885c816e0"
/>

(cherry picked from commit c2ef716)
kibanamachine pushed a commit to kibanamachine/kibana that referenced this pull request Apr 10, 2026
Closes elastic#219056

## Summary
- Fixes a screen reader gap on Index Lifecycle Policies → Edit policy
where the Timing field showed a validation error visually, but NVDA
would only announce a generic invalid state when the error was triggered
via the units control.
- Wires the Timing error message to both the min-age number input and
its units select so the specific error text is announced when either
control is focused while invalid.

### Test plan
- Manual (Windows 11 Pro, Chrome 131, NVDA)
  - Stack Management → Index Lifecycle Policies → Edit policy
- Navigate to the Delete phase, then to the Timing controls for “Move
data into phase when”
  - Trigger an invalid state for Timing
  - Focus the number input
- **Expected**: NVDA announces the specific validation error text (not
only “invalid entry”)
- Change the units select to a value that produces the same invalid
state, then move focus away and back to the units select
- **Expected**: NVDA announces the same specific validation error text
for the invalid field
- Automated

### Before/after notes
- References: WCAG 2.2 SC 3.3.1 (Error Identification)
https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html
- Before/after behavior
- **Before**: Error text was visible below the Timing field, but NVDA
did not announce it when the error was produced by interacting with the
units control (only a generic “invalid entry”).
- **After**: The specific Timing error text is programmatically
associated to both Timing controls and is announced by NVDA when
focusing either control while invalid.

### Evidence
<img width="654" height="303" alt="Screenshot 2026-04-01 at 12 23 37"
src="https://github.com/user-attachments/assets/45ec7310-8acc-476d-8f10-294885c816e0"
/>

(cherry picked from commit c2ef716)
kibanamachine pushed a commit to kibanamachine/kibana that referenced this pull request Apr 10, 2026
Closes elastic#219056

## Summary
- Fixes a screen reader gap on Index Lifecycle Policies → Edit policy
where the Timing field showed a validation error visually, but NVDA
would only announce a generic invalid state when the error was triggered
via the units control.
- Wires the Timing error message to both the min-age number input and
its units select so the specific error text is announced when either
control is focused while invalid.

### Test plan
- Manual (Windows 11 Pro, Chrome 131, NVDA)
  - Stack Management → Index Lifecycle Policies → Edit policy
- Navigate to the Delete phase, then to the Timing controls for “Move
data into phase when”
  - Trigger an invalid state for Timing
  - Focus the number input
- **Expected**: NVDA announces the specific validation error text (not
only “invalid entry”)
- Change the units select to a value that produces the same invalid
state, then move focus away and back to the units select
- **Expected**: NVDA announces the same specific validation error text
for the invalid field
- Automated

### Before/after notes
- References: WCAG 2.2 SC 3.3.1 (Error Identification)
https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html
- Before/after behavior
- **Before**: Error text was visible below the Timing field, but NVDA
did not announce it when the error was produced by interacting with the
units control (only a generic “invalid entry”).
- **After**: The specific Timing error text is programmatically
associated to both Timing controls and is announced by NVDA when
focusing either control while invalid.

### Evidence
<img width="654" height="303" alt="Screenshot 2026-04-01 at 12 23 37"
src="https://github.com/user-attachments/assets/45ec7310-8acc-476d-8f10-294885c816e0"
/>

(cherry picked from commit c2ef716)
@kibanamachine
Copy link
Copy Markdown
Contributor

💚 All backports created successfully

Status Branch Result
8.19
9.2
9.3

Note: Successful backport PRs will be merged automatically after passing CI.

Questions ?

Please refer to the Backport tool documentation

kibanamachine added a commit that referenced this pull request Apr 10, 2026
# Backport

This will backport the following commits from `main` to `8.19`:
- [[ILM] A11y: Announce invalid field
(#260673)](#260673)

<!--- Backport version: 9.6.6 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sorenlouv/backport)

<!--BACKPORT [{"author":{"name":"Sonia Sanz
Vivas","email":"sonia.sanzvivas@elastic.co"},"sourceCommit":{"committedDate":"2026-04-10T07:48:10Z","message":"[ILM]
A11y: Announce invalid field (#260673)\n\nCloses
https://github.com/elastic/kibana/issues/219056\n\n## Summary\n- Fixes a
screen reader gap on Index Lifecycle Policies → Edit policy\nwhere the
Timing field showed a validation error visually, but NVDA\nwould only
announce a generic invalid state when the error was triggered\nvia the
units control.\n- Wires the Timing error message to both the min-age
number input and\nits units select so the specific error text is
announced when either\ncontrol is focused while invalid.\n\n### Test
plan\n- Manual (Windows 11 Pro, Chrome 131, NVDA)\n - Stack Management →
Index Lifecycle Policies → Edit policy\n- Navigate to the Delete phase,
then to the Timing controls for “Move\ndata into phase when”\n - Trigger
an invalid state for Timing\n - Focus the number input\n- **Expected**:
NVDA announces the specific validation error text (not\nonly “invalid
entry”)\n- Change the units select to a value that produces the same
invalid\nstate, then move focus away and back to the units select\n-
**Expected**: NVDA announces the same specific validation error
text\nfor the invalid field\n- Automated\n\n### Before/after notes\n-
References: WCAG 2.2 SC 3.3.1 (Error
Identification)\nhttps://www.w3.org/WAI/WCAG22/Understanding/error-identification.html\n-
Before/after behavior\n- **Before**: Error text was visible below the
Timing field, but NVDA\ndid not announce it when the error was produced
by interacting with the\nunits control (only a generic “invalid
entry”).\n- **After**: The specific Timing error text is
programmatically\nassociated to both Timing controls and is announced by
NVDA when\nfocusing either control while invalid.\n\n### Evidence\n<img
width=\"654\" height=\"303\" alt=\"Screenshot 2026-04-01 at 12 23
37\"\nsrc=\"https://github.com/user-attachments/assets/45ec7310-8acc-476d-8f10-294885c816e0\"\n/>","sha":"c2ef7162bd38774836f7109cbed66b422e7b10ac","branchLabelMapping":{"^v9.4.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:fix","Feature:ILM","Team:Kibana
Management","backport:all-open","v9.4.0"],"title":"[ILM] A11y: Announce
invalid
field","number":260673,"url":"https://github.com/elastic/kibana/pull/260673","mergeCommit":{"message":"[ILM]
A11y: Announce invalid field (#260673)\n\nCloses
https://github.com/elastic/kibana/issues/219056\n\n## Summary\n- Fixes a
screen reader gap on Index Lifecycle Policies → Edit policy\nwhere the
Timing field showed a validation error visually, but NVDA\nwould only
announce a generic invalid state when the error was triggered\nvia the
units control.\n- Wires the Timing error message to both the min-age
number input and\nits units select so the specific error text is
announced when either\ncontrol is focused while invalid.\n\n### Test
plan\n- Manual (Windows 11 Pro, Chrome 131, NVDA)\n - Stack Management →
Index Lifecycle Policies → Edit policy\n- Navigate to the Delete phase,
then to the Timing controls for “Move\ndata into phase when”\n - Trigger
an invalid state for Timing\n - Focus the number input\n- **Expected**:
NVDA announces the specific validation error text (not\nonly “invalid
entry”)\n- Change the units select to a value that produces the same
invalid\nstate, then move focus away and back to the units select\n-
**Expected**: NVDA announces the same specific validation error
text\nfor the invalid field\n- Automated\n\n### Before/after notes\n-
References: WCAG 2.2 SC 3.3.1 (Error
Identification)\nhttps://www.w3.org/WAI/WCAG22/Understanding/error-identification.html\n-
Before/after behavior\n- **Before**: Error text was visible below the
Timing field, but NVDA\ndid not announce it when the error was produced
by interacting with the\nunits control (only a generic “invalid
entry”).\n- **After**: The specific Timing error text is
programmatically\nassociated to both Timing controls and is announced by
NVDA when\nfocusing either control while invalid.\n\n### Evidence\n<img
width=\"654\" height=\"303\" alt=\"Screenshot 2026-04-01 at 12 23
37\"\nsrc=\"https://github.com/user-attachments/assets/45ec7310-8acc-476d-8f10-294885c816e0\"\n/>","sha":"c2ef7162bd38774836f7109cbed66b422e7b10ac"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.4.0","branchLabelMappingKey":"^v9.4.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/260673","number":260673,"mergeCommit":{"message":"[ILM]
A11y: Announce invalid field (#260673)\n\nCloses
https://github.com/elastic/kibana/issues/219056\n\n## Summary\n- Fixes a
screen reader gap on Index Lifecycle Policies → Edit policy\nwhere the
Timing field showed a validation error visually, but NVDA\nwould only
announce a generic invalid state when the error was triggered\nvia the
units control.\n- Wires the Timing error message to both the min-age
number input and\nits units select so the specific error text is
announced when either\ncontrol is focused while invalid.\n\n### Test
plan\n- Manual (Windows 11 Pro, Chrome 131, NVDA)\n - Stack Management →
Index Lifecycle Policies → Edit policy\n- Navigate to the Delete phase,
then to the Timing controls for “Move\ndata into phase when”\n - Trigger
an invalid state for Timing\n - Focus the number input\n- **Expected**:
NVDA announces the specific validation error text (not\nonly “invalid
entry”)\n- Change the units select to a value that produces the same
invalid\nstate, then move focus away and back to the units select\n-
**Expected**: NVDA announces the same specific validation error
text\nfor the invalid field\n- Automated\n\n### Before/after notes\n-
References: WCAG 2.2 SC 3.3.1 (Error
Identification)\nhttps://www.w3.org/WAI/WCAG22/Understanding/error-identification.html\n-
Before/after behavior\n- **Before**: Error text was visible below the
Timing field, but NVDA\ndid not announce it when the error was produced
by interacting with the\nunits control (only a generic “invalid
entry”).\n- **After**: The specific Timing error text is
programmatically\nassociated to both Timing controls and is announced by
NVDA when\nfocusing either control while invalid.\n\n### Evidence\n<img
width=\"654\" height=\"303\" alt=\"Screenshot 2026-04-01 at 12 23
37\"\nsrc=\"https://github.com/user-attachments/assets/45ec7310-8acc-476d-8f10-294885c816e0\"\n/>","sha":"c2ef7162bd38774836f7109cbed66b422e7b10ac"}}]}]
BACKPORT-->

Co-authored-by: Sonia Sanz Vivas <sonia.sanzvivas@elastic.co>
kibanamachine added a commit that referenced this pull request Apr 10, 2026
# Backport

This will backport the following commits from `main` to `9.3`:
- [[ILM] A11y: Announce invalid field
(#260673)](#260673)

<!--- Backport version: 9.6.6 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sorenlouv/backport)

<!--BACKPORT [{"author":{"name":"Sonia Sanz
Vivas","email":"sonia.sanzvivas@elastic.co"},"sourceCommit":{"committedDate":"2026-04-10T07:48:10Z","message":"[ILM]
A11y: Announce invalid field (#260673)\n\nCloses
https://github.com/elastic/kibana/issues/219056\n\n## Summary\n- Fixes a
screen reader gap on Index Lifecycle Policies → Edit policy\nwhere the
Timing field showed a validation error visually, but NVDA\nwould only
announce a generic invalid state when the error was triggered\nvia the
units control.\n- Wires the Timing error message to both the min-age
number input and\nits units select so the specific error text is
announced when either\ncontrol is focused while invalid.\n\n### Test
plan\n- Manual (Windows 11 Pro, Chrome 131, NVDA)\n - Stack Management →
Index Lifecycle Policies → Edit policy\n- Navigate to the Delete phase,
then to the Timing controls for “Move\ndata into phase when”\n - Trigger
an invalid state for Timing\n - Focus the number input\n- **Expected**:
NVDA announces the specific validation error text (not\nonly “invalid
entry”)\n- Change the units select to a value that produces the same
invalid\nstate, then move focus away and back to the units select\n-
**Expected**: NVDA announces the same specific validation error
text\nfor the invalid field\n- Automated\n\n### Before/after notes\n-
References: WCAG 2.2 SC 3.3.1 (Error
Identification)\nhttps://www.w3.org/WAI/WCAG22/Understanding/error-identification.html\n-
Before/after behavior\n- **Before**: Error text was visible below the
Timing field, but NVDA\ndid not announce it when the error was produced
by interacting with the\nunits control (only a generic “invalid
entry”).\n- **After**: The specific Timing error text is
programmatically\nassociated to both Timing controls and is announced by
NVDA when\nfocusing either control while invalid.\n\n### Evidence\n<img
width=\"654\" height=\"303\" alt=\"Screenshot 2026-04-01 at 12 23
37\"\nsrc=\"https://github.com/user-attachments/assets/45ec7310-8acc-476d-8f10-294885c816e0\"\n/>","sha":"c2ef7162bd38774836f7109cbed66b422e7b10ac","branchLabelMapping":{"^v9.4.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:fix","Feature:ILM","Team:Kibana
Management","backport:all-open","v9.4.0"],"title":"[ILM] A11y: Announce
invalid
field","number":260673,"url":"https://github.com/elastic/kibana/pull/260673","mergeCommit":{"message":"[ILM]
A11y: Announce invalid field (#260673)\n\nCloses
https://github.com/elastic/kibana/issues/219056\n\n## Summary\n- Fixes a
screen reader gap on Index Lifecycle Policies → Edit policy\nwhere the
Timing field showed a validation error visually, but NVDA\nwould only
announce a generic invalid state when the error was triggered\nvia the
units control.\n- Wires the Timing error message to both the min-age
number input and\nits units select so the specific error text is
announced when either\ncontrol is focused while invalid.\n\n### Test
plan\n- Manual (Windows 11 Pro, Chrome 131, NVDA)\n - Stack Management →
Index Lifecycle Policies → Edit policy\n- Navigate to the Delete phase,
then to the Timing controls for “Move\ndata into phase when”\n - Trigger
an invalid state for Timing\n - Focus the number input\n- **Expected**:
NVDA announces the specific validation error text (not\nonly “invalid
entry”)\n- Change the units select to a value that produces the same
invalid\nstate, then move focus away and back to the units select\n-
**Expected**: NVDA announces the same specific validation error
text\nfor the invalid field\n- Automated\n\n### Before/after notes\n-
References: WCAG 2.2 SC 3.3.1 (Error
Identification)\nhttps://www.w3.org/WAI/WCAG22/Understanding/error-identification.html\n-
Before/after behavior\n- **Before**: Error text was visible below the
Timing field, but NVDA\ndid not announce it when the error was produced
by interacting with the\nunits control (only a generic “invalid
entry”).\n- **After**: The specific Timing error text is
programmatically\nassociated to both Timing controls and is announced by
NVDA when\nfocusing either control while invalid.\n\n### Evidence\n<img
width=\"654\" height=\"303\" alt=\"Screenshot 2026-04-01 at 12 23
37\"\nsrc=\"https://github.com/user-attachments/assets/45ec7310-8acc-476d-8f10-294885c816e0\"\n/>","sha":"c2ef7162bd38774836f7109cbed66b422e7b10ac"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.4.0","branchLabelMappingKey":"^v9.4.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/260673","number":260673,"mergeCommit":{"message":"[ILM]
A11y: Announce invalid field (#260673)\n\nCloses
https://github.com/elastic/kibana/issues/219056\n\n## Summary\n- Fixes a
screen reader gap on Index Lifecycle Policies → Edit policy\nwhere the
Timing field showed a validation error visually, but NVDA\nwould only
announce a generic invalid state when the error was triggered\nvia the
units control.\n- Wires the Timing error message to both the min-age
number input and\nits units select so the specific error text is
announced when either\ncontrol is focused while invalid.\n\n### Test
plan\n- Manual (Windows 11 Pro, Chrome 131, NVDA)\n - Stack Management →
Index Lifecycle Policies → Edit policy\n- Navigate to the Delete phase,
then to the Timing controls for “Move\ndata into phase when”\n - Trigger
an invalid state for Timing\n - Focus the number input\n- **Expected**:
NVDA announces the specific validation error text (not\nonly “invalid
entry”)\n- Change the units select to a value that produces the same
invalid\nstate, then move focus away and back to the units select\n-
**Expected**: NVDA announces the same specific validation error
text\nfor the invalid field\n- Automated\n\n### Before/after notes\n-
References: WCAG 2.2 SC 3.3.1 (Error
Identification)\nhttps://www.w3.org/WAI/WCAG22/Understanding/error-identification.html\n-
Before/after behavior\n- **Before**: Error text was visible below the
Timing field, but NVDA\ndid not announce it when the error was produced
by interacting with the\nunits control (only a generic “invalid
entry”).\n- **After**: The specific Timing error text is
programmatically\nassociated to both Timing controls and is announced by
NVDA when\nfocusing either control while invalid.\n\n### Evidence\n<img
width=\"654\" height=\"303\" alt=\"Screenshot 2026-04-01 at 12 23
37\"\nsrc=\"https://github.com/user-attachments/assets/45ec7310-8acc-476d-8f10-294885c816e0\"\n/>","sha":"c2ef7162bd38774836f7109cbed66b422e7b10ac"}}]}]
BACKPORT-->

Co-authored-by: Sonia Sanz Vivas <sonia.sanzvivas@elastic.co>
kibanamachine added a commit that referenced this pull request Apr 10, 2026
# Backport

This will backport the following commits from `main` to `9.2`:
- [[ILM] A11y: Announce invalid field
(#260673)](#260673)

<!--- Backport version: 9.6.6 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sorenlouv/backport)

<!--BACKPORT [{"author":{"name":"Sonia Sanz
Vivas","email":"sonia.sanzvivas@elastic.co"},"sourceCommit":{"committedDate":"2026-04-10T07:48:10Z","message":"[ILM]
A11y: Announce invalid field (#260673)\n\nCloses
https://github.com/elastic/kibana/issues/219056\n\n## Summary\n- Fixes a
screen reader gap on Index Lifecycle Policies → Edit policy\nwhere the
Timing field showed a validation error visually, but NVDA\nwould only
announce a generic invalid state when the error was triggered\nvia the
units control.\n- Wires the Timing error message to both the min-age
number input and\nits units select so the specific error text is
announced when either\ncontrol is focused while invalid.\n\n### Test
plan\n- Manual (Windows 11 Pro, Chrome 131, NVDA)\n - Stack Management →
Index Lifecycle Policies → Edit policy\n- Navigate to the Delete phase,
then to the Timing controls for “Move\ndata into phase when”\n - Trigger
an invalid state for Timing\n - Focus the number input\n- **Expected**:
NVDA announces the specific validation error text (not\nonly “invalid
entry”)\n- Change the units select to a value that produces the same
invalid\nstate, then move focus away and back to the units select\n-
**Expected**: NVDA announces the same specific validation error
text\nfor the invalid field\n- Automated\n\n### Before/after notes\n-
References: WCAG 2.2 SC 3.3.1 (Error
Identification)\nhttps://www.w3.org/WAI/WCAG22/Understanding/error-identification.html\n-
Before/after behavior\n- **Before**: Error text was visible below the
Timing field, but NVDA\ndid not announce it when the error was produced
by interacting with the\nunits control (only a generic “invalid
entry”).\n- **After**: The specific Timing error text is
programmatically\nassociated to both Timing controls and is announced by
NVDA when\nfocusing either control while invalid.\n\n### Evidence\n<img
width=\"654\" height=\"303\" alt=\"Screenshot 2026-04-01 at 12 23
37\"\nsrc=\"https://github.com/user-attachments/assets/45ec7310-8acc-476d-8f10-294885c816e0\"\n/>","sha":"c2ef7162bd38774836f7109cbed66b422e7b10ac","branchLabelMapping":{"^v9.4.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:fix","Feature:ILM","Team:Kibana
Management","backport:all-open","v9.4.0"],"title":"[ILM] A11y: Announce
invalid
field","number":260673,"url":"https://github.com/elastic/kibana/pull/260673","mergeCommit":{"message":"[ILM]
A11y: Announce invalid field (#260673)\n\nCloses
https://github.com/elastic/kibana/issues/219056\n\n## Summary\n- Fixes a
screen reader gap on Index Lifecycle Policies → Edit policy\nwhere the
Timing field showed a validation error visually, but NVDA\nwould only
announce a generic invalid state when the error was triggered\nvia the
units control.\n- Wires the Timing error message to both the min-age
number input and\nits units select so the specific error text is
announced when either\ncontrol is focused while invalid.\n\n### Test
plan\n- Manual (Windows 11 Pro, Chrome 131, NVDA)\n - Stack Management →
Index Lifecycle Policies → Edit policy\n- Navigate to the Delete phase,
then to the Timing controls for “Move\ndata into phase when”\n - Trigger
an invalid state for Timing\n - Focus the number input\n- **Expected**:
NVDA announces the specific validation error text (not\nonly “invalid
entry”)\n- Change the units select to a value that produces the same
invalid\nstate, then move focus away and back to the units select\n-
**Expected**: NVDA announces the same specific validation error
text\nfor the invalid field\n- Automated\n\n### Before/after notes\n-
References: WCAG 2.2 SC 3.3.1 (Error
Identification)\nhttps://www.w3.org/WAI/WCAG22/Understanding/error-identification.html\n-
Before/after behavior\n- **Before**: Error text was visible below the
Timing field, but NVDA\ndid not announce it when the error was produced
by interacting with the\nunits control (only a generic “invalid
entry”).\n- **After**: The specific Timing error text is
programmatically\nassociated to both Timing controls and is announced by
NVDA when\nfocusing either control while invalid.\n\n### Evidence\n<img
width=\"654\" height=\"303\" alt=\"Screenshot 2026-04-01 at 12 23
37\"\nsrc=\"https://github.com/user-attachments/assets/45ec7310-8acc-476d-8f10-294885c816e0\"\n/>","sha":"c2ef7162bd38774836f7109cbed66b422e7b10ac"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.4.0","branchLabelMappingKey":"^v9.4.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/260673","number":260673,"mergeCommit":{"message":"[ILM]
A11y: Announce invalid field (#260673)\n\nCloses
https://github.com/elastic/kibana/issues/219056\n\n## Summary\n- Fixes a
screen reader gap on Index Lifecycle Policies → Edit policy\nwhere the
Timing field showed a validation error visually, but NVDA\nwould only
announce a generic invalid state when the error was triggered\nvia the
units control.\n- Wires the Timing error message to both the min-age
number input and\nits units select so the specific error text is
announced when either\ncontrol is focused while invalid.\n\n### Test
plan\n- Manual (Windows 11 Pro, Chrome 131, NVDA)\n - Stack Management →
Index Lifecycle Policies → Edit policy\n- Navigate to the Delete phase,
then to the Timing controls for “Move\ndata into phase when”\n - Trigger
an invalid state for Timing\n - Focus the number input\n- **Expected**:
NVDA announces the specific validation error text (not\nonly “invalid
entry”)\n- Change the units select to a value that produces the same
invalid\nstate, then move focus away and back to the units select\n-
**Expected**: NVDA announces the same specific validation error
text\nfor the invalid field\n- Automated\n\n### Before/after notes\n-
References: WCAG 2.2 SC 3.3.1 (Error
Identification)\nhttps://www.w3.org/WAI/WCAG22/Understanding/error-identification.html\n-
Before/after behavior\n- **Before**: Error text was visible below the
Timing field, but NVDA\ndid not announce it when the error was produced
by interacting with the\nunits control (only a generic “invalid
entry”).\n- **After**: The specific Timing error text is
programmatically\nassociated to both Timing controls and is announced by
NVDA when\nfocusing either control while invalid.\n\n### Evidence\n<img
width=\"654\" height=\"303\" alt=\"Screenshot 2026-04-01 at 12 23
37\"\nsrc=\"https://github.com/user-attachments/assets/45ec7310-8acc-476d-8f10-294885c816e0\"\n/>","sha":"c2ef7162bd38774836f7109cbed66b422e7b10ac"}}]}]
BACKPORT-->

Co-authored-by: Sonia Sanz Vivas <sonia.sanzvivas@elastic.co>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport:all-open Backport to all branches that could still receive a release Feature:ILM release_note:fix Team:Kibana Management Dev Tools, Index Management, Upgrade Assistant, ILM, Ingest Node Pipelines, and more t// v8.19.15 v9.2.9 v9.3.4 v9.4.0

4 participants