Skip to content

chore(git): sync with main - #31353

Merged
ShaneK merged 12 commits into
nextfrom
sync-next-with-main
Aug 12, 2026
Merged

ShaneK merged 12 commits into
nextfrom
sync-next-with-main

Conversation

@ShaneK

@ShaneK ShaneK commented Aug 12, 2026

Copy link
Copy Markdown
Member

Sync next with main.

ShaneK and others added 12 commits August 7, 2026 17:34
Issue number: resolves #31155, resolves #31143

---------

## What is the current behavior?

Currently, an `ion-datetime` inside a modal or popover shows the wrong
month once the overlay is reopened. The selected day isn't visible, the
previous month button does nothing, and picking a day from the grid
lands on an unrelated date.

Overlays move their host element into `ion-app` when presenting and back
to its original position when dismissing, which disconnects and
reconnects the datetime. `disconnectedCallback` reset
`hasBeenIntersecting` during that move, so by the time the hidden-state
`IntersectionObserver` entry arrived, `hiddenCallback` mistook the
dismissal for the synthetic initial entry and returned early. That left
`datetime-ready` on the host, so on the next present `markReady` saw the
class and returned without re-centering the calendar on the working
month, and the browser had already reset `scrollLeft` to 0 while the
overlay was hidden. `scrollLeft: 0` renders the previous month's grid
while the header still names the working month, which is what produces
all three symptoms.

## What is the new behavior?

With this change, `disconnectedCallback` no longer resets
`hasBeenIntersecting`. That flag tracks the observers, and the observers
are only created in `componentDidLoad` and never re-created on
reconnect, so a DOM move has no business clearing it. `hiddenCallback`
now sees the real hidden transition on dismiss and tears down as it did
before #31108, which lets `markReady` run again on the next present and
re-center the calendar.

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

This regression was introduced in #31108. That PR needed the flag to
make `hiddenCallback` ignore the synthetic initial entry, but the
`disconnectedCallback` reset it also added had no job and broke the
overlay case. Before #31108, `hiddenCallback` had no guard at all and
always removed `datetime-ready` on dismiss, so this restores the
behavior that shipped for all of v8..

- [Relevant test screen -
iOS](https://ionic-framework-git-fix-31155-ionic1.vercel.app/src/components/datetime-button/test/overlays?ionic:mode=ios)
- [Relevant test screen -
MD](https://ionic-framework-git-fix-31155-ionic1.vercel.app/src/components/datetime-button/test/overlays?ionic:mode=md)

To reproduce: open the "Modal - Default" picker, dismiss it, then open
it again. On `main` the grid shows February while the header reads March
2022.

---------

Co-authored-by: Maria Hutt <[email protected]>
This PR contains the following updates:

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

---

### Release Notes

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

###
[`v4.37.5`](https://redirect.github.com/github/codeql-action/compare/v4.37.4...v4.37.5)

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

</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:eyJjcmVhdGVkSW5WZXIiOiI0NC4zLjIiLCJ1cGRhdGVkSW5WZXIiOiI0NC4zLjIiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->

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.37.5` → `v4.37.6` |

---

### Release Notes

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

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

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

- Changed the default filepath for the new remote file address format
that was introduced in CodeQL Action 4.37.0 / 3.37.0 to
`.github/codeql-config.yml` to align it with the suggested path that is
used elsewhere.
[#&#8203;4070](https://redirect.github.com/github/codeql-action/pull/4070)

</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:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMi4wIiwidXBkYXRlZEluVmVyIjoiNDQuMTIuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Issue number: resolves #31333

---------

## What is the current behavior?

Currently, Stencil's lazy loader resolves component bundles with a
template literal dynamic import wrapped in a `/* @vite-ignore */`
comment. Vite 8 moved dependency prebundling from esbuild to Rolldown,
which honors that comment and leaves the import alone, so the
`.entry.js` chunks never get emitted into the prebundle output. Requests
for them 404 and no lazy component registers, which surfaces as
`Constructor for "ion-app#undefined" was not found` in the console.

Angular CLI 22.1 is where most people hit this, since its dev server is
the first to ship Vite 8. It only affects the lazy `IonicModule` path,
because that's the only thing in the repo that pulls
`@ionic/core/loader`. Standalone components import from
`@ionic/core/components` and never touch the loader.

## What is the new behavior?

With this change we set `extras.enableImportInjection` in
`core/stencil.config.ts`. Stencil prepends a switch of literal import
paths to the loader, ahead of the existing `@vite-ignore` import, so
Rolldown can resolve each bundle and emit its chunk. The original import
stays as the fallback, so nothing changes for consumers that already
worked.

The fix is one config flag that would silently revert if anyone dropped
it, so there's a guard alongside it.
`core/scripts/verify/lazy-imports.js` reads the built `dist/esm` and
`dist/cjs`, locates the loader chunk, and fails if any bundle is missing
a literal import. It runs in both `build-core` and
`build-core-stencil-prerelease`, so a Stencil upgrade that changes the
injection behavior fails the nightly rather than shipping.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No


## Other information

Verified against a stock Angular CLI 22.1 app using
`IonicModule.forRoot()` and a local build of this branch. Before the fix
we had a ton of 404s on `ion-app_8.entry.js` and
`ion-button_2.entry.js`, plus some `Constructor for ... was not found`
errors. After the fix we had no console errors, components render fine,
and `ng build` emits the entry chunks with the right names.

CI doesn't cover the actual symptom and it cannot here because we have
no ng22 test apps on main, but we'll have it tested for free on
major-9.0 with the existing ng22 test app there. The guard script
asserts the build-output invariant for the extra validation.

The injected switch adds roughly 10.8 KB raw to the lazy runtime chunk,
which is under 1 KB gzipped because the case clauses are near-identical
repeated text, but people using the CDN build will have no extra
overhead at all.

Anyone on a published `@ionic/core` can work around this with
`prebundle.exclude` in `angular.json` until it ships:

```json
"serve": {
  "options": {
    "prebundle": { "exclude": ["@ionic/angular", "@ionic/core"] }
  }
}
```
Issue number: resolves #31332

---------

## What is the current behavior?

Currently, pulling down inside a sheet or card modal dismisses the modal
instead of triggering the refresher when the content uses a custom
scroll host.

## What is the new behavior?

With this change, the gesture resolves the refresher from the enclosing
`ion-content` when the swipe target is a custom scroll host, so pulling
down runs the refresher and leaves the modal alone. The new
`findRefresherInContent` util only reports a refresher for the scroll
host that refresher actually scrolls with, which is the first one in the
content, so a second unrelated scroll host still swipes the modal
normally. The `expandToScroll: false` path now runs the same check.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No

## Other information

Test coverage is 4 e2e tests on the new page:

[Test page
(iOS)](https://ionic-framework-git-fix-31332-ionic1.vercel.app/src/components/modal/test/refresher-scroll-target/?ionic:mode=ios)
[Test page
(MD)](https://ionic-framework-git-fix-31332-ionic1.vercel.app/src/components/modal/test/refresher-scroll-target/?ionic:mode=md)

## Current dev build:

```
8.8.18-dev.11786385944.17aca7e5
```
Issue number: resolves #31312 

---------

<!-- 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?
Current docs don't provide recommended testing guidance for accurately
testing standalone components. This can create issues because a
standalone (custom-elements) build doesn't expose
`el.componentOnReady()`, so any test that reads fixture.nativeElement
before hydration in a standalone project has the potential to not be
testing what they think they are.

## What is the new behavior?
- Adds a couple of sentences to talk about using the existing
`componentOnReady` helper from `@ionic/core` in Angular's `testing.md`
file
- Adds the same standalone guidance to the `testing.md` files for React
and Vue

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

---------

Co-authored-by: Maria Hutt <[email protected]>
…tep (#31310)

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 Playwright npm packages and the `mcr.microsoft.com/playwright`
Docker image in `core/Dockerfile` are tracked by two separate Renovate
managers. The Docker image is published to the container registry about
a day after the npm release, so the two updates become available at
different times. Because they are on different datasources, the npm bump
opens a PR before the Docker tag is ready, and getting the Dockerfile
into the same PR requires a manual rebase once the image lands. This is
easy to miss, and merging the npm bump alone leaves `core/package.json`
and `core/Dockerfile` on mismatched Playwright versions.

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

- A custom manager now resolves the `core/Dockerfile` Playwright image
tag from the npm `@playwright/test` release instead of the container
registry, so both files bump from the same version.
- The built-in Docker manager for that image is disabled so it no longer
produces a separate, lagging update.
- The Dockerfile is added to the grouped `playwright` rule, and a
`minimumReleaseAge` of 3 days lets the matching image publish before the
PR opens.
- Net result is a single `playwright` PR that updates
`core/package.json` and `core/Dockerfile` together, with no manual
rebase.

## Does this introduce a breaking change?

- [ ] Yes
- [ ] 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. -->

This is a Renovate config change only, so it will not take effect until
the next scheduled Renovate run. If the Docker image for a given release
has not been published yet when CI runs, the Dockerfile build can fail
on a missing tag; the fix is to wait for the image to appear and re-run
the job, with no code change needed. This is documented inline in
`renovate.json5`.
Issue number: resolves #31337

---------

## What is the current behavior?

Currently, `ion-content` caches its fullscreen offsets and only
recomputes them on load, a `window` resize, `ionTabBarLoaded`, or
`recalculateDimensions()`. A change to `--ion-safe-area-top` fires none
of those, so on Android edge-to-edge, where the real inset only arrives
once the native WindowInsets callback has run, the fullscreen scroll
region and `#background-content` stay short by the inset and leave a gap
behind a translucent header. Sheet modals have the same problem:
`--ion-modal-offset-top` is a resolved pixel value written at present
time, so a sheet presented before the inset is known stays too tall.

## What is the new behavior?

Fullscreen `ion-content` now observes its own box with a
`ResizeObserver`, which works because the content flexes to fill
whatever space the headers and footers leave behind. The callback keeps
the `offsetParent === null` guard from `onResize()`, since a hidden page
reports a 0x0 box and recomputing then would zero the offsets, but it
skips that method's 100ms debounce, which left the offsets visibly wrong
for a small amount of time. Sheet modals subscribe to
`onRootSafeAreaTopChange()`, a hidden probe element whose `height`
tracks `var(--ion-safe-area-top)` so a change to the variable becomes an
observable size change.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No

## Other information

The preview pages won't show the bug on their own, since it needs the
inset to change after load. Run
`document.documentElement.style.setProperty('--ion-safe-area-top',
'24px')` in the console to trigger it.

- [Fullscreen content
(iOS)](https://ionic-framework-git-fix-31337-ionic1.vercel.app/src/components/content/test/fullscreen?ionic:mode=ios)
/ [Fullscreen content
(MD)](https://ionic-framework-git-fix-31337-ionic1.vercel.app/src/components/content/test/fullscreen?ionic:mode=md)
- [Modal safe-area
(iOS)](https://ionic-framework-git-fix-31337-ionic1.vercel.app/src/components/modal/test/safe-area?ionic:mode=ios)
/ [Modal safe-area
(MD)](https://ionic-framework-git-fix-31337-ionic1.vercel.app/src/components/modal/test/safe-area?ionic:mode=md)
@ShaneK
ShaneK requested a review from a team as a code owner August 12, 2026 21:49
@ShaneK
ShaneK requested a review from BenOsodrac August 12, 2026 21:49
@vercel

vercel Bot commented Aug 12, 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 Aug 12, 2026 9:57pm

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 Aug 12, 2026
@ShaneK
ShaneK merged commit 37bbb21 into next Aug 12, 2026
49 checks passed
@ShaneK
ShaneK deleted the sync-next-with-main branch August 12, 2026 22:06

This branch was successfully deployed

1 active deployment
Preview — 931e299b Deployed Aug 12, 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