Skip to content

merge release-9.0.6 - #31506

Merged
brandyscarney merged 15 commits into
9.0.xfrom
release-9.0.6
Sep 30, 2026
Merged

brandyscarney merged 15 commits into
9.0.xfrom
release-9.0.6

Conversation

@brandyscarney

Copy link
Copy Markdown
Member

v9.0.6

ShaneK and others added 15 commits September 23, 2026 12:04
Issue number: N/A (docs-only link fix)

---------

## What is the current behavior?

`docs/component-guide.md` links to Angular source files that no longer
exist, so every link in the "Angular value accessors" and "Interface
Exports" steps returns a 404 on GitHub:

-
`/packages/angular/src/directives/control-value-accessors/{text,numeric,boolean,select}-value-accessor.ts`
(5 links)
- `/packages/angular/src/index.ts`

`packages/angular/src/` now only contains `common/`, `lazy/` and
`standalone/`.

## What is the new behavior?

- The value accessor links point at
`packages/angular/src/lazy/directives/control-value-accessors/`, where
the four directives live (their selectors match the ones the guide
quotes).
- The Angular interface-export step points at
`packages/angular/src/lazy/index.ts` and
`packages/angular/src/standalone/index.ts`, which are the two files that
export the `*CustomEvent` / `*EventDetail` types today.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

## Other information

Docs only, no code changes. Found and prepared with AI assistance
(Claude Code); I checked every new path exists on `main`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Issue number: 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?
<!-- Please describe the current behavior that you are modifying. -->

Currently, the `update-package-lock` job fails the release with `ETARGET
No matching version found for @ionic/core@^9.0.x`. Since 9.0.4 npm
processes publishes asynchronously, so `npm publish` returns before the
version resolves. The registry recorded `@ionic/core` 4s after the
publish step on 9.0.3, but 5m11s on 9.0.4 and 5m10s on 9.0.5, against a
near constant 5m04s gap from publishing to that job, so the last two
releases each missed by about six seconds and needed the job re-run by
hand.

Separately, `purge-cdn-cache` has never done anything. A missing comma
before the `@next` CSS entry made the body invalid JSON, so jsDelivr
rejected every purge with `InvalidContent` while `curl` exited 0 and the
step stayed green. That has been true since #29121.

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

The `Bump Package Lock` step is split into `Resolve Package Locks`,
which retries `lerna exec "npm install --package-lock-only
--prefer-online"` every 15s against a 900s wall clock deadline, and
`Commit Package Locks`, which does the commit and the push. We retry the
install rather than probing with `npm view` first, because the two read
separately cached documents and a passing probe wouldn't mean the
install resolves. The `--prefer-online` flag is required because a
failed install caches the version-less packument locally for 300s, so
plain retries never reach the registry. The bound is wall clock rather
than an attempt count since one attempt costs about 45s and a fixed
count would overrun `timeout-minutes`.

The `purge-cdn-cache` job now runs after `update-package-lock` and gates
on a new `resolved` output rather than the job's result, so a failed
lockfile push still purges but an unresolved version doesn't. The comma
is fixed and the step checks the HTTP status, failing on a 4xx because a
bad payload is otherwise silent, and warning on anything else so a
jsDelivr outage doesn't fail a release.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No

## Other information

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

The `release.yml` workflow only runs on a real production release, so I
couldn't test this end to end. I ran each step's shell against stubs for
the failure paths, but the first real signal will be the next release.
This PR contains the following updates:

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

---

### Release Notes

<details>
<summary>stenciljs/core (@&#8203;stencil/core)</summary>

###
[`v4.45.1`](https://redirect.github.com/stenciljs/core/blob/HEAD/CHANGELOG.md#-4451-2026-09-23)

[Compare
Source](https://redirect.github.com/stenciljs/core/compare/v4.45.0...v4.45.1)

##### Bug Fixes

- **compiler:** correct CSS minifier selector-list splitting
([#&#8203;6895](https://redirect.github.com/stenciljs/core/issues/6895))
([332a8fa](https://redirect.github.com/stenciljs/core/commit/332a8fad6358db92b21c8b69a669fd5e4b70d0a4))
- **docs:** derive CEM readonly from getter/setter instead of mutable
([#&#8203;6900](https://redirect.github.com/stenciljs/core/issues/6900))
([1c81131](https://redirect.github.com/stenciljs/core/commit/1c81131f659dd0beaf9bdadd59d5f2a5f895dd38))
- **runtime:** pre-hydrate getter / setter attribute
([#&#8203;6890](https://redirect.github.com/stenciljs/core/issues/6890))
([171d0ce](https://redirect.github.com/stenciljs/core/commit/171d0ce3f0b854cc848a324972c4371b6309743c))
- **ssr:** clear modeResolutionChain on `setMode`. Fixes memory leak
([#&#8203;6903](https://redirect.github.com/stenciljs/core/issues/6903))
([ca9273d](https://redirect.github.com/stenciljs/core/commit/ca9273dfddd60b398725de65559f6a2f355ffe72))

</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:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMDMuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjEwMy4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

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

---------

## What is the current behavior?

Two links in the Vue contributor docs point at sections that don't
exist:

- `docs/vue/testing.md` step 1 links "Build" to `../README.md#building`.
`docs/README.md` has no Building section.
- `packages/vue/README.md` links "test-app directory" to
`test/README.md#syncing-local-changes`. `packages/vue/test/README.md` is
now a two-line pointer with no such section; the syncing steps live in
`docs/vue/testing.md`.

## What is the new behavior?

- "Build" points at the Building section of `packages/vue/README.md`,
which walks through building `core`, `packages/vue` and
`packages/vue-router`, the three projects step 1 names.
- The sync sentence links to `docs/vue/testing.md#syncing-local-changes`
with an absolute GitHub URL, following the Contributing Guide link in
the same README, so it also works on npmjs.com where this README is
published.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

## Other information

Docs only, no code changes. Found and prepared with AI assistance
(Claude Code); I checked both target headings exist on `main`, and ran a
GitHub Copilot review over the diff.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`24.13.6` →
`24.19.0`](https://renovatebot.com/diffs/npm/@types%2fnode/24.13.6/24.19.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/24.19.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/24.13.6/24.19.0?slim=true)
|

---

### 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:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMTIuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjExMi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

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/) |
|---|---|---|---|
| [vitest](https://vitest.dev)
([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest))
| [`5.0.1` →
`5.0.2`](https://renovatebot.com/diffs/npm/vitest/5.0.1/5.0.2) |
![age](https://developer.mend.io/api/mc/badges/age/npm/vitest/5.0.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vitest/5.0.1/5.0.2?slim=true)
|

---

### Release Notes

<details>
<summary>vitest-dev/vitest (vitest)</summary>

###
[`v5.0.2`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v5.0.2)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v5.0.1...v5.0.2)

#####    🐞 Bug Fixes

- Bind `process` in case global is overwritten  -  by
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;11343](https://redirect.github.com/vitest-dev/vitest/issues/11343)
[<samp>(0b792)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0b79231ad)
- **detect-async-leaks**:
- Ignore `process.stdio` handles  -  by
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;11333](https://redirect.github.com/vitest-dev/vitest/issues/11333)
[<samp>(0fd6b)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0fd6b9790)
- **expect**:
- Fix `toMatchObject` with asymmetric matchers  -  by
[@&#8203;ShreeBohara](https://redirect.github.com/ShreeBohara), **Claude
Opus 5**, [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa),
**Hiroshi Ogawa** and **Codex (GPT-5)** in
[#&#8203;11100](https://redirect.github.com/vitest-dev/vitest/issues/11100)
[<samp>(42523)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/42523289e)
- **jsdom**:
- Fix `Request` with `Blob` body on jsdom 28+  -  by
[@&#8203;harshit-d3v](https://redirect.github.com/harshit-d3v) in
[#&#8203;11295](https://redirect.github.com/vitest-dev/vitest/issues/11295)
[<samp>(d1c3e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/d1c3ecc93)
- **reporter**:
- `agent` to respect `--silent`  -  by
[@&#8203;Raj4478](https://redirect.github.com/Raj4478) and
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;11271](https://redirect.github.com/vitest-dev/vitest/issues/11271)
[<samp>(5b95e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/5b95efb6d)
- **reporters**:
- Handle concurrent `createReport` calls  -  by
[@&#8203;7rulnik](https://redirect.github.com/7rulnik) in
[#&#8203;11278](https://redirect.github.com/vitest-dev/vitest/issues/11278)
[<samp>(e8e55)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e8e556ff7)
- `hanging-process` to use ESM entrypoint  -  by
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;11316](https://redirect.github.com/vitest-dev/vitest/issues/11316)
[<samp>(4e91e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/4e91e5668)
- **spy**:
- Fix stack overflow when spying `Set.prototype.add`  -  by
[@&#8203;fengmk2](https://redirect.github.com/fengmk2) in
[#&#8203;11299](https://redirect.github.com/vitest-dev/vitest/issues/11299)
[<samp>(a0a93)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/a0a939653)
- **ui**:
- Persist authentication cookie beyond current browser session  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa), **Hiroshi
Ogawa** and **OpenCode (gpt-5.6-sol)** in
[#&#8203;11066](https://redirect.github.com/vitest-dev/vitest/issues/11066)
[<samp>(f8819)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f88195e16)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v5.0.1...v5.0.2)

</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:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMTIuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjExMi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

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/) |
|---|---|---|---|
| [chalk](https://redirect.github.com/chalk/chalk) | [`6.0.0` →
`6.0.1`](https://renovatebot.com/diffs/npm/chalk/6.0.0/6.0.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/chalk/6.0.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/chalk/6.0.0/6.0.1?slim=true)
|

---

### Release Notes

<details>
<summary>chalk/chalk (chalk)</summary>

###
[`v6.0.1`](https://redirect.github.com/chalk/chalk/compare/v6.0.0...47fc05abd46171b235e24174cd2dba83d25bf037)

[Compare
Source](https://redirect.github.com/chalk/chalk/compare/v6.0.0...v6.0.1)

</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:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMTIuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjExMi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

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

| Package | Type | Update | Change |
|---|---|---|---|
|
[github/codeql-action](https://redirect.github.com/github/codeql-action)
| action | patch | `v4.38.1` → `v4.38.2` |

---

### Release Notes

<details>
<summary>github/codeql-action (github/codeql-action)</summary>

###
[`v4.38.2`](https://redirect.github.com/github/codeql-action/releases/tag/v4.38.2)

[Compare
Source](https://redirect.github.com/github/codeql-action/compare/v4.38.1...v4.38.2)

- Update default CodeQL bundle version to
[2.27.1](https://redirect.github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.1).
[#&#8203;4160](https://redirect.github.com/github/codeql-action/pull/4160)

</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:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMTIuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjExMi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Updated the contributing guide to replace the outdated commands (`npm
run test.screenshot`) with the current commands: `npm run
test.e2e.docker.update-snapshots` and `npm run test.e2e.docker`.

Also moved most of the explanation into the proper testing files and
link to it instead of having it in the main contributing guide.
Restructures the steps for running tests and removes old Docker
instructions.

---------

Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com>
… is pushed (#31481)

Issue number: resolves #31477

---------

## What is the current behavior?

Currently, an outlet holding a splat route alongside a more specific
sibling loses the splat's page when you push that sibling. A splat
matches every pathname, so `findViewItems` hands back its view item for
a pathname the sibling owns, and `handlePageTransition` then overwrites
that item's `reactElement`, which swaps the page and unmounts it.
Whatever was underneath, usually tabs or a nested outlet, is destroyed
along with its state and scroll position.

A root-level `/*` has two further problems. Going back blanks the whole
outlet, because `getParentPath` caches an inferred `outletMountPath` on
the root outlet, which scopes it to whatever route was active and makes
the next pathname look out of scope, so `handleOutOfScopeOutlet` aborts
the transition and tears the outlet down. Swipe-to-go-back does nothing,
because the deactivation scan in `renderViewItem` re-applies
`ion-page-hidden` on the next render and undoes
`revealIonPageForSwipeBack`, leaving the user dragging a page with
`display: none`.

## What is the new behavior?

`handlePageTransition` now compares the view item it found against
`findRouteByRouteInfo`, which is React Router's own ranking, and drops
it when the two disagree so a fresh view item gets created for the
winning route. The catch-all deactivation no longer unmounts a view that
was pushed over, since hiding it is enough to keep it from rendering
alongside the pushed page. A root outlet no longer caches a mount path,
in both places that were doing it, because it is mounted under nothing
and an inferred path only scopes it wrongly. The deactivation scan also
skips whichever page a swipe gesture is currently revealing, tracked in
a `WeakSet` that is marked in `onStart` and cleared when the gesture
ends.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No

## Other information

New test pages:

- [Splat
sibling](https://ionic-framework-git-fix-rr6-route-bug-ionic1.vercel.app/react-router/splat-sibling)
- [Index
sibling](https://ionic-framework-git-fix-rr6-route-bug-ionic1.vercel.app/react-router/index-sibling)
- [Empty path
sibling](https://ionic-framework-git-fix-rr6-route-bug-ionic1.vercel.app/react-router/empty-path-sibling)

## Current Dev Build
```
9.0.6-dev.11790349282.1a877abd
```
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@playwright/test](https://playwright.dev)
([source](https://redirect.github.com/microsoft/playwright)) | `1.62.1`
→ `1.63.0` |
![age](https://developer.mend.io/api/mc/badges/age/npm/@playwright%2ftest/1.63.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@playwright%2ftest/1.62.1/1.63.0?slim=true)
|
| [@playwright/test](https://playwright.dev)
([source](https://redirect.github.com/microsoft/playwright)) |
[`^1.62.1` →
`^1.63.0`](https://renovatebot.com/diffs/npm/@playwright%2ftest/1.62.1/1.63.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@playwright%2ftest/1.63.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@playwright%2ftest/1.62.1/1.63.0?slim=true)
|
| [playwright-core](https://playwright.dev)
([source](https://redirect.github.com/microsoft/playwright)) |
[`^1.62.1` →
`^1.63.0`](https://renovatebot.com/diffs/npm/playwright-core/1.62.1/1.63.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/playwright-core/1.63.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/playwright-core/1.62.1/1.63.0?slim=true)
|

---

### Release Notes

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

###
[`v1.63.0`](https://redirect.github.com/microsoft/playwright/compare/v1.62.1...1b025d7e20a026371cd5f98ba0cdce48892737c8)

[Compare
Source](https://redirect.github.com/microsoft/playwright/compare/v1.62.1...v1.63.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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiI0NC42OS4xIiwidXBkYXRlZEluVmVyIjoiNDQuNjkuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

---------

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

Issue number: resolves #31479

---------

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

Currently, switching tabs or following a link with
`routerDirection="none"` fires none of the four view lifecycle events,
so a page that loads its data in `useIonViewWillEnter` renders empty.
The non-animated branch of `StackManager.transitionPage()` skips
`routerOutlet.commit()` and swaps the page classes itself to avoid
intermediate paints, and core dispatches all four events from inside
`commit()`, so they never fire. A capturing listener on the
`ion-router-outlet` gets nothing either, so it isn't a problem with the
hooks.

## What is the new behavior?

That branch now dispatches the four events itself, in the same order
core's `transition()` uses. The class swap moved to after all four, so
the leaving page is still on screen for its leave events and the
entering page is revealed only once they've fired. That's what core does
on the animated path, where `beforeTransition` un-hides the leaving page
and `ion-page-hidden` only goes back on after `commit()` resolves, and
it matters because `ion-page-hidden` is `display: none`, so a
`useIonViewDidLeave` handler reading `scrollTop` off the outgoing page
was getting 0.

The two dispatch sites that already existed in this file for
out-of-scope and root navigation now share the same helper.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No

## Other information

The events used to come from core here. This path called
`commit(enteringEl, undefined, { duration: 0 })` until
[12f0d5e](12f0d5e)
dropped it to fix a white flash during tab switches, and with no leaving
element core took its `noAnimation` branch and fired the enter pair, so
the enter half of this is a regression from that commit. Putting the
call back would get the events plus focus and z-index handling from core
for free, but it risks the flash it was removed for, so this dispatches
them directly instead.

The patch on the issue fires the enter events unconditionally. This
gates them on the generation check so a superseded transition doesn't
announce an entry, and it skips the leave events when the leaving page
already has `ion-page-hidden`, because two transitions sharing a leaving
element would otherwise run its `useIonViewDidLeave` teardown twice. The
check is the class rather than `isViewVisible` since a nested outlet
marks its leaving page `visibility: hidden` before we get here and still
needs `ionViewDidLeave` to unmount.

Preview:

- [Tab
lifecycle](https://ionic-framework-git-fix-rr6-lifecycle-non-animated-ionic1.vercel.app/react-router/tab-lifecycle/home)
-
[routerDirection="none"](https://ionic-framework-git-fix-rr6-lifecycle-non-animated-ionic1.vercel.app/react-router/direction-none-back/a)

## Current Dev Build
```
9.0.6-dev.11790615145.1d8c56a2
```
@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 Sep 30, 2026
@vercel

vercel Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated
ionic-framework Ready Ready Preview Sep 30, 2026 5:23pm UTC

Request Review

@brandyscarney
brandyscarney marked this pull request as ready for review September 30, 2026 17:36
@brandyscarney
brandyscarney requested a review from a team as a code owner September 30, 2026 17:36
@brandyscarney
brandyscarney requested review from thetaPC and removed request for a team September 30, 2026 17:36
@brandyscarney
brandyscarney merged commit b5d8c77 into 9.0.x Sep 30, 2026
108 checks passed
@brandyscarney
brandyscarney deleted the release-9.0.6 branch September 30, 2026 17:37

This branch was successfully deployed

1 active deployment
Preview — 5baeafe3 Deployed Sep 30, 2026 by vercel[bot]
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