Skip to content

chore(git): sync with main#31208

Merged
ShaneK merged 19 commits into
nextfrom
sync-next-with-main
Jun 10, 2026
Merged

chore(git): sync with main#31208
ShaneK merged 19 commits into
nextfrom
sync-next-with-main

Conversation

@ShaneK

@ShaneK ShaneK commented Jun 10, 2026

Copy link
Copy Markdown
Member

Sync next with main.

brandyscarney and others added 16 commits May 28, 2026 19:00
Many of the controller tests are using the wrong path to import the
overlay controllers. This results in those tests not working in Vercel.

To reproduce the issue:

1. Open the [Action Sheet
(main)](https://ionic-framework-git-main-ionic1.vercel.app/src/components/action-sheet/test/basic)
preview
2. Attempt to open any Action Sheet
3. See the Action Sheet does not open and there is the following console
error: `ReferenceError: actionSheetController is not defined`

To see it working:

1. Open the [Action Sheet
(branch)](https://ionic-framework-git-test-vercel-controllers-ionic1.vercel.app/src/components/action-sheet/test/basic)
preview
2. Attempt to open any Action Sheet
3. See the Action Sheet opens without any errors

This should be able to reproduce on any of the updated tests.

Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com>
Issue number: resolves #19566, resolves #19365

---------

<!-- 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?

Clicking an `ion-router-link` whose `href` contains a `#fragment` (e.g.
`/catalog#pens`) fails to navigate and logs `not part of the routing
set`. `parsePath` in `core/src/components/router/utils/path.ts` only
splits on `?`, so the fragment gets folded into the last path segment
and no registered route matches. Even when navigation succeeds, the
matching anchor is never scrolled into view.

## What is the new behavior?

`parsePath` extracts the fragment as a separate field, and
`writeSegments` writes it back onto the URL via `pushState`. Routes
match against the path segments alone, so `/catalog#pens` resolves to
the `/catalog` route as expected.

After `writeNavStateRoot` resolves, the router polls a few animation
frames for an element matching the fragment inside the active page, then
smooth-scrolls to it via `ion-content.scrollToPoint`, falling back to
`Element.scrollIntoView` when the target sits outside `ion-content`. A
`fragmentScrollToken` cancels any in-flight scroll the moment a newer
`setSegments` runs.

## 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.
-->


## Other information

The fragment lookup scopes to the last `.ion-page:not(.ion-page-hidden)`
in the document. Nested outlets can have multiple non-hidden pages
mounted at once, and an identically-named anchor on a parent page would
otherwise win over the leaf the user is viewing.

Preview pages:
-
[router/basic](https://ionic-framework-git-fw-6958-ionic1.vercel.app/src/components/router/test/basic#/two)
Issue number: resolves stenciljs/core#6727

## What is the current behavior?

When a component property's default value is set to a JavaScript
variable (e.g. `QUERY['lg']` on `ion-split-pane`'s `when` prop), Stencil
emits the raw variable expression into the generated documentation files
(`api.txt`, `components.d.ts`, and `dist/docs.json`). This causes the
[component API
docs](https://ionicframework.com/docs/api/split-pane#prop-when) to
display `QUERY['lg']` instead of the resolved value `'(min-width:
992px)'`.

## What is the new behavior?

Stencil 4.43.5 (via stenciljs/core#6728) resolves variable references at
doc-generation time. After bumping and rebuilding:

- `core/api.txt` — `ion-split-pane`'s `when` default is now
`'(min-width: 992px)'`
- `core/src/components.d.ts` — `@default` JSDoc tag reflects the
resolved value
- `dist/docs.json` (published as `@ionic/docs`) — will also carry the
resolved value once released, enabling ionic-docs to remove the
hardcoded fallbacks for the `gallery` component

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

## Other information

- Stencil changelog:
https://github.com/stenciljs/core/releases/tag/v4.43.5
- Upstream fix: stenciljs/core#6728
- Once this is released as part of Ionic, a PR will be automatically
created in `ionic-docs` using the updated `@ionic/docs` package — at
that point the hardcoded default descriptions for `gallery`'s `columns`
and `gap` props can be removed.
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@capacitor/core](https://capacitorjs.com)
([source](https://redirect.github.com/ionic-team/capacitor)) | [`8.3.4`
→
`8.4.0`](https://renovatebot.com/diffs/npm/@capacitor%2fcore/8.3.4/8.4.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@capacitor%2fcore/8.4.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@capacitor%2fcore/8.3.4/8.4.0?slim=true)
|

---

### Release Notes

<details>
<summary>ionic-team/capacitor (@&#8203;capacitor/core)</summary>

###
[`v8.4.0`](https://redirect.github.com/ionic-team/capacitor/blob/HEAD/CHANGELOG.md#840-2026-06-02)

[Compare
Source](https://redirect.github.com/ionic-team/capacitor/compare/8.3.4...8.4.0)

##### Bug Fixes

- **android:** show only the requested system bar
([#&#8203;8480](https://redirect.github.com/ionic-team/capacitor/issues/8480))
([4c6c321](https://redirect.github.com/ionic-team/capacitor/commit/4c6c3219afb5223211e857457e46283c37eb9424))
- **cli:** revert live reload config on failure
([#&#8203;8485](https://redirect.github.com/ionic-team/capacitor/issues/8485))
([1d031a4](https://redirect.github.com/ionic-team/capacitor/commit/1d031a4abec2c793079ba8897ad2e40c4cc6c7f9))
- **SystemBars:** make `safe-area-inset-x` available on API <= 34
([#&#8203;8424](https://redirect.github.com/ionic-team/capacitor/issues/8424))
([e456de0](https://redirect.github.com/ionic-team/capacitor/commit/e456de083e19644f484bec5a5359cb67960ac8bc))
- **SystemBars:** respect `insetsHandling` disable
([#&#8203;8481](https://redirect.github.com/ionic-team/capacitor/issues/8481))
([d4ad7ff](https://redirect.github.com/ionic-team/capacitor/commit/d4ad7ffe39daf66e0cfc63af9028d5c05543bde7))

##### Features

- add method getDouble to plugin config
([#&#8203;7638](https://redirect.github.com/ionic-team/capacitor/issues/7638))
([93c72de](https://redirect.github.com/ionic-team/capacitor/commit/93c72de40a2ec4c78b33659250cb08340083088e))
- **cli:** add experimental packageOptions
([#&#8203;8471](https://redirect.github.com/ionic-team/capacitor/issues/8471))
([258867b](https://redirect.github.com/ionic-team/capacitor/commit/258867b7bf37b1837b99b02ec9638e5a6df08d97))
- **cli:** capture ios\_package\_manager in telemetry
([#&#8203;8482](https://redirect.github.com/ionic-team/capacitor/issues/8482))
([b4b297a](https://redirect.github.com/ionic-team/capacitor/commit/b4b297a52f8732659662d5e5aaeff81c0f7d9835))

####
[8.3.4](https://redirect.github.com/ionic-team/capacitor/compare/8.3.3...8.3.4)
(2026-05-12)

**Note:** Version bump only for package capacitor

####
[8.3.3](https://redirect.github.com/ionic-team/capacitor/compare/8.3.2...8.3.3)
(2026-05-08)

##### Bug Fixes

- **cli:** copy plugin files in CocoaPods projects
([#&#8203;8467](https://redirect.github.com/ionic-team/capacitor/issues/8467))
([b2d7719](https://redirect.github.com/ionic-team/capacitor/commit/b2d771926a180e60deea31992d7d4abcd5ca3bc7))

####
[8.3.2](https://redirect.github.com/ionic-team/capacitor/compare/8.3.1...8.3.2)
(2026-05-07)

##### Bug Fixes

- **cli:** add cSettings support for compiler flags in generated
Package.swift
([#&#8203;8448](https://redirect.github.com/ionic-team/capacitor/issues/8448))
([0bd0676](https://redirect.github.com/ionic-team/capacitor/commit/0bd0676315c5fd77e50312dd7b5bf4990dcbd7d0))
- **cli:** add system framework and weak framework support in SPM
Package.swift
([#&#8203;8447](https://redirect.github.com/ionic-team/capacitor/issues/8447))
([3232f0f](https://redirect.github.com/ionic-team/capacitor/commit/3232f0fe1d9811b0b5c500e3dc05cb8a250177f8))
- **cli:** correct Capacitor plugin SPM compat check
([#&#8203;8440](https://redirect.github.com/ionic-team/capacitor/issues/8440))
([e5ccc45](https://redirect.github.com/ionic-team/capacitor/commit/e5ccc451dda27d56bca824ed644bd20fe4d988cb))
- **cli:** generate binaryTarget entries for custom xcframeworks in
Package.swift
([#&#8203;8445](https://redirect.github.com/ionic-team/capacitor/issues/8445))
([1f7e33f](https://redirect.github.com/ionic-team/capacitor/commit/1f7e33fca43d183332ec19d22b0d75ef81d8cc6d))
- **cli:** generate resource entries in Package.swift
([#&#8203;8455](https://redirect.github.com/ionic-team/capacitor/issues/8455))
([790bd27](https://redirect.github.com/ionic-team/capacitor/commit/790bd27123497111984227010c3162cec94a108e))
- **cli:** handle Cordova plugins without iOS source files
([#&#8203;8443](https://redirect.github.com/ionic-team/capacitor/issues/8443))
([0da130e](https://redirect.github.com/ionic-team/capacitor/commit/0da130eb7a861bee4e2c35bc0aac53ba9c983fc3))
- **cli:** link plugin dependencies in Package.swift
([#&#8203;8457](https://redirect.github.com/ionic-team/capacitor/issues/8457))
([b3c769e](https://redirect.github.com/ionic-team/capacitor/commit/b3c769e856c826b1174518877cf86ac7ce73bf09))
- **ios:** support Cordova plugins with Package.swift
([#&#8203;8438](https://redirect.github.com/ionic-team/capacitor/issues/8438))
([139943b](https://redirect.github.com/ionic-team/capacitor/commit/139943b0c05fddb2d1ce2d6f468800fddf17b4cf))
- **SystemBars:** avoid extra view padding on API <= 34
([#&#8203;8439](https://redirect.github.com/ionic-team/capacitor/issues/8439))
([5b135a7](https://redirect.github.com/ionic-team/capacitor/commit/5b135a70217be560e7176c8d5b514cc92ed3e4e4))

####
[8.3.1](https://redirect.github.com/ionic-team/capacitor/compare/8.3.0...8.3.1)
(2026-04-16)

##### Bug Fixes

- **android:** handle null versionName in isNewBinary()
([#&#8203;8397](https://redirect.github.com/ionic-team/capacitor/issues/8397))
([aa1a660](https://redirect.github.com/ionic-team/capacitor/commit/aa1a660f364f9b5f5a1e350e279c8864b04dd13b))
- boundary value extraction for form-data requests
([#&#8203;7518](https://redirect.github.com/ionic-team/capacitor/issues/7518))
([64ab854](https://redirect.github.com/ionic-team/capacitor/commit/64ab854c12330804c24275d88d3a9f7c8e52a73d))
- **cli:** check CAPACITOR\_COCOAPODS\_PATH in determinePackageManager
([#&#8203;8407](https://redirect.github.com/ionic-team/capacitor/issues/8407))
([acb64ab](https://redirect.github.com/ionic-team/capacitor/commit/acb64ab92a37ff53701cde453558e272e2e11eb6))
- **system-bars:** use separate current styles
([#&#8203;8409](https://redirect.github.com/ionic-team/capacitor/issues/8409))
([3d1f8d1](https://redirect.github.com/ionic-team/capacitor/commit/3d1f8d1b61480187375f5cd4de7ba999db007542))

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "every weekday before 11am"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/ionic-team/ionic-framework).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMDkuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIwOS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[pozil/auto-assign-issue](https://redirect.github.com/pozil/auto-assign-issue)
| action | major | `v3.0.0` → `v4.0.0` |

---

### Release Notes

<details>
<summary>pozil/auto-assign-issue (pozil/auto-assign-issue)</summary>

###
[`v4.0.0`](https://redirect.github.com/pozil/auto-assign-issue/compare/v3.0.0...v4.0.0)

[Compare
Source](https://redirect.github.com/pozil/auto-assign-issue/compare/v3.0.0...v4.0.0)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "every weekday before 11am"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/ionic-team/ionic-framework).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMDkuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIwOS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Issue number: N/A

---------

<!-- 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?
<!-- Please describe the current behavior that you are modifying. -->

The Renovate `playwright` npm rule only matched `@playwright/test` and
`@axe-core/playwright`. As a result, `playwright-core` was not included
in the `playwright` group and instead fell into Renovate's default
`playwright-monorepo` grouping, opening a separate
`renovate/playwright-monorepo` PR alongside the main
`renovate/playwright` PR for every Playwright release.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- Added `playwright-core` to the npm rule's `matchPackageNames` so it
groups with the other Playwright packages.
- Switched the npm rule from `matchPackagePatterns` to
`matchPackageNames` since the entries are exact package names, not
patterns; the explicit list is clearer for a small, stable set of
dependencies.
- All Playwright-related updates (`@playwright/test`,
`@axe-core/playwright`, `playwright-core`, and the
`mcr.microsoft.com/playwright` Docker image) will now land in a single
`renovate/playwright` PR.

## 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.
-->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

N/A
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/checkout](https://redirect.github.com/actions/checkout) |
action | patch | `v6.0.2` → `v6.0.3` |

---

### Release Notes

<details>
<summary>actions/checkout (actions/checkout)</summary>

###
[`v6.0.3`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v603)

[Compare
Source](https://redirect.github.com/actions/checkout/compare/v6.0.2...v6.0.3)

- Fix checkout init for SHA-256 repositories by
[@&#8203;yaananth](https://redirect.github.com/yaananth) in
[#&#8203;2439](https://redirect.github.com/actions/checkout/pull/2439)
- fix: expand merge commit SHA regex and add SHA-256 test cases by
[@&#8203;yaananth](https://redirect.github.com/yaananth) in
[#&#8203;2414](https://redirect.github.com/actions/checkout/pull/2414)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "every weekday before 11am"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/ionic-team/ionic-framework).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMDkuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIwOS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) | Type |
Update |
|---|---|---|---|---|---|
| [@playwright/test](https://playwright.dev)
([source](https://redirect.github.com/microsoft/playwright)) |
[`^1.59.1` →
`^1.60.0`](https://renovatebot.com/diffs/npm/@playwright%2ftest/1.59.1/1.60.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@playwright%2ftest/1.60.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@playwright%2ftest/1.59.1/1.60.0?slim=true)
| devDependencies | minor |
| [playwright-core](https://playwright.dev)
([source](https://redirect.github.com/microsoft/playwright)) | [`1.59.1`
→
`1.60.0`](https://renovatebot.com/diffs/npm/playwright-core/1.59.1/1.60.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/playwright-core/1.60.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/playwright-core/1.59.1/1.60.0?slim=true)
| devDependencies | minor |
| mcr.microsoft.com/playwright | `v1.59.1` → `v1.60.0` |
![age](https://developer.mend.io/api/mc/badges/age/docker/mcr.microsoft.com%2fplaywright/v1.60.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/docker/mcr.microsoft.com%2fplaywright/v1.59.1/v1.60.0?slim=true)
| final | minor |

---

### Release Notes

<details>
<summary>microsoft/playwright (@&#8203;playwright/test)</summary>

###
[`v1.60.0`](https://redirect.github.com/microsoft/playwright/releases/tag/v1.60.0)

[Compare
Source](https://redirect.github.com/microsoft/playwright/compare/v1.59.1...v1.60.0)

#### 🌐 HAR recording on Tracing


[tracing.startHar()](https://playwright.dev/docs/api/class-tracing#tracing-start-har)
/
[tracing.stopHar()](https://playwright.dev/docs/api/class-tracing#tracing-stop-har)
expose HAR recording as a first-class tracing API, with the same
`content`, `mode` and `urlFilter` options as `recordHar`. The returned
[Disposable](https://playwright.dev/docs/api/class-disposable) makes it
easy to scope a recording with `await using`:

```js
await using har = await context.tracing.startHar('trace.har');
const page = await context.newPage();
await page.goto('https://playwright.dev');
// HAR is finalized when `har` goes out of scope.
```

#### 🪝 Drop API

New
[locator.drop()](https://playwright.dev/docs/api/class-locator#locator-drop)
simulates an external drag-and-drop of files or clipboard-like data onto
an element. Playwright dispatches `dragenter`, `dragover`, and `drop`
with a synthetic \[DataTransfer] in the page context — works
cross-browser and is great for testing upload zones:

```js
await page.locator('#dropzone').drop({
  files: { name: 'note.txt', mimeType: 'text/plain', buffer: Buffer.from('hello') },
});

await page.locator('#dropzone').drop({
  data: {
    'text/plain': 'hello world',
    'text/uri-list': 'https://example.com',
  },
});
```

#### 🎯 Aria snapshots

-
[expect(page).toMatchAriaSnapshot()](https://playwright.dev/docs/api/class-pageassertions#page-assertions-to-match-aria-snapshot)
now works on a [Page](https://playwright.dev/docs/api/class-page), in
addition to a [Locator](https://playwright.dev/docs/api/class-locator) —
equivalent to asserting against `page.locator('body')`.
- New `boxes` option on
[locator.ariaSnapshot()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot)
/
[page.ariaSnapshot()](https://playwright.dev/docs/api/class-page#page-aria-snapshot)
appends each element's bounding box as `[box=x,y,width,height]`, useful
for AI consumption.

#### 🛑 test.abort()

New
[test.abort()](https://playwright.dev/docs/api/class-test#test-abort)
aborts the currently running test from a fixture, hook, or route handler
with an optional message. Use it when you have detected an unrecoverable
misuse and want to fail the test right away:

```js
test('does not publish to the shared page', async ({ page }) => {
  await page.route('**/publish', route => {
    test.abort('Tests must not publish to the shared page. Use the `clone` option.');
    return route.abort();
  });
  // ...
});
```

#### New APIs

##### Browser, Context and Page

- Event
[browser.on('context')](https://playwright.dev/docs/api/class-browser#browser-event-context)
— fired when a new context is created on the browser.
- [BrowserContext](https://playwright.dev/docs/api/class-browsercontext)
now mirrors lifecycle events from its pages:
[browserContext.on('download')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-download),
[browserContext.on('frameattached')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-frame-attached),
[browserContext.on('framedetached')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-frame-detached),
[browserContext.on('framenavigated')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-frame-navigated),
[browserContext.on('pageclose')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-page-close),
[browserContext.on('pageload')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-page-load).

##### Locators and Assertions

- New option `description` in
[page.getByRole()](https://playwright.dev/docs/api/class-page#page-get-by-role)
/
[locator.getByRole()](https://playwright.dev/docs/api/class-locator#locator-get-by-role)
/
[frame.getByRole()](https://playwright.dev/docs/api/class-frame#frame-get-by-role)
/
[frameLocator.getByRole()](https://playwright.dev/docs/api/class-framelocator#frame-locator-get-by-role)
for matching the [accessible
description](https://www.w3.org/TR/wai-aria-1.2/#dfn-accessible-description).
- New option `pseudo` in
[expect(locator).toHaveCSS()](https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-css)
reads computed styles from `::before` or `::after`.
- New option `style` in
[locator.highlight()](https://playwright.dev/docs/api/class-locator#locator-highlight)
applies extra inline CSS to the highlight overlay, plus new
[page.hideHighlight()](https://playwright.dev/docs/api/class-page#page-hide-highlight)
to clear all highlights.

##### Network

-
[webSocketRoute.protocols()](https://playwright.dev/docs/api/class-websocketroute#web-socket-route-protocols)
returns the WebSocket subprotocols requested by the page.
- New option `noDefaults` in
[browserType.connectOverCDP()](https://playwright.dev/docs/api/class-browsertype#browser-type-connect-over-cdp)
disables Playwright's default overrides on the default context (download
behavior, focus emulation, media emulation), so attaching to a user's
daily-driver browser doesn't disturb its state.

##### Errors and Reporting

- New
[webError.location()](https://playwright.dev/docs/api/class-weberror#web-error-location)
mirrors
[consoleMessage.location()](https://playwright.dev/docs/api/class-consolemessage#console-message-location).
-
[consoleMessage.location()](https://playwright.dev/docs/api/class-consolemessage#console-message-location)
now exposes `line` / `column` properties (`lineNumber` / `columnNumber`
are deprecated).
- New
[testInfoError.errorContext](https://playwright.dev/docs/api/class-testinfoerror#test-info-error-error-context)
surfaces additional diagnostic context, such as the aria snapshot of the
receiver at the time of an `expect(...)` matcher failure.
-
[reporter.onError()](https://playwright.dev/docs/api/class-reporter#reporter-on-error)
now receives a `workerInfo` argument with details about the worker for
fixture teardown errors.

##### Test runner

- New `{testFileBaseName}` token in
[testProject.snapshotPathTemplate](https://playwright.dev/docs/api/class-testproject#test-project-snapshot-path-template)
— file name without extension.
- Test runner now errors when a config tries to override a non-option
fixture, and rejects `workers: 0` or negative values.

#### 🛠️ Other improvements

- HTML reporter:
- `npx playwright show-report` accepts `.zip` files directly — no need
to unzip first.
- Steps that contain attachments inside nested children show an
indicator on the parent step.
  - The `repeatEachIndex` is shown in the test header when non-zero.
- Trace Viewer adds a pretty-print toggle for JSON / form request and
response bodies in the network details panel.

#### Breaking Changes ⚠️

- Removed long-deprecated APIs:
- `Locator.ariaRef()` — use the standard
[locator.ariaSnapshot()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot)
pipeline.
- `handle` option on `BrowserContext.exposeBinding` and
`Page.exposeBinding`.
- `logger` option on `BrowserType.connect` and
`BrowserType.connectOverCDP` — use
[tracing](https://playwright.dev/docs/trace-viewer) instead.
- Context options `videosPath` / `videoSize` — use `recordVideo`
instead.

#### Browser Versions

- Chromium 148.0.7778.96
- Mozilla Firefox 150.0.2
- WebKit 26.4

This version was also tested against the following stable channels:

- Google Chrome 147
- Microsoft Edge 147

</details>

<details>
<summary>microsoft/playwright (playwright-core)</summary>

###
[`v1.60.0`](https://redirect.github.com/microsoft/playwright/releases/tag/v1.60.0)

[Compare
Source](https://redirect.github.com/microsoft/playwright/compare/v1.59.1...v1.60.0)

#### 🌐 HAR recording on Tracing


[tracing.startHar()](https://playwright.dev/docs/api/class-tracing#tracing-start-har)
/
[tracing.stopHar()](https://playwright.dev/docs/api/class-tracing#tracing-stop-har)
expose HAR recording as a first-class tracing API, with the same
`content`, `mode` and `urlFilter` options as `recordHar`. The returned
[Disposable](https://playwright.dev/docs/api/class-disposable) makes it
easy to scope a recording with `await using`:

```js
await using har = await context.tracing.startHar('trace.har');
const page = await context.newPage();
await page.goto('https://playwright.dev');
// HAR is finalized when `har` goes out of scope.
```

#### 🪝 Drop API

New
[locator.drop()](https://playwright.dev/docs/api/class-locator#locator-drop)
simulates an external drag-and-drop of files or clipboard-like data onto
an element. Playwright dispatches `dragenter`, `dragover`, and `drop`
with a synthetic \[DataTransfer] in the page context — works
cross-browser and is great for testing upload zones:

```js
await page.locator('#dropzone').drop({
  files: { name: 'note.txt', mimeType: 'text/plain', buffer: Buffer.from('hello') },
});

await page.locator('#dropzone').drop({
  data: {
    'text/plain': 'hello world',
    'text/uri-list': 'https://example.com',
  },
});
```

#### 🎯 Aria snapshots

-
[expect(page).toMatchAriaSnapshot()](https://playwright.dev/docs/api/class-pageassertions#page-assertions-to-match-aria-snapshot)
now works on a [Page](https://playwright.dev/docs/api/class-page), in
addition to a [Locator](https://playwright.dev/docs/api/class-locator) —
equivalent to asserting against `page.locator('body')`.
- New `boxes` option on
[locator.ariaSnapshot()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot)
/
[page.ariaSnapshot()](https://playwright.dev/docs/api/class-page#page-aria-snapshot)
appends each element's bounding box as `[box=x,y,width,height]`, useful
for AI consumption.

#### 🛑 test.abort()

New
[test.abort()](https://playwright.dev/docs/api/class-test#test-abort)
aborts the currently running test from a fixture, hook, or route handler
with an optional message. Use it when you have detected an unrecoverable
misuse and want to fail the test right away:

```js
test('does not publish to the shared page', async ({ page }) => {
  await page.route('**/publish', route => {
    test.abort('Tests must not publish to the shared page. Use the `clone` option.');
    return route.abort();
  });
  // ...
});
```

#### New APIs

##### Browser, Context and Page

- Event
[browser.on('context')](https://playwright.dev/docs/api/class-browser#browser-event-context)
— fired when a new context is created on the browser.
- [BrowserContext](https://playwright.dev/docs/api/class-browsercontext)
now mirrors lifecycle events from its pages:
[browserContext.on('download')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-download),
[browserContext.on('frameattached')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-frame-attached),
[browserContext.on('framedetached')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-frame-detached),
[browserContext.on('framenavigated')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-frame-navigated),
[browserContext.on('pageclose')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-page-close),
[browserContext.on('pageload')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-page-load).

##### Locators and Assertions

- New option `description` in
[page.getByRole()](https://playwright.dev/docs/api/class-page#page-get-by-role)
/
[locator.getByRole()](https://playwright.dev/docs/api/class-locator#locator-get-by-role)
/
[frame.getByRole()](https://playwright.dev/docs/api/class-frame#frame-get-by-role)
/
[frameLocator.getByRole()](https://playwright.dev/docs/api/class-framelocator#frame-locator-get-by-role)
for matching the [accessible
description](https://www.w3.org/TR/wai-aria-1.2/#dfn-accessible-description).
- New option `pseudo` in
[expect(locator).toHaveCSS()](https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-css)
reads computed styles from `::before` or `::after`.
- New option `style` in
[locator.highlight()](https://playwright.dev/docs/api/class-locator#locator-highlight)
applies extra inline CSS to the highlight overlay, plus new
[page.hideHighlight()](https://playwright.dev/docs/api/class-page#page-hide-highlight)
to clear all highlights.

##### Network

-
[webSocketRoute.protocols()](https://playwright.dev/docs/api/class-websocketroute#web-socket-route-protocols)
returns the WebSocket subprotocols requested by the page.
- New option `noDefaults` in
[browserType.connectOverCDP()](https://playwright.dev/docs/api/class-browsertype#browser-type-connect-over-cdp)
disables Playwright's default overrides on the default context (download
behavior, focus emulation, media emulation), so attaching to a user's
daily-driver browser doesn't disturb its state.

##### Errors and Reporting

- New
[webError.location()](https://playwright.dev/docs/api/class-weberror#web-error-location)
mirrors
[consoleMessage.location()](https://playwright.dev/docs/api/class-consolemessage#console-message-location).
-
[consoleMessage.location()](https://playwright.dev/docs/api/class-consolemessage#console-message-location)
now exposes `line` / `column` properties (`lineNumber` / `columnNumber`
are deprecated).
- New
[testInfoError.errorContext](https://playwright.dev/docs/api/class-testinfoerror#test-info-error-error-context)
surfaces additional diagnostic context, such as the aria snapshot of the
receiver at the time of an `expect(...)` matcher failure.
-
[reporter.onError()](https://playwright.dev/docs/api/class-reporter#reporter-on-error)
now receives a `workerInfo` argument with details about the worker for
fixture teardown errors.

##### Test runner

- New `{testFileBaseName}` token in
[testProject.snapshotPathTemplate](https://playwright.dev/docs/api/class-testproject#test-project-snapshot-path-template)
— file name without extension.
- Test runner now errors when a config tries to override a non-option
fixture, and rejects `workers: 0` or negative values.

#### 🛠️ Other improvements

- HTML reporter:
- `npx playwright show-report` accepts `.zip` files directly — no need
to unzip first.
- Steps that contain attachments inside nested children show an
indicator on the parent step.
  - The `repeatEachIndex` is shown in the test header when non-zero.
- Trace Viewer adds a pretty-print toggle for JSON / form request and
response bodies in the network details panel.

#### Breaking Changes ⚠️

- Removed long-deprecated APIs:
- `Locator.ariaRef()` — use the standard
[locator.ariaSnapshot()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot)
pipeline.
- `handle` option on `BrowserContext.exposeBinding` and
`Page.exposeBinding`.
- `logger` option on `BrowserType.connect` and
`BrowserType.connectOverCDP` — use
[tracing](https://playwright.dev/docs/trace-viewer) instead.
- Context options `videosPath` / `videoSize` — use `recordVideo`
instead.

#### Browser Versions

- Chromium 148.0.7778.96
- Mozilla Firefox 150.0.2
- WebKit 26.4

This version was also tested against the following stable channels:

- Google Chrome 147
- Microsoft Edge 147

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "every weekday before 11am"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/ionic-team/ionic-framework).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNTkuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE1OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Maria Hutt <thetaPC@users.noreply.github.com>
Co-authored-by: ionitron <hi@ionicframework.com>
…31202)

Issue number: internal

---------

## What is the current behavior?

Currently, when an `ion-modal`'s `breakpoints` are set after the
component has loaded, `sortedBreakpoints` stays empty.
`breakpointsChanged` had no `@Watch`, so it only ran once from the
manual call in `componentDidLoad`. `present()` still recalculates
`isSheetModal` to `true` from the late-set `breakpoints` (added in
#30839), so the sheet gesture initializes with an empty breakpoints
array and throws `Reduce of empty array with no initial value` on the
`breakpoints.reduce(...)` in `sheet.ts` when the sheet is swiped, which
breaks swiping entirely.

This shows up with framework bindings that land after the web component
loads, e.g., an inline `ion-modal` inside an Angular component rendered
through a plain `router-outlet` with zoneless change detection. It
doesn't reproduce with zone change detection, with
`ModalController.create`, or with the modal inside `ion-router-outlet`,
since those set `breakpoints` before the modal presents.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

Now `breakpointsChanged` has `@Watch('breakpoints')`, so `breakpoints`
set after the component loads update `sortedBreakpoints`. This mirrors
how `trigger`/`triggerChanged` already handles late binding (a watch
plus a manual call in `componentDidLoad`). The sheet gesture then gets
the real breakpoints and swiping works.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No

## Other information

Sheet modal preview:
-
https://ionic-framework-git-fix-modal-late-breakpoints-ionic1.vercel.app/src/components/modal/test/sheet

Note that the preview won't show *this* working, but will show the modal
at least isn't broken from this change.

Current dev build:
```
8.8.10-dev.11781019195.14a7eeaf
```
# Conflicts:
#	core/api.txt
#	core/package-lock.json
#	core/package.json
#	core/src/components/alert/test/a11y/alert.e2e.ts-snapshots/alert-checkbox-scale-md-ltr-Mobile-Safari-linux.png
#	core/src/components/alert/test/a11y/alert.e2e.ts-snapshots/alert-radio-scale-md-ltr-Mobile-Safari-linux.png
#	core/src/components/alert/test/a11y/alert.e2e.ts-snapshots/alert-scale-md-ltr-Mobile-Safari-linux.png
#	core/src/components/alert/test/a11y/alert.e2e.ts-snapshots/alert-text-fields-scale-md-ltr-Mobile-Safari-linux.png
#	core/src/components/alert/test/basic/alert.e2e.ts-snapshots/alert-multipleButtons-md-ltr-Mobile-Safari-linux.png
#	core/src/components/alert/test/basic/alert.e2e.ts-snapshots/alert-multipleButtons-md-ltr-dark-Mobile-Safari-linux.png
#	core/src/components/alert/test/basic/alert.e2e.ts-snapshots/alert-multipleButtons-md-rtl-Mobile-Safari-linux.png
#	core/src/components/alert/test/basic/alert.e2e.ts-snapshots/alert-multipleButtons-md-rtl-dark-Mobile-Safari-linux.png
#	core/src/components/button/test/icon/button.e2e.ts-snapshots/button-icon-ios-rtl-Mobile-Safari-linux.png
#	core/src/components/button/test/icon/button.e2e.ts-snapshots/button-icon-md-ltr-Mobile-Safari-linux.png
#	core/src/components/button/test/icon/button.e2e.ts-snapshots/button-icon-md-rtl-Mobile-Safari-linux.png
#	core/src/components/card/test/basic/card.e2e.ts-snapshots/card-no-content-or-header-md-ltr-Mobile-Safari-linux.png
#	core/src/components/item/test/buttons/item.e2e.ts-snapshots/item-buttons-diff-ios-ltr-Mobile-Safari-linux.png
#	core/src/components/item/test/buttons/item.e2e.ts-snapshots/item-buttons-diff-ios-rtl-Mobile-Safari-linux.png
#	core/src/components/item/test/buttons/item.e2e.ts-snapshots/item-buttons-diff-md-rtl-Mobile-Safari-linux.png
#	core/src/components/item/test/colors/item.e2e.ts-snapshots/item-colors-diff-ios-ltr-Mobile-Safari-linux.png
@ShaneK ShaneK requested a review from a team as a code owner June 10, 2026 21:08
@ShaneK ShaneK requested a review from gnbm June 10, 2026 21:08
@vercel

vercel Bot commented Jun 10, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
ionic-framework Ready Ready Preview, Comment Jun 10, 2026 10:38pm

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 Jun 10, 2026
@ShaneK ShaneK merged commit 779e235 into next Jun 10, 2026
49 checks passed
@ShaneK ShaneK deleted the sync-next-with-main branch June 10, 2026 23:28
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.

5 participants