Skip to content

chore(git): sync with main#31121

Merged
ShaneK merged 6 commits intomajor-9.0from
sync-major-9.0-with-main
May 6, 2026
Merged

chore(git): sync with main#31121
ShaneK merged 6 commits intomajor-9.0from
sync-major-9.0-with-main

Conversation

@ShaneK
Copy link
Copy Markdown
Member

@ShaneK ShaneK commented May 6, 2026

Sync major-9.0 with main.

aeharding and others added 6 commits May 5, 2026 22:50
…uttons (#31109)

Issue number: resolves #31090

---------

## What is the current behavior?

Buttons configured with `role: "selected"` no longer receive the
`action-sheet-selected` CSS class. Userland styling that targets
`.action-sheet-selected` (the documented hook for marking the active
option — bold text, custom checkmarks, etc.) silently stopped working as
of `8.7.12`.

This regressed in #30769 (`fix(select, action-sheet): use radio role for
options`). The new render path computes the button's class as:

```tsx
class={{
  ...buttonClass(b),
  'action-sheet-selected': isActiveRadio,
}}
```

`buttonClass(b)` already emits `'action-sheet-selected': true` for
`role: "selected"` (via `[action-sheet-${button.role}]]: button.role !==
undefined`), but the second key with the same name overrides it. For any
non-radio button `isActiveRadio` is `false`, so the class is dropped
from the rendered `<button>`.

### Repro

```html
<ion-action-sheet id="sheet" header="Choose"></ion-action-sheet>
<script type="module">
  await customElements.whenDefined("ion-action-sheet");
  const sheet = document.getElementById("sheet");
  sheet.buttons = [
    { text: "Option A" },
    { text: "Option B", role: "selected" },
    { text: "Cancel", role: "cancel" },
  ];
  await sheet.present();
</script>
```

In `8.7.11` the Option B button gets `action-sheet-selected`. In
`8.7.12+` it does not.

## What is the new behavior?

- Only override `action-sheet-selected` based on `isActiveRadio` when
the button actually participates in the radio group
(`b.htmlAttributes?.role === 'radio'`). For non-radio buttons, the class
map produced by `buttonClass(b)` is left untouched, so `role:
"selected"` keeps emitting `action-sheet-selected` exactly as it has
since the component was introduced.
- Adds a spec-test regression covering the `role: "selected"` case.

This preserves the new radio-group behavior introduced in #30769 (when
the button is a radio, `action-sheet-selected` follows `activeRadioId`)
and restores the documented public API.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

## Other information

- The minified output for the lazy + custom-elements bundles becomes
`Object.assign(Object.assign({}, buttonClass(b)), isRadio &&
{"action-sheet-selected": isActiveRadio})`. When `isRadio` is `false`,
`Object.assign(target, false)` is a no-op and the class set by
`buttonClass(b)` is preserved.
- Verified in a real consumer app on 8.8.4: with this patch built and
installed locally, `role: "selected"` once again renders `class="...
action-sheet-selected ..."` on the `<button>`.


Made with [Cursor](https://cursor.com)
…31112)

Issue number: resolves internal

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
- When the first segment is disabled and the last item is selected, if
the user swipes the `segment-view`, the first `segment-button` gets
checked even if it is disabled, and the view is presenting other
`segment-view`.

## What is the new behavior?

- A validation was added to ensure that the `segment-button` can only be
checked if it is not disabled

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!--
  If this introduces a breaking change:
1. Describe the impact and migration path for existing applications
below.
  2. Update the BREAKING.md file with the breaking change.
3. Add "BREAKING CHANGE: [...]" to the commit description when merging.
See
https://github.com/ionic-team/ionic-framework/blob/main/docs/CONTRIBUTING.md#footer
for more information.
-->
# Conflicts:
#	packages/react-router/package-lock.json
#	packages/react/package-lock.json
#	packages/react/package.json
#	packages/vue/package-lock.json
#	packages/vue/package.json
@ShaneK ShaneK requested a review from a team as a code owner May 6, 2026 22:03
@ShaneK ShaneK requested a review from brandyscarney May 6, 2026 22:03
@vercel
Copy link
Copy Markdown

vercel Bot commented May 6, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ionic-framework Ready Ready Preview, Comment May 6, 2026 10:08pm

Request Review

@github-actions github-actions Bot added package: core @ionic/core package package: angular @ionic/angular package package: vue @ionic/vue package package: react @ionic/react package labels May 6, 2026
@ShaneK ShaneK merged commit 29b20cd into major-9.0 May 6, 2026
50 checks passed
@ShaneK ShaneK deleted the sync-major-9.0-with-main branch May 6, 2026 22:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

package: angular @ionic/angular package package: core @ionic/core package package: react @ionic/react package package: vue @ionic/vue package

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants