diff --git a/CHANGELOG.md b/CHANGELOG.md index 538f88377e8..3860e2282b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.12](https://github.com/ionic-team/ionic-framework/compare/v8.8.11...v8.8.12) (2026-06-24) + + +### Bug Fixes + +* **angular:** honor modifier-click on routerLink ([#31230](https://github.com/ionic-team/ionic-framework/issues/31230)) ([2ac9851](https://github.com/ionic-team/ionic-framework/commit/2ac98512c78f6d47e3a6a17ff0159047ba14a5cd)), closes [#26394](https://github.com/ionic-team/ionic-framework/issues/26394) +* **angular:** run change detection on attached overlay views ([#31235](https://github.com/ionic-team/ionic-framework/issues/31235)) ([8e76fd0](https://github.com/ionic-team/ionic-framework/commit/8e76fd0cceeb878ad4b071515acb593892512111)), closes [#31220](https://github.com/ionic-team/ionic-framework/issues/31220) + + + + + ## [8.8.11](https://github.com/ionic-team/ionic-framework/compare/v8.8.10...v8.8.11) (2026-06-17) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 3a594bdaad0..fbeb0deac7c 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.12](https://github.com/ionic-team/ionic-framework/compare/v8.8.11...v8.8.12) (2026-06-24) + +**Note:** Version bump only for package @ionic/core + + + + + ## [8.8.11](https://github.com/ionic-team/ionic-framework/compare/v8.8.10...v8.8.11) (2026-06-17) diff --git a/core/package-lock.json b/core/package-lock.json index 60cb2432cd1..d0c250c7f86 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/core", - "version": "8.8.11", + "version": "8.8.12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/core", - "version": "8.8.11", + "version": "8.8.12", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", @@ -649,9 +649,9 @@ } }, "node_modules/@capacitor/keyboard": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-8.0.3.tgz", - "integrity": "sha512-27Bv5/2w1Ss2njguBgTS98O0Bb8DRJhAARyzXYib0JlT/n6BrJw/EZ0CokM4C8GFUjFDjJnEKF1Ie01buTMEXQ==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-8.0.5.tgz", + "integrity": "sha512-oFXygC4eKYA5l2MdpTR06L2M/4x6e2SLD5yS1T9+UBDKTkzyvhWKEhbYLUaTIBPpLKqlfGudJw1X73S1H9eUzQ==", "dev": true, "license": "MIT", "peerDependencies": { diff --git a/core/package.json b/core/package.json index 95c9a23f339..53202ce5909 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/core", - "version": "8.8.11", + "version": "8.8.12", "description": "Base components for Ionic", "engines": { "node": ">= 16" diff --git a/lerna.json b/lerna.json index dec4d837282..63bb3cc9998 100644 --- a/lerna.json +++ b/lerna.json @@ -3,5 +3,5 @@ "core", "packages/*" ], - "version": "8.8.11" + "version": "8.8.12" } \ No newline at end of file diff --git a/packages/angular-server/CHANGELOG.md b/packages/angular-server/CHANGELOG.md index 974a5f5215d..c9960a1ec1a 100644 --- a/packages/angular-server/CHANGELOG.md +++ b/packages/angular-server/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.12](https://github.com/ionic-team/ionic-framework/compare/v8.8.11...v8.8.12) (2026-06-24) + +**Note:** Version bump only for package @ionic/angular-server + + + + + ## [8.8.11](https://github.com/ionic-team/ionic-framework/compare/v8.8.10...v8.8.11) (2026-06-17) **Note:** Version bump only for package @ionic/angular-server diff --git a/packages/angular-server/package-lock.json b/packages/angular-server/package-lock.json index 1339d264290..fdab4b82214 100644 --- a/packages/angular-server/package-lock.json +++ b/packages/angular-server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/angular-server", - "version": "8.8.11", + "version": "8.8.12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular-server", - "version": "8.8.11", + "version": "8.8.12", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.11" + "@ionic/core": "^8.8.12" }, "devDependencies": { "@angular-eslint/eslint-plugin": "^16.0.0", @@ -1031,9 +1031,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.11.tgz", - "integrity": "sha512-+/uKZu3+ihAHBXl+EGrln+EW6v57VWqLICOHK4zahGy7SM9soq1PYLtG03DGsxqPt9ET7YwpX1B0ToU8/Ved3w==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.12.tgz", + "integrity": "sha512-nR3Us+NICa4eACvPXb4yUzza1URxQ23ELjjLmK1KRFHlk4DhhlzNrYAad0aibTRFh4toXqvFMTADFPB+JiTTFg==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", @@ -7309,9 +7309,9 @@ "dev": true }, "@ionic/core": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.11.tgz", - "integrity": "sha512-+/uKZu3+ihAHBXl+EGrln+EW6v57VWqLICOHK4zahGy7SM9soq1PYLtG03DGsxqPt9ET7YwpX1B0ToU8/Ved3w==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.12.tgz", + "integrity": "sha512-nR3Us+NICa4eACvPXb4yUzza1URxQ23ELjjLmK1KRFHlk4DhhlzNrYAad0aibTRFh4toXqvFMTADFPB+JiTTFg==", "requires": { "@stencil/core": "4.43.5", "ionicons": "^8.0.13", diff --git a/packages/angular-server/package.json b/packages/angular-server/package.json index b44ccf8979c..284e65fdcd0 100644 --- a/packages/angular-server/package.json +++ b/packages/angular-server/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular-server", - "version": "8.8.11", + "version": "8.8.12", "description": "Angular SSR Module for Ionic", "keywords": [ "ionic", @@ -62,6 +62,6 @@ }, "prettier": "@ionic/prettier-config", "dependencies": { - "@ionic/core": "^8.8.11" + "@ionic/core": "^8.8.12" } } diff --git a/packages/angular/CHANGELOG.md b/packages/angular/CHANGELOG.md index 4ff12da8dba..9b1aa98fde2 100644 --- a/packages/angular/CHANGELOG.md +++ b/packages/angular/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.12](https://github.com/ionic-team/ionic-framework/compare/v8.8.11...v8.8.12) (2026-06-24) + + +### Bug Fixes + +* **angular:** honor modifier-click on routerLink ([#31230](https://github.com/ionic-team/ionic-framework/issues/31230)) ([2ac9851](https://github.com/ionic-team/ionic-framework/commit/2ac98512c78f6d47e3a6a17ff0159047ba14a5cd)), closes [#26394](https://github.com/ionic-team/ionic-framework/issues/26394) +* **angular:** run change detection on attached overlay views ([#31235](https://github.com/ionic-team/ionic-framework/issues/31235)) ([8e76fd0](https://github.com/ionic-team/ionic-framework/commit/8e76fd0cceeb878ad4b071515acb593892512111)), closes [#31220](https://github.com/ionic-team/ionic-framework/issues/31220) + + + + + ## [8.8.11](https://github.com/ionic-team/ionic-framework/compare/v8.8.10...v8.8.11) (2026-06-17) **Note:** Version bump only for package @ionic/angular diff --git a/packages/angular/common/src/directives/navigation/router-link-delegate.ts b/packages/angular/common/src/directives/navigation/router-link-delegate.ts index 4391d6ea0d1..3da7d105c9b 100644 --- a/packages/angular/common/src/directives/navigation/router-link-delegate.ts +++ b/packages/angular/common/src/directives/navigation/router-link-delegate.ts @@ -1,5 +1,5 @@ import { LocationStrategy } from '@angular/common'; -import { ElementRef, OnChanges, OnInit, Directive, HostListener, Input, Optional } from '@angular/core'; +import { ElementRef, OnChanges, OnDestroy, OnInit, Directive, HostListener, Input, Optional } from '@angular/core'; import { Router, RouterLink } from '@angular/router'; import type { AnimationBuilder, RouterDirection } from '@ionic/core/components'; @@ -14,7 +14,7 @@ import { NavController } from '../../providers/nav-controller'; @Directive({ selector: ':not(a):not(area)[routerLink]', }) -export class RouterLinkDelegateDirective implements OnInit, OnChanges { +export class RouterLinkDelegateDirective implements OnInit, OnChanges, OnDestroy { @Input() routerDirection: RouterDirection = 'forward'; @@ -32,12 +32,51 @@ export class RouterLinkDelegateDirective implements OnInit, OnChanges { ngOnInit(): void { this.updateTargetUrlAndHref(); this.updateTabindex(); + + /** + * Ionic components like `ion-item` render a native anchor in their shadow DOM, + * so a modifier click (ctrl/meta/shift/alt) or a non-`_self` target should let + * the browser handle the navigation natively (new tab, new window, download) + * instead of navigating in-app. + * + * We listen in the capture phase so this runs before Angular's `RouterLink` + * handler and our own bubble-phase `onClick`. On a native-navigation intent it + * stops propagation to cancel the in-app navigation, but leaves `preventDefault` + * alone so the native anchor can still act. + */ + this.elementRef.nativeElement.addEventListener('click', this.onCaptureClick, { capture: true }); } ngOnChanges(): void { this.updateTargetUrlAndHref(); } + ngOnDestroy(): void { + this.elementRef.nativeElement.removeEventListener('click', this.onCaptureClick, { capture: true }); + } + + private onCaptureClick = (ev: Event): void => { + if (this.opensNatively(ev)) { + ev.stopImmediatePropagation(); + } + }; + + /** + * True when the browser should handle the click natively instead of routing + * in-app: a modifier was held (ctrl/meta/shift/alt), or the host targets + * something other than `_self`. This mirrors the modifier set Angular's own + * `RouterLink` guards on, so an Ionic `routerLink` behaves like a plain anchor + * for new-tab, new-window, and download intents. + */ + private opensNatively(ev: Event): boolean { + if (ev instanceof MouseEvent && (ev.ctrlKey || ev.metaKey || ev.shiftKey || ev.altKey)) { + return true; + } + + const target = this.elementRef.nativeElement.target; + return target != null && target !== '' && target !== '_self'; + } + /** * The `tabindex` is set to `0` by default on the host element when * the `routerLink` directive is used. This causes issues with Ionic diff --git a/packages/angular/common/src/providers/angular-delegate.ts b/packages/angular/common/src/providers/angular-delegate.ts index bde802ab115..bba50323591 100644 --- a/packages/angular/common/src/providers/angular-delegate.ts +++ b/packages/angular/common/src/providers/angular-delegate.ts @@ -233,6 +233,14 @@ export const attachView = ( applicationRef.attachView(componentRef.hostView); + /** + * Run change detection so template bindings (e.g. ``) + * apply during this synchronous pass, before the web component runs its load + * lifecycle. `createComponent` only runs the creation pass, so without this the + * binding lands after the element has loaded, too late for `ion-nav` to read it. + */ + componentRef.changeDetectorRef.detectChanges(); + elRefMap.set(hostElement, componentRef); elEventsMap.set(hostElement, unbindEvents); return hostElement; diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index 3b6d8c9c244..60d52f4a89c 100644 --- a/packages/angular/package-lock.json +++ b/packages/angular/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/angular", - "version": "8.8.11", + "version": "8.8.12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/angular", - "version": "8.8.11", + "version": "8.8.12", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.11", + "@ionic/core": "^8.8.12", "ionicons": "^8.0.13", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" @@ -1398,9 +1398,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.11.tgz", - "integrity": "sha512-+/uKZu3+ihAHBXl+EGrln+EW6v57VWqLICOHK4zahGy7SM9soq1PYLtG03DGsxqPt9ET7YwpX1B0ToU8/Ved3w==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.12.tgz", + "integrity": "sha512-nR3Us+NICa4eACvPXb4yUzza1URxQ23ELjjLmK1KRFHlk4DhhlzNrYAad0aibTRFh4toXqvFMTADFPB+JiTTFg==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", diff --git a/packages/angular/package.json b/packages/angular/package.json index 45deaca6da7..7dd0d50a49e 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular", - "version": "8.8.11", + "version": "8.8.12", "description": "Angular specific wrappers for @ionic/core", "keywords": [ "ionic", @@ -48,7 +48,7 @@ } }, "dependencies": { - "@ionic/core": "^8.8.11", + "@ionic/core": "^8.8.12", "ionicons": "^8.0.13", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" diff --git a/packages/angular/test/base/e2e/src/standalone/nav-modal-root.spec.ts b/packages/angular/test/base/e2e/src/standalone/nav-modal-root.spec.ts new file mode 100644 index 00000000000..36fa53d2ba3 --- /dev/null +++ b/packages/angular/test/base/e2e/src/standalone/nav-modal-root.spec.ts @@ -0,0 +1,15 @@ +import { expect, test } from '@playwright/test'; + +test.describe('Nav: root binding inside a modal (standalone)', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/standalone/nav-modal-root'); + }); + + test('should render the nav root when bound from componentProps', async ({ page }) => { + await page.locator('#open-nav-modal').click(); + + await expect(page.locator('ion-modal')).toBeVisible(); + await expect(page.locator('ion-modal ion-nav')).toBeVisible(); + await expect(page.locator('#nav-modal-root-content')).toBeVisible(); + }); +}); diff --git a/packages/angular/test/base/e2e/src/standalone/router-link-modifier-click.spec.ts b/packages/angular/test/base/e2e/src/standalone/router-link-modifier-click.spec.ts new file mode 100644 index 00000000000..a4926fd46b7 --- /dev/null +++ b/packages/angular/test/base/e2e/src/standalone/router-link-modifier-click.spec.ts @@ -0,0 +1,75 @@ +import { test, expect, type Page } from '@playwright/test'; + +/** + * Issue #26394: a modifier click (ctrl/meta/shift/alt) or a non-`_self` target on + * a `routerLink` over a non-anchor Ionic component (ion-item, ion-button) must let + * the browser handle the navigation natively (new tab, window, download) instead + * of navigating the current page in-app. + * + * Playwright headless can't dispatch a real modifier-click or observe the + * browser's native new-tab default, so we dispatch a synthetic click on the + * host (not the shadow anchor, which would fire its own default navigation) and + * assert the JS handler chain leaves the page unchanged with `preventDefault` + * uncalled. + */ +test.describe('RouterLink: modifier click', () => { + const dispatchClick = (page: Page, selector: string, modifiers: Record) => + page.evaluate( + ({ selector, mods }: { selector: string; mods: Record }) => { + const item = document.querySelector(selector) as HTMLElement; + const ev = new MouseEvent('click', { bubbles: true, composed: true, cancelable: true, button: 0, ...mods }); + item.dispatchEvent(ev); + return { defaultPrevented: ev.defaultPrevented }; + }, + { selector, mods: modifiers } + ); + + test.beforeEach(async ({ page }) => { + await page.goto('/standalone/router-link'); + }); + + test('normal click navigates the current page in-app', async ({ page }) => { + const { defaultPrevented } = await dispatchClick(page, '#modifier-item', {}); + + await expect(page).toHaveURL(/.*\/standalone\/popover/); + // The delegate prevents the default to stop a hard page reload. + expect(defaultPrevented).toBe(true); + }); + + for (const modifier of ['ctrlKey', 'metaKey', 'shiftKey', 'altKey']) { + test(`${modifier}+click does not navigate the current page and allows native handling`, async ({ + page, + }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/26394', + }); + + const { defaultPrevented } = await dispatchClick(page, '#modifier-item', { [modifier]: true }); + + // Give any in-app navigation a chance to run before asserting it did not. + await page.waitForTimeout(300); + await expect(page).toHaveURL(/.*\/standalone\/router-link/); + // Default is left intact so the browser can handle the link natively + // (new tab, new window, or download, depending on the browser and OS). + expect(defaultPrevented).toBe(false); + }); + } + + test('click on a non-_self target does not navigate the current page and allows a native new tab', async ({ + page, + }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/26394', + }); + + const { defaultPrevented } = await dispatchClick(page, '#target-item', {}); + + // Give any in-app navigation a chance to run before asserting it did not. + await page.waitForTimeout(300); + await expect(page).toHaveURL(/.*\/standalone\/router-link/); + // Default is left intact so the browser can open the link in a new tab. + expect(defaultPrevented).toBe(false); + }); +}); diff --git a/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts b/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts index c365195662d..d09b36f40aa 100644 --- a/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts +++ b/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts @@ -30,6 +30,7 @@ export const routes: Routes = [ { path: 'back-button', loadComponent: () => import('../back-button/back-button.component').then(c => c.BackButtonComponent) }, { path: 'router-link', loadComponent: () => import('../router-link/router-link.component').then(c => c.RouterLinkComponent) }, { path: 'nav', loadComponent: () => import('../nav/nav.component').then(c => c.NavComponent) }, + { path: 'nav-modal-root', loadComponent: () => import('../nav-modal-root/nav-modal-root.component').then(c => c.NavModalRootComponent) }, { path: 'providers', loadComponent: () => import('../providers/providers.component').then(c => c.ProvidersComponent) }, { path: 'overlay-controllers', loadComponent: () => import('../overlay-controllers/overlay-controllers.component').then(c => c.OverlayControllersComponent) }, { path: 'button', loadComponent: () => import('../button/button.component').then(c => c.ButtonComponent) }, diff --git a/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html b/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html index 3ad10254b30..76d4bc564f7 100644 --- a/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html +++ b/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html @@ -54,6 +54,11 @@ Nav Test + + + Nav Modal Root Test + + Router Link Test diff --git a/packages/angular/test/base/src/app/standalone/nav-modal-root/nav-modal-root-page.component.ts b/packages/angular/test/base/src/app/standalone/nav-modal-root/nav-modal-root-page.component.ts new file mode 100644 index 00000000000..468580a9a06 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/nav-modal-root/nav-modal-root-page.component.ts @@ -0,0 +1,19 @@ +import { Component } from '@angular/core'; +import { IonContent, IonHeader, IonTitle, IonToolbar } from '@ionic/angular/standalone'; + +@Component({ + selector: 'app-nav-modal-root-page', + template: ` + + + Nav Modal Root Page + + + + + + `, + standalone: true, + imports: [IonContent, IonHeader, IonTitle, IonToolbar], +}) +export class NavModalRootPageComponent {} diff --git a/packages/angular/test/base/src/app/standalone/nav-modal-root/nav-modal-root.component.ts b/packages/angular/test/base/src/app/standalone/nav-modal-root/nav-modal-root.component.ts new file mode 100644 index 00000000000..fb2747e4384 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/nav-modal-root/nav-modal-root.component.ts @@ -0,0 +1,35 @@ +import { Component, inject } from '@angular/core'; +import { IonButton, IonContent, IonHeader, IonTitle, IonToolbar, ModalController } from '@ionic/angular/standalone'; + +import { NavModalRootPageComponent } from './nav-modal-root-page.component'; +import { NavWrapperComponent } from './nav-wrapper.component'; + +@Component({ + selector: 'app-nav-modal-root', + template: ` + + + Nav Modal Root + + + + Open Modal + + `, + standalone: true, + imports: [IonButton, IonContent, IonHeader, IonTitle, IonToolbar], +}) +export class NavModalRootComponent { + private modalController = inject(ModalController); + + async openModal() { + const modal = await this.modalController.create({ + component: NavWrapperComponent, + componentProps: { + rootPage: NavModalRootPageComponent, + }, + }); + + await modal.present(); + } +} diff --git a/packages/angular/test/base/src/app/standalone/nav-modal-root/nav-wrapper.component.ts b/packages/angular/test/base/src/app/standalone/nav-modal-root/nav-wrapper.component.ts new file mode 100644 index 00000000000..5e0e6a7919f --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/nav-modal-root/nav-wrapper.component.ts @@ -0,0 +1,17 @@ +import { Component, Input } from '@angular/core'; +import { IonNav } from '@ionic/angular/standalone'; + +/** + * Presented as a modal via `ModalController` with the nav root passed through + * `componentProps`. Reproduces #31220, where the `[root]` binding used to land + * after `ion-nav` had already loaded, leaving the nav empty. + */ +@Component({ + selector: 'app-nav-wrapper', + template: ``, + standalone: true, + imports: [IonNav], +}) +export class NavWrapperComponent { + @Input() rootPage: any; +} diff --git a/packages/angular/test/base/src/app/standalone/router-link/router-link.component.html b/packages/angular/test/base/src/app/standalone/router-link/router-link.component.html index 8887626d1cb..4de92de77c2 100644 --- a/packages/angular/test/base/src/app/standalone/router-link/router-link.component.html +++ b/packages/angular/test/base/src/app/standalone/router-link/router-link.component.html @@ -10,3 +10,9 @@ I'm an ion-button + + I'm an ion-item + + + I'm an ion-item with a target + diff --git a/packages/angular/test/base/src/app/standalone/router-link/router-link.component.ts b/packages/angular/test/base/src/app/standalone/router-link/router-link.component.ts index 31653f3bb0d..73f470da7ca 100644 --- a/packages/angular/test/base/src/app/standalone/router-link/router-link.component.ts +++ b/packages/angular/test/base/src/app/standalone/router-link/router-link.component.ts @@ -1,11 +1,11 @@ import { Component } from '@angular/core'; import { RouterLink } from '@angular/router'; -import { IonRouterLink, IonRouterLinkWithHref } from '@ionic/angular/standalone'; +import { IonItem, IonRouterLink, IonRouterLinkWithHref } from '@ionic/angular/standalone'; @Component({ selector: 'app-router-link', templateUrl: './router-link.component.html', standalone: true, - imports: [RouterLink, IonRouterLink, IonRouterLinkWithHref], + imports: [RouterLink, IonItem, IonRouterLink, IonRouterLinkWithHref], }) export class RouterLinkComponent {} diff --git a/packages/docs/CHANGELOG.md b/packages/docs/CHANGELOG.md index 5917f17868e..f3d1e7faae6 100644 --- a/packages/docs/CHANGELOG.md +++ b/packages/docs/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.12](https://github.com/ionic-team/ionic-framework/compare/v8.8.11...v8.8.12) (2026-06-24) + +**Note:** Version bump only for package @ionic/docs + + + + + ## [8.8.11](https://github.com/ionic-team/ionic-framework/compare/v8.8.10...v8.8.11) (2026-06-17) **Note:** Version bump only for package @ionic/docs diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index 7a0bbe2011b..15a64f12078 100644 --- a/packages/docs/package-lock.json +++ b/packages/docs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/docs", - "version": "8.8.11", + "version": "8.8.12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/docs", - "version": "8.8.11", + "version": "8.8.12", "license": "MIT" } } diff --git a/packages/docs/package.json b/packages/docs/package.json index 3e2a99476f8..da1803635d3 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/docs", - "version": "8.8.11", + "version": "8.8.12", "description": "Pre-packaged API documentation for the Ionic docs.", "main": "core.json", "types": "core.d.ts", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index 936acf7b80a..214dd4d3095 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.12](https://github.com/ionic-team/ionic-framework/compare/v8.8.11...v8.8.12) (2026-06-24) + +**Note:** Version bump only for package @ionic/react-router + + + + + ## [8.8.11](https://github.com/ionic-team/ionic-framework/compare/v8.8.10...v8.8.11) (2026-06-17) **Note:** Version bump only for package @ionic/react-router diff --git a/packages/react-router/package-lock.json b/packages/react-router/package-lock.json index ae798db3a08..29e3893bf51 100644 --- a/packages/react-router/package-lock.json +++ b/packages/react-router/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react-router", - "version": "8.8.11", + "version": "8.8.12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react-router", - "version": "8.8.11", + "version": "8.8.12", "license": "MIT", "dependencies": { - "@ionic/react": "^8.8.11", + "@ionic/react": "^8.8.12", "tslib": "*" }, "devDependencies": { @@ -238,9 +238,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.11.tgz", - "integrity": "sha512-+/uKZu3+ihAHBXl+EGrln+EW6v57VWqLICOHK4zahGy7SM9soq1PYLtG03DGsxqPt9ET7YwpX1B0ToU8/Ved3w==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.12.tgz", + "integrity": "sha512-nR3Us+NICa4eACvPXb4yUzza1URxQ23ELjjLmK1KRFHlk4DhhlzNrYAad0aibTRFh4toXqvFMTADFPB+JiTTFg==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", @@ -418,12 +418,12 @@ } }, "node_modules/@ionic/react": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.11.tgz", - "integrity": "sha512-ZDuF8ZQNWsZqw2hxlpNqlOWmTf/vvlTiT5c8oSqX4+A7Jw6YHj+E81MM34Z80RecJYNff7BC/Jjb2THVJwbY+g==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.12.tgz", + "integrity": "sha512-rTweY7/zf4htD5CgG1ENzBBUyOF4t1dvUA4odAwmLE72qAIy2XfRkGlOgTVAPSXygJZGHt2LXCFTWk1v66APdw==", "license": "MIT", "dependencies": { - "@ionic/core": "8.8.11", + "@ionic/core": "8.8.12", "ionicons": "^8.0.13", "tslib": "*" }, @@ -4178,9 +4178,9 @@ "dev": true }, "@ionic/core": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.11.tgz", - "integrity": "sha512-+/uKZu3+ihAHBXl+EGrln+EW6v57VWqLICOHK4zahGy7SM9soq1PYLtG03DGsxqPt9ET7YwpX1B0ToU8/Ved3w==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.12.tgz", + "integrity": "sha512-nR3Us+NICa4eACvPXb4yUzza1URxQ23ELjjLmK1KRFHlk4DhhlzNrYAad0aibTRFh4toXqvFMTADFPB+JiTTFg==", "requires": { "@stencil/core": "4.43.5", "ionicons": "^8.0.13", @@ -4284,11 +4284,11 @@ "requires": {} }, "@ionic/react": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.11.tgz", - "integrity": "sha512-ZDuF8ZQNWsZqw2hxlpNqlOWmTf/vvlTiT5c8oSqX4+A7Jw6YHj+E81MM34Z80RecJYNff7BC/Jjb2THVJwbY+g==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.12.tgz", + "integrity": "sha512-rTweY7/zf4htD5CgG1ENzBBUyOF4t1dvUA4odAwmLE72qAIy2XfRkGlOgTVAPSXygJZGHt2LXCFTWk1v66APdw==", "requires": { - "@ionic/core": "8.8.11", + "@ionic/core": "8.8.12", "ionicons": "^8.0.13", "tslib": "*" } diff --git a/packages/react-router/package.json b/packages/react-router/package.json index a6f83bffb3e..a2dbd77fabc 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react-router", - "version": "8.8.11", + "version": "8.8.12", "description": "React Router wrapper for @ionic/react", "keywords": [ "ionic", @@ -36,7 +36,7 @@ "dist/" ], "dependencies": { - "@ionic/react": "^8.8.11", + "@ionic/react": "^8.8.12", "tslib": "*" }, "peerDependencies": { diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index ad89385c351..3e21ed6903b 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.12](https://github.com/ionic-team/ionic-framework/compare/v8.8.11...v8.8.12) (2026-06-24) + +**Note:** Version bump only for package @ionic/react + + + + + ## [8.8.11](https://github.com/ionic-team/ionic-framework/compare/v8.8.10...v8.8.11) (2026-06-17) diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index 59c64b309e6..89b29526972 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react", - "version": "8.8.11", + "version": "8.8.12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/react", - "version": "8.8.11", + "version": "8.8.12", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.11", + "@ionic/core": "^8.8.12", "ionicons": "^8.0.13", "tslib": "*" }, @@ -736,9 +736,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.11.tgz", - "integrity": "sha512-+/uKZu3+ihAHBXl+EGrln+EW6v57VWqLICOHK4zahGy7SM9soq1PYLtG03DGsxqPt9ET7YwpX1B0ToU8/Ved3w==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.12.tgz", + "integrity": "sha512-nR3Us+NICa4eACvPXb4yUzza1URxQ23ELjjLmK1KRFHlk4DhhlzNrYAad0aibTRFh4toXqvFMTADFPB+JiTTFg==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", diff --git a/packages/react/package.json b/packages/react/package.json index b6e889938d4..1cddfb41d59 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react", - "version": "8.8.11", + "version": "8.8.12", "description": "React specific wrapper for @ionic/core", "keywords": [ "ionic", @@ -40,7 +40,7 @@ "css/" ], "dependencies": { - "@ionic/core": "^8.8.11", + "@ionic/core": "^8.8.12", "ionicons": "^8.0.13", "tslib": "*" }, diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md index 45cd9978a48..6c2948a3136 100644 --- a/packages/vue-router/CHANGELOG.md +++ b/packages/vue-router/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.12](https://github.com/ionic-team/ionic-framework/compare/v8.8.11...v8.8.12) (2026-06-24) + +**Note:** Version bump only for package @ionic/vue-router + + + + + ## [8.8.11](https://github.com/ionic-team/ionic-framework/compare/v8.8.10...v8.8.11) (2026-06-17) **Note:** Version bump only for package @ionic/vue-router diff --git a/packages/vue-router/package-lock.json b/packages/vue-router/package-lock.json index db7a9335aac..5cbe3ccc28c 100644 --- a/packages/vue-router/package-lock.json +++ b/packages/vue-router/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue-router", - "version": "8.8.11", + "version": "8.8.12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue-router", - "version": "8.8.11", + "version": "8.8.12", "license": "MIT", "dependencies": { - "@ionic/vue": "^8.8.11" + "@ionic/vue": "^8.8.12" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", @@ -673,9 +673,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.11.tgz", - "integrity": "sha512-+/uKZu3+ihAHBXl+EGrln+EW6v57VWqLICOHK4zahGy7SM9soq1PYLtG03DGsxqPt9ET7YwpX1B0ToU8/Ved3w==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.12.tgz", + "integrity": "sha512-nR3Us+NICa4eACvPXb4yUzza1URxQ23ELjjLmK1KRFHlk4DhhlzNrYAad0aibTRFh4toXqvFMTADFPB+JiTTFg==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", @@ -868,12 +868,12 @@ } }, "node_modules/@ionic/vue": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.11.tgz", - "integrity": "sha512-QbleogSiJZmrFK2tmS0TSNPxSfpdohdszJVs98ueuCJxEOwEOnsXOcJ7yyHyK3NczGJmr/iFz/ovgCyKH0Yj2Q==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.12.tgz", + "integrity": "sha512-qvjDS/t9fE5CqeNP2Agba7glr9oMueIk/qTlTPjxWcAsLnqVM/dEikO3we+pGB9yx340mJ99wsEXVOLM+rEY9Q==", "license": "MIT", "dependencies": { - "@ionic/core": "8.8.11", + "@ionic/core": "8.8.12", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" } @@ -8044,9 +8044,9 @@ "dev": true }, "@ionic/core": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.11.tgz", - "integrity": "sha512-+/uKZu3+ihAHBXl+EGrln+EW6v57VWqLICOHK4zahGy7SM9soq1PYLtG03DGsxqPt9ET7YwpX1B0ToU8/Ved3w==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.12.tgz", + "integrity": "sha512-nR3Us+NICa4eACvPXb4yUzza1URxQ23ELjjLmK1KRFHlk4DhhlzNrYAad0aibTRFh4toXqvFMTADFPB+JiTTFg==", "requires": { "@stencil/core": "4.43.5", "ionicons": "^8.0.13", @@ -8159,11 +8159,11 @@ "requires": {} }, "@ionic/vue": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.11.tgz", - "integrity": "sha512-QbleogSiJZmrFK2tmS0TSNPxSfpdohdszJVs98ueuCJxEOwEOnsXOcJ7yyHyK3NczGJmr/iFz/ovgCyKH0Yj2Q==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.12.tgz", + "integrity": "sha512-qvjDS/t9fE5CqeNP2Agba7glr9oMueIk/qTlTPjxWcAsLnqVM/dEikO3we+pGB9yx340mJ99wsEXVOLM+rEY9Q==", "requires": { - "@ionic/core": "8.8.11", + "@ionic/core": "8.8.12", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" } diff --git a/packages/vue-router/package.json b/packages/vue-router/package.json index 3efb4ea3519..a304874fcf3 100644 --- a/packages/vue-router/package.json +++ b/packages/vue-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue-router", - "version": "8.8.11", + "version": "8.8.12", "description": "Vue Router integration for @ionic/vue", "scripts": { "test.spec": "jest", @@ -44,7 +44,7 @@ }, "homepage": "https://github.com/ionic-team/ionic-framework#readme", "dependencies": { - "@ionic/vue": "^8.8.11" + "@ionic/vue": "^8.8.12" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 5ac957a733d..ccc226aa58b 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.12](https://github.com/ionic-team/ionic-framework/compare/v8.8.11...v8.8.12) (2026-06-24) + +**Note:** Version bump only for package @ionic/vue + + + + + ## [8.8.11](https://github.com/ionic-team/ionic-framework/compare/v8.8.10...v8.8.11) (2026-06-17) **Note:** Version bump only for package @ionic/vue diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index 124f4555d06..0738c329626 100644 --- a/packages/vue/package-lock.json +++ b/packages/vue/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue", - "version": "8.8.11", + "version": "8.8.12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/vue", - "version": "8.8.11", + "version": "8.8.12", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.11", + "@ionic/core": "^8.8.12", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" }, @@ -222,9 +222,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.11", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.11.tgz", - "integrity": "sha512-+/uKZu3+ihAHBXl+EGrln+EW6v57VWqLICOHK4zahGy7SM9soq1PYLtG03DGsxqPt9ET7YwpX1B0ToU8/Ved3w==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.12.tgz", + "integrity": "sha512-nR3Us+NICa4eACvPXb4yUzza1URxQ23ELjjLmK1KRFHlk4DhhlzNrYAad0aibTRFh4toXqvFMTADFPB+JiTTFg==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", diff --git a/packages/vue/package.json b/packages/vue/package.json index 00a4c43b0be..1b7ee0d0597 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue", - "version": "8.8.11", + "version": "8.8.12", "description": "Vue specific wrapper for @ionic/core", "scripts": { "eslint": "eslint src", @@ -68,7 +68,7 @@ "vue-router": "^4.0.16" }, "dependencies": { - "@ionic/core": "^8.8.11", + "@ionic/core": "^8.8.12", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" },