From 58ecd0d3e9c83f30ffb37b74736f35019659f4ad Mon Sep 17 00:00:00 2001 From: Maria Hutt Date: Tue, 16 Jun 2026 06:50:03 -0700 Subject: [PATCH 1/6] feat(select): remove role from action sheet interface --- core/src/components/select/select.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/components/select/select.tsx b/core/src/components/select/select.tsx index e82de53b1ae..73fb6c59ac7 100644 --- a/core/src/components/select/select.tsx +++ b/core/src/components/select/select.tsx @@ -595,7 +595,6 @@ export class Select implements ComponentInterface { const isSelected = isOptionSelected(selectValue, value, this.compareWith); return { - role: isSelected ? 'selected' : '', text: option.textContent, cssClass: optClass, handler: () => { From 8c3fbf84fc17cbbe57d116e1d321390d8d9e8eeb Mon Sep 17 00:00:00 2001 From: Maria Hutt Date: Tue, 16 Jun 2026 09:48:41 -0700 Subject: [PATCH 2/6] docs(BREAKING): add selected role removal --- BREAKING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/BREAKING.md b/BREAKING.md index 2fbe586ea87..7016029ff23 100644 --- a/BREAKING.md +++ b/BREAKING.md @@ -120,6 +120,12 @@ The `ionChange` event on `ion-select` now only fires when the selected value act Apps that relied on `ionChange` firing on every confirmation (for example, to detect overlay dismissal without a value change) should listen for `ionDismiss` instead, or use the `didDismiss` event on the underlying alert or action sheet. +**Action Sheet Interface `selected` Role Removed** + +When using `interface="action-sheet"`, `ion-select` no longer assigns the `selected` role to the action sheet button for the currently selected option. This aligns the `action-sheet` interface with the `alert`, `popover`, and `modal` interfaces, none of which assign this role. The selected option's styling is unchanged because it is driven by the option's checked state. + +Because the option button no longer carries the `selected` role, the action sheet's dismiss role for a selected option is no longer `"selected"`. Apps that inspected this role to detect that a value was chosen, such as reading `role` from the underlying action sheet's `onDidDismiss` result, should listen for `ion-select`'s `ionChange` event instead, which emits the selected value when the selection changes. +

Framework Specific

Angular

From 376fef9b72af478a005110039b18a76785322b85 Mon Sep 17 00:00:00 2001 From: Maria Hutt Date: Tue, 16 Jun 2026 14:16:25 -0700 Subject: [PATCH 3/6] docs(BREAKING): add section title --- BREAKING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BREAKING.md b/BREAKING.md index 7016029ff23..d5951964bc8 100644 --- a/BREAKING.md +++ b/BREAKING.md @@ -116,6 +116,8 @@ The string form no longer behaves the same way. Because an HTML attribute coerce

Select

+**`ionChange` Only Fires When the Value Changes** + The `ionChange` event on `ion-select` now only fires when the selected value actually changes. Previously, the `alert` and `action-sheet` interfaces emitted `ionChange` every time the overlay was confirmed, even when the user chose the option that was already selected. This aligns the `alert` and `action-sheet` interfaces with the existing behavior of the `popover` and `modal` interfaces, and with the documented contract of `ionChange`. Apps that relied on `ionChange` firing on every confirmation (for example, to detect overlay dismissal without a value change) should listen for `ionDismiss` instead, or use the `didDismiss` event on the underlying alert or action sheet. From e546e913bd42fedc0289169d748fd91bdbd31d73 Mon Sep 17 00:00:00 2001 From: Maria Hutt Date: Tue, 16 Jun 2026 14:23:39 -0700 Subject: [PATCH 4/6] docs(BREAKING): clarify when selected role is passed --- BREAKING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BREAKING.md b/BREAKING.md index d5951964bc8..34598c12f24 100644 --- a/BREAKING.md +++ b/BREAKING.md @@ -126,7 +126,7 @@ Apps that relied on `ionChange` firing on every confirmation (for example, to de When using `interface="action-sheet"`, `ion-select` no longer assigns the `selected` role to the action sheet button for the currently selected option. This aligns the `action-sheet` interface with the `alert`, `popover`, and `modal` interfaces, none of which assign this role. The selected option's styling is unchanged because it is driven by the option's checked state. -Because the option button no longer carries the `selected` role, the action sheet's dismiss role for a selected option is no longer `"selected"`. Apps that inspected this role to detect that a value was chosen, such as reading `role` from the underlying action sheet's `onDidDismiss` result, should listen for `ion-select`'s `ionChange` event instead, which emits the selected value when the selection changes. +Previously, the `selected` role was assigned only to the option matching the select's current value. Because the dismiss role mirrors the tapped button, this surfaced in just one case: re-selecting the already-selected option dismissed the action sheet with `role: "selected"` in `ionActionSheetDidDismiss`. Tapping any other option changed the value and dismissed with `role: ""`. That role is no longer `"selected"` in either case. Apps that inspected this role to detect that a value was chosen, such as reading `role` from the underlying action sheet's `onDidDismiss` result, should listen for `ion-select`'s `ionChange` event instead, which emits the selected value when the selection changes.

Framework Specific

From 9962d4023afe36608f7e20618af79c5ddedf2463 Mon Sep 17 00:00:00 2001 From: Maria Hutt Date: Tue, 16 Jun 2026 14:25:22 -0700 Subject: [PATCH 5/6] docs(BREAKING): remove style control mention Co-authored-by: Brandy Smith --- BREAKING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BREAKING.md b/BREAKING.md index 34598c12f24..1bb7f0711f9 100644 --- a/BREAKING.md +++ b/BREAKING.md @@ -124,7 +124,7 @@ Apps that relied on `ionChange` firing on every confirmation (for example, to de **Action Sheet Interface `selected` Role Removed** -When using `interface="action-sheet"`, `ion-select` no longer assigns the `selected` role to the action sheet button for the currently selected option. This aligns the `action-sheet` interface with the `alert`, `popover`, and `modal` interfaces, none of which assign this role. The selected option's styling is unchanged because it is driven by the option's checked state. +When using `interface="action-sheet"`, `ion-select` no longer assigns the `selected` role to the action sheet button for the currently selected option. This aligns the `action-sheet` interface with the `alert`, `popover`, and `modal` interfaces, none of which assign this role. This does not change the selected option's styling. Previously, the `selected` role was assigned only to the option matching the select's current value. Because the dismiss role mirrors the tapped button, this surfaced in just one case: re-selecting the already-selected option dismissed the action sheet with `role: "selected"` in `ionActionSheetDidDismiss`. Tapping any other option changed the value and dismissed with `role: ""`. That role is no longer `"selected"` in either case. Apps that inspected this role to detect that a value was chosen, such as reading `role` from the underlying action sheet's `onDidDismiss` result, should listen for `ion-select`'s `ionChange` event instead, which emits the selected value when the selection changes. From a53543faf304d79a8a354f972abc38ccee01c305 Mon Sep 17 00:00:00 2001 From: Maria Hutt Date: Tue, 16 Jun 2026 15:58:38 -0700 Subject: [PATCH 6/6] docs(BREAKING): clarify undefined value --- BREAKING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BREAKING.md b/BREAKING.md index 1bb7f0711f9..9edb83d3030 100644 --- a/BREAKING.md +++ b/BREAKING.md @@ -126,7 +126,7 @@ Apps that relied on `ionChange` firing on every confirmation (for example, to de When using `interface="action-sheet"`, `ion-select` no longer assigns the `selected` role to the action sheet button for the currently selected option. This aligns the `action-sheet` interface with the `alert`, `popover`, and `modal` interfaces, none of which assign this role. This does not change the selected option's styling. -Previously, the `selected` role was assigned only to the option matching the select's current value. Because the dismiss role mirrors the tapped button, this surfaced in just one case: re-selecting the already-selected option dismissed the action sheet with `role: "selected"` in `ionActionSheetDidDismiss`. Tapping any other option changed the value and dismissed with `role: ""`. That role is no longer `"selected"` in either case. Apps that inspected this role to detect that a value was chosen, such as reading `role` from the underlying action sheet's `onDidDismiss` result, should listen for `ion-select`'s `ionChange` event instead, which emits the selected value when the selection changes. +Previously, the `selected` role was assigned only to the option matching the select's current value. Because the dismiss role mirrors the tapped button, this surfaced in just one case: re-selecting the already-selected option dismissed the action sheet with `role: "selected"` in `ionActionSheetDidDismiss`. Tapping any other option changed the value and dismissed with `role: ""`. Now that the role is no longer assigned, both cases dismiss with `role: undefined`. Apps that inspected this role to detect that a value was chosen, such as reading `role` from the underlying action sheet's `onDidDismiss` result, should listen for `ion-select`'s `ionChange` event instead, which emits the selected value when the selection changes.

Framework Specific