diff --git a/.github/actions/publish-npm/action.yml b/.github/actions/publish-npm/action.yml
index dc77edb66ae..132b57f75b3 100644
--- a/.github/actions/publish-npm/action.yml
+++ b/.github/actions/publish-npm/action.yml
@@ -22,7 +22,7 @@ runs:
using: 'composite'
steps:
- name: π’ Configure Node for Publish
- uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ inputs.node-version }}
registry-url: 'https://registry.npmjs.org'
diff --git a/.github/workflows/actions/build-angular-server/action.yml b/.github/workflows/actions/build-angular-server/action.yml
index cb2b667ffaf..3cab52b650a 100644
--- a/.github/workflows/actions/build-angular-server/action.yml
+++ b/.github/workflows/actions/build-angular-server/action.yml
@@ -3,7 +3,7 @@ description: 'Build Ionic Angular Server'
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- uses: ./.github/workflows/actions/download-archive
diff --git a/.github/workflows/actions/build-core-stencil-prerelease/action.yml b/.github/workflows/actions/build-core-stencil-prerelease/action.yml
index d49deb58d6e..913e8f494ff 100644
--- a/.github/workflows/actions/build-core-stencil-prerelease/action.yml
+++ b/.github/workflows/actions/build-core-stencil-prerelease/action.yml
@@ -9,7 +9,7 @@ runs:
using: 'composite'
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
diff --git a/.github/workflows/actions/build-core/action.yml b/.github/workflows/actions/build-core/action.yml
index 3bf6659db09..2b5117cf7af 100644
--- a/.github/workflows/actions/build-core/action.yml
+++ b/.github/workflows/actions/build-core/action.yml
@@ -9,7 +9,7 @@ runs:
using: 'composite'
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- name: πΈοΈ Install Dependencies
diff --git a/.github/workflows/actions/build-react-router/action.yml b/.github/workflows/actions/build-react-router/action.yml
index 0c46ad895e1..568c835c42f 100644
--- a/.github/workflows/actions/build-react-router/action.yml
+++ b/.github/workflows/actions/build-react-router/action.yml
@@ -3,7 +3,7 @@ description: 'Build Ionic React Router'
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- uses: ./.github/workflows/actions/download-archive
diff --git a/.github/workflows/actions/build-react/action.yml b/.github/workflows/actions/build-react/action.yml
index f2adcb0788f..9b4a5995e9e 100644
--- a/.github/workflows/actions/build-react/action.yml
+++ b/.github/workflows/actions/build-react/action.yml
@@ -3,7 +3,7 @@ description: 'Build Ionic React'
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- uses: ./.github/workflows/actions/download-archive
diff --git a/.github/workflows/actions/build-vue-router/action.yml b/.github/workflows/actions/build-vue-router/action.yml
index 897153c9fa4..efd4579f565 100644
--- a/.github/workflows/actions/build-vue-router/action.yml
+++ b/.github/workflows/actions/build-vue-router/action.yml
@@ -3,7 +3,7 @@ description: 'Builds Ionic Vue Router'
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- uses: ./.github/workflows/actions/download-archive
diff --git a/.github/workflows/actions/build-vue/action.yml b/.github/workflows/actions/build-vue/action.yml
index 72a49093fca..170e889f968 100644
--- a/.github/workflows/actions/build-vue/action.yml
+++ b/.github/workflows/actions/build-vue/action.yml
@@ -3,7 +3,7 @@ description: 'Build Ionic Vue'
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- uses: ./.github/workflows/actions/download-archive
diff --git a/.github/workflows/actions/download-archive/action.yml b/.github/workflows/actions/download-archive/action.yml
index e61c44a0910..2acddf9713f 100644
--- a/.github/workflows/actions/download-archive/action.yml
+++ b/.github/workflows/actions/download-archive/action.yml
@@ -10,7 +10,7 @@ inputs:
runs:
using: 'composite'
steps:
- - uses: actions/download-artifact@v7
+ - uses: actions/download-artifact@v8
with:
name: ${{ inputs.name }}
path: ${{ inputs.path }}
diff --git a/.github/workflows/actions/test-angular-e2e/action.yml b/.github/workflows/actions/test-angular-e2e/action.yml
index c6225382658..11aa8eb789c 100644
--- a/.github/workflows/actions/test-angular-e2e/action.yml
+++ b/.github/workflows/actions/test-angular-e2e/action.yml
@@ -6,7 +6,7 @@ inputs:
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- uses: ./.github/workflows/actions/download-archive
diff --git a/.github/workflows/actions/test-core-clean-build/action.yml b/.github/workflows/actions/test-core-clean-build/action.yml
index 7e5942a036e..92e3fed394b 100644
--- a/.github/workflows/actions/test-core-clean-build/action.yml
+++ b/.github/workflows/actions/test-core-clean-build/action.yml
@@ -3,7 +3,7 @@ description: 'Test Core Clean Build'
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
diff --git a/.github/workflows/actions/test-core-lint/action.yml b/.github/workflows/actions/test-core-lint/action.yml
index ef9d37d0c7d..321a2d26304 100644
--- a/.github/workflows/actions/test-core-lint/action.yml
+++ b/.github/workflows/actions/test-core-lint/action.yml
@@ -3,7 +3,7 @@ description: 'Test Core Lint'
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- name: πΈοΈ Install Dependencies
diff --git a/.github/workflows/actions/test-core-screenshot/action.yml b/.github/workflows/actions/test-core-screenshot/action.yml
index 629c68d79f2..7ffa40faf5c 100644
--- a/.github/workflows/actions/test-core-screenshot/action.yml
+++ b/.github/workflows/actions/test-core-screenshot/action.yml
@@ -13,7 +13,7 @@ inputs:
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- uses: ./.github/workflows/actions/download-archive
@@ -66,7 +66,7 @@ runs:
working-directory: ./core
- name: π¦ Archive Updated Screenshots
if: inputs.update == 'true' && steps.test-and-update.outputs.hasUpdatedScreenshots == 'true'
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7
with:
name: updated-screenshots-${{ inputs.shard }}-${{ inputs.totalShards }}
path: UpdatedScreenshots-${{ inputs.shard }}-${{ inputs.totalShards }}.zip
diff --git a/.github/workflows/actions/test-core-spec/action.yml b/.github/workflows/actions/test-core-spec/action.yml
index 3cbfa7aefd1..f25207f6a49 100644
--- a/.github/workflows/actions/test-core-spec/action.yml
+++ b/.github/workflows/actions/test-core-spec/action.yml
@@ -6,7 +6,7 @@ inputs:
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- name: πΈοΈ Install Dependencies
diff --git a/.github/workflows/actions/test-react-e2e/action.yml b/.github/workflows/actions/test-react-e2e/action.yml
index 18fb14c705e..a6f1d42ba72 100644
--- a/.github/workflows/actions/test-react-e2e/action.yml
+++ b/.github/workflows/actions/test-react-e2e/action.yml
@@ -6,7 +6,7 @@ inputs:
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- uses: ./.github/workflows/actions/download-archive
diff --git a/.github/workflows/actions/test-react-router-e2e/action.yml b/.github/workflows/actions/test-react-router-e2e/action.yml
index 3af841bf83c..70dff8db874 100644
--- a/.github/workflows/actions/test-react-router-e2e/action.yml
+++ b/.github/workflows/actions/test-react-router-e2e/action.yml
@@ -6,7 +6,7 @@ inputs:
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- uses: ./.github/workflows/actions/download-archive
diff --git a/.github/workflows/actions/test-vue-e2e/action.yml b/.github/workflows/actions/test-vue-e2e/action.yml
index 0c15dac0822..060e923bdf4 100644
--- a/.github/workflows/actions/test-vue-e2e/action.yml
+++ b/.github/workflows/actions/test-vue-e2e/action.yml
@@ -6,7 +6,7 @@ inputs:
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- uses: ./.github/workflows/actions/download-archive
diff --git a/.github/workflows/actions/update-reference-screenshots/action.yml b/.github/workflows/actions/update-reference-screenshots/action.yml
index 9c082f1a17d..51d7bdce508 100644
--- a/.github/workflows/actions/update-reference-screenshots/action.yml
+++ b/.github/workflows/actions/update-reference-screenshots/action.yml
@@ -7,10 +7,10 @@ on:
runs:
using: 'composite'
steps:
- - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+ - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.x
- - uses: actions/download-artifact@v7
+ - uses: actions/download-artifact@v8
with:
path: ./artifacts
- name: π Extract Archives
diff --git a/.github/workflows/actions/upload-archive/action.yml b/.github/workflows/actions/upload-archive/action.yml
index 67465651c88..c09397345f9 100644
--- a/.github/workflows/actions/upload-archive/action.yml
+++ b/.github/workflows/actions/upload-archive/action.yml
@@ -13,7 +13,7 @@ runs:
- name: ποΈ Create Archive
run: zip -q -r ${{ inputs.output }} ${{ inputs.paths }}
shell: bash
- - uses: actions/upload-artifact@v6
+ - uses: actions/upload-artifact@v7
with:
name: ${{ inputs.name }}
path: ${{ inputs.output }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c14a89fea20..6105c23b287 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,19 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [8.8.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25)
+
+
+### Bug Fixes
+
+* **angular:** forward generic type parameter on ModalOptions and PopoverOptions ([#31022](https://github.com/ionic-team/ionic-framework/issues/31022)) ([cbfe7cc](https://github.com/ionic-team/ionic-framework/commit/cbfe7cce3be345eacbf9fe29e74438a927c16679)), closes [#31012](https://github.com/ionic-team/ionic-framework/issues/31012)
+* **checkbox:** re-evaluate label visibility when label is updated ([#30980](https://github.com/ionic-team/ionic-framework/issues/30980)) ([ce83407](https://github.com/ionic-team/ionic-framework/commit/ce83407e1debbe74f20d2d6dc2535a0ef3f974a0))
+* **datetime:** days keep in focus after changing the month ([#31021](https://github.com/ionic-team/ionic-framework/issues/31021)) ([5fdaba2](https://github.com/ionic-team/ionic-framework/commit/5fdaba2b021fe8b2b43a49eae7c687544c97d502))
+
+
+
+
+
## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06)
diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md
index 63f04e42c9f..111a781a490 100644
--- a/core/CHANGELOG.md
+++ b/core/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.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25)
+
+
+### Bug Fixes
+
+* **checkbox:** re-evaluate label visibility when label is updated ([#30980](https://github.com/ionic-team/ionic-framework/issues/30980)) ([ce83407](https://github.com/ionic-team/ionic-framework/commit/ce83407e1debbe74f20d2d6dc2535a0ef3f974a0))
+* **datetime:** days keep in focus after changing the month ([#31021](https://github.com/ionic-team/ionic-framework/issues/31021)) ([5fdaba2](https://github.com/ionic-team/ionic-framework/commit/5fdaba2b021fe8b2b43a49eae7c687544c97d502))
+
+
+
+
+
## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06)
diff --git a/core/package-lock.json b/core/package-lock.json
index 47edcb2eb16..c94b7920878 100644
--- a/core/package-lock.json
+++ b/core/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@ionic/core",
- "version": "8.8.1",
+ "version": "8.8.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ionic/core",
- "version": "8.8.1",
+ "version": "8.8.2",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
@@ -627,9 +627,9 @@
"license": "MIT"
},
"node_modules/@capacitor/core": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.1.0.tgz",
- "integrity": "sha512-UfMBMWc1v7J+14AhH03QmeNwV3HZx3qnOWhpwnHfzALEwAwlV/itQOQqcasMQYhOHWL0tiymc5ByaLTn7KKQxw==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.2.0.tgz",
+ "integrity": "sha512-oKaoNeNtH2iIZMDFVrb1atoyRECDGHcfLMunJ5KWN8DtvpVBeeA4c41e20NTuhMxw1cSYbpq2PV2hb+/9CJxlQ==",
"dev": true,
"license": "MIT",
"dependencies": {
diff --git a/core/package.json b/core/package.json
index 7db02d6f15f..d0a7ac0ef12 100644
--- a/core/package.json
+++ b/core/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/core",
- "version": "8.8.1",
+ "version": "8.8.2",
"description": "Base components for Ionic",
"engines": {
"node": ">= 16"
diff --git a/core/src/components/checkbox/checkbox.tsx b/core/src/components/checkbox/checkbox.tsx
index abd289c2635..8a25b9200d5 100644
--- a/core/src/components/checkbox/checkbox.tsx
+++ b/core/src/components/checkbox/checkbox.tsx
@@ -127,6 +127,8 @@ export class Checkbox implements ComponentInterface {
*/
@State() isInvalid = false;
+ @State() private hasLabelContent = false;
+
@State() private hintTextId?: string;
/**
@@ -265,6 +267,10 @@ export class Checkbox implements ComponentInterface {
ev.stopPropagation();
};
+ private onSlotChange = () => {
+ this.hasLabelContent = this.el.textContent !== '';
+ };
+
private getHintTextId(): string | undefined {
const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
@@ -326,7 +332,6 @@ export class Checkbox implements ComponentInterface {
} = this;
const mode = getIonMode(this);
const path = getSVGPath(mode, indeterminate);
- const hasLabelContent = el.textContent !== '';
renderHiddenInput(true, el, name, checked ? value : '', disabled);
@@ -338,7 +343,7 @@ export class Checkbox implements ComponentInterface {
aria-checked={indeterminate ? 'mixed' : `${checked}`}
aria-describedby={this.hintTextId}
aria-invalid={this.isInvalid ? 'true' : undefined}
- aria-labelledby={hasLabelContent ? this.inputLabelId : null}
+ aria-labelledby={this.hasLabelContent ? this.inputLabelId : null}
aria-label={inheritedAttributes['aria-label'] || null}
aria-disabled={disabled ? 'true' : null}
aria-required={required ? 'true' : undefined}
@@ -376,13 +381,13 @@ export class Checkbox implements ComponentInterface {
-
+
{this.renderHintText()}
diff --git a/core/src/components/datetime/datetime.tsx b/core/src/components/datetime/datetime.tsx
index a7a3c2d1d2c..a81e84ec8b9 100644
--- a/core/src/components/datetime/datetime.tsx
+++ b/core/src/components/datetime/datetime.tsx
@@ -1033,6 +1033,11 @@ export class Datetime implements ComponentInterface {
if (this.resolveForceDateScrolling) {
this.resolveForceDateScrolling();
}
+
+ const activeEl = this.el.shadowRoot!.activeElement as HTMLElement | null;
+ if (activeEl && activeEl.classList.contains('calendar-day')) {
+ (activeEl.closest('.calendar-body') as HTMLElement | null)?.focus();
+ }
});
};
diff --git a/core/src/components/spinner/test/transform/spinner.e2e.ts b/core/src/components/spinner/test/transform/spinner.e2e.ts
new file mode 100644
index 00000000000..ccc84bfb80a
--- /dev/null
+++ b/core/src/components/spinner/test/transform/spinner.e2e.ts
@@ -0,0 +1,47 @@
+import { expect } from '@playwright/test';
+import { configs, test } from '@utils/test/playwright';
+
+/**
+ * This behavior does not vary across directions/modes.
+ */
+configs({ directions: ['ltr'], modes: ['md'] }).forEach(({ title, config }) => {
+ test.describe(title('spinner: transform'), () => {
+ test('should not overwrite circular animation when transform style is applied', async ({ page }, testInfo) => {
+ testInfo.annotations.push({
+ type: 'issue',
+ description: 'https://github.com/ionic-team/ionic-framework/issues/19247',
+ });
+
+ await page.setContent(
+ `
+
+
+
+ `,
+ config
+ );
+
+ const spinner = page.locator('ion-spinner');
+
+ // Get initial position
+ const initialBox = await spinner.boundingBox();
+
+ // Wait for a few animation cycles
+ await page.waitForTimeout(500);
+
+ // Get position after the cycles
+ const finalBox = await spinner.boundingBox();
+
+ // The x and y coordinates should remain identical
+ expect(initialBox!.x).toBe(finalBox!.x);
+ expect(initialBox!.y).toBe(finalBox!.y);
+ });
+ });
+});
diff --git a/lerna.json b/lerna.json
index d0b7ae7dfaa..6083b8d84a2 100644
--- a/lerna.json
+++ b/lerna.json
@@ -3,5 +3,5 @@
"core",
"packages/*"
],
- "version": "8.8.1"
+ "version": "8.8.2"
}
\ No newline at end of file
diff --git a/packages/angular-server/CHANGELOG.md b/packages/angular-server/CHANGELOG.md
index 0319949bee2..dddc027b285 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.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25)
+
+**Note:** Version bump only for package @ionic/angular-server
+
+
+
+
+
## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06)
**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 a0d98c213e8..62fcb71de2b 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.1",
+ "version": "8.8.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/angular-server",
- "version": "8.8.1",
+ "version": "8.8.2",
"license": "MIT",
"dependencies": {
- "@ionic/core": "^8.8.1"
+ "@ionic/core": "^8.8.2"
},
"devDependencies": {
"@angular-eslint/eslint-plugin": "^16.0.0",
@@ -1031,9 +1031,9 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz",
- "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz",
+ "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
@@ -7309,9 +7309,9 @@
"dev": true
},
"@ionic/core": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz",
- "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz",
+ "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==",
"requires": {
"@stencil/core": "4.43.0",
"ionicons": "^8.0.13",
diff --git a/packages/angular-server/package.json b/packages/angular-server/package.json
index 60dbfed3c0e..b5e8617418a 100644
--- a/packages/angular-server/package.json
+++ b/packages/angular-server/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/angular-server",
- "version": "8.8.1",
+ "version": "8.8.2",
"description": "Angular SSR Module for Ionic",
"keywords": [
"ionic",
@@ -62,6 +62,6 @@
},
"prettier": "@ionic/prettier-config",
"dependencies": {
- "@ionic/core": "^8.8.1"
+ "@ionic/core": "^8.8.2"
}
}
diff --git a/packages/angular/CHANGELOG.md b/packages/angular/CHANGELOG.md
index 02753155a4c..bc2ff4925ce 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.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25)
+
+
+### Bug Fixes
+
+* **angular:** forward generic type parameter on ModalOptions and PopoverOptions ([#31022](https://github.com/ionic-team/ionic-framework/issues/31022)) ([cbfe7cc](https://github.com/ionic-team/ionic-framework/commit/cbfe7cce3be345eacbf9fe29e74438a927c16679)), closes [#31012](https://github.com/ionic-team/ionic-framework/issues/31012)
+* **checkbox:** re-evaluate label visibility when label is updated ([#30980](https://github.com/ionic-team/ionic-framework/issues/30980)) ([ce83407](https://github.com/ionic-team/ionic-framework/commit/ce83407e1debbe74f20d2d6dc2535a0ef3f974a0))
+
+
+
+
+
## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06)
diff --git a/packages/angular/common/src/types/overlay-options.ts b/packages/angular/common/src/types/overlay-options.ts
index 93ec10cb5f1..786db567d16 100644
--- a/packages/angular/common/src/types/overlay-options.ts
+++ b/packages/angular/common/src/types/overlay-options.ts
@@ -1,11 +1,15 @@
import type { Injector } from '@angular/core';
-import type { ModalOptions as CoreModalOptions, PopoverOptions as CorePopoverOptions } from '@ionic/core/components';
+import type {
+ ComponentRef,
+ ModalOptions as CoreModalOptions,
+ PopoverOptions as CorePopoverOptions,
+} from '@ionic/core/components';
/**
* Modal options with Angular-specific injector support.
* Extends @ionic/core ModalOptions with an optional injector property.
*/
-export type ModalOptions = CoreModalOptions & {
+export type ModalOptions
= CoreModalOptions & {
injector?: Injector;
};
@@ -13,6 +17,6 @@ export type ModalOptions = CoreModalOptions & {
* Popover options with Angular-specific injector support.
* Extends @ionic/core PopoverOptions with an optional injector property.
*/
-export type PopoverOptions = CorePopoverOptions & {
+export type PopoverOptions = CorePopoverOptions & {
injector?: Injector;
};
diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json
index a1410e67e30..bb125a358b8 100644
--- a/packages/angular/package-lock.json
+++ b/packages/angular/package-lock.json
@@ -1,15 +1,15 @@
{
"name": "@ionic/angular",
- "version": "8.8.1",
+ "version": "8.8.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ionic/angular",
- "version": "8.8.1",
+ "version": "8.8.2",
"license": "MIT",
"dependencies": {
- "@ionic/core": "^8.8.1",
+ "@ionic/core": "^8.8.2",
"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.1",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz",
- "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz",
+ "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
diff --git a/packages/angular/package.json b/packages/angular/package.json
index 2d4fe941d77..961439c7311 100644
--- a/packages/angular/package.json
+++ b/packages/angular/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/angular",
- "version": "8.8.1",
+ "version": "8.8.2",
"description": "Angular specific wrappers for @ionic/core",
"keywords": [
"ionic",
@@ -48,7 +48,7 @@
}
},
"dependencies": {
- "@ionic/core": "^8.8.1",
+ "@ionic/core": "^8.8.2",
"ionicons": "^8.0.13",
"jsonc-parser": "^3.0.0",
"tslib": "^2.3.0"
diff --git a/packages/angular/test/base/e2e/src/standalone/modal-options-generic.spec.ts b/packages/angular/test/base/e2e/src/standalone/modal-options-generic.spec.ts
new file mode 100644
index 00000000000..dfe5d84713f
--- /dev/null
+++ b/packages/angular/test/base/e2e/src/standalone/modal-options-generic.spec.ts
@@ -0,0 +1,24 @@
+import { test, expect } from '@playwright/test';
+
+test.describe('Modal Options: Generic Type Parameter', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/modal-options-generic');
+ });
+
+ test('should open modal created with ModalOptions', async ({ page }, testInfo) => {
+ testInfo.annotations.push({
+ type: 'issue',
+ description: 'https://github.com/ionic-team/ionic-framework/issues/31012',
+ });
+
+ await page.locator('ion-button#open-modal').click();
+
+ await expect(page.locator('ion-modal')).toBeVisible();
+
+ const greeting = page.locator('#greeting');
+ await expect(greeting).toHaveText('hello world');
+
+ await page.locator('#close-modal').click();
+ await expect(page.locator('ion-modal')).not.toBeVisible();
+ });
+});
diff --git a/packages/angular/test/base/e2e/src/standalone/value-accessors.spec.ts b/packages/angular/test/base/e2e/src/standalone/value-accessors.spec.ts
index 44a85cadf14..dc4c7b92d4d 100644
--- a/packages/angular/test/base/e2e/src/standalone/value-accessors.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/value-accessors.spec.ts
@@ -8,13 +8,19 @@ test.describe('Value Accessors', () => {
test('should update the form value', async ({ page }) => {
await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ checkbox: false }, null, 2));
- await expect(page.locator('ion-checkbox')).toHaveClass(/ion-pristine/);
+ await expect(page.getByRole('checkbox', { name: 'Static Checkbox Label' })).toHaveClass(/ion-pristine/);
- await page.locator('ion-checkbox').click();
+ await page.getByRole('checkbox', { name: 'Static Checkbox Label' }).click();
await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ checkbox: true }, null, 2));
- await expect(page.locator('ion-checkbox')).toHaveClass(/ion-dirty/);
- await expect(page.locator('ion-checkbox')).toHaveClass(/ion-valid/);
+ await expect(page.getByRole('checkbox', { name: 'Static Checkbox Label' })).toHaveClass(/ion-dirty/);
+ await expect(page.getByRole('checkbox', { name: 'Static Checkbox Label' })).toHaveClass(/ion-valid/);
+
+ await expect(page.getByRole('checkbox', { name: 'Static Checkbox Label' })).toBeVisible();
+ });
+
+ test('should display dynamically set label', async ({ page }) => {
+ await expect(page.getByRole('checkbox', { name: 'Dynamic Checkbox Label' })).toBeVisible();
});
});
diff --git a/packages/angular/test/base/src/app/lazy/app-lazy/app.module.ts b/packages/angular/test/base/src/app/lazy/app-lazy/app.module.ts
index ac0ebd501fb..caf27670d2d 100644
--- a/packages/angular/test/base/src/app/lazy/app-lazy/app.module.ts
+++ b/packages/angular/test/base/src/app/lazy/app-lazy/app.module.ts
@@ -28,7 +28,6 @@ import { AlertComponent } from '../alert/alert.component';
import { AccordionComponent } from '../accordion/accordion.component';
import { AccordionModalComponent } from '../accordion/accordion-modal/accordion-modal.component';
import { TabsBasicComponent } from '../tabs-basic/tabs-basic.component';
-import { TemplateFormComponent } from '../template-form/template-form.component';
@NgModule({
declarations: [
@@ -54,8 +53,7 @@ import { TemplateFormComponent } from '../template-form/template-form.component'
AlertComponent,
AccordionComponent,
AccordionModalComponent,
- TabsBasicComponent,
- TemplateFormComponent
+ TabsBasicComponent
],
imports: [
CommonModule,
diff --git a/packages/angular/test/base/src/app/lazy/app-lazy/app.routes.ts b/packages/angular/test/base/src/app/lazy/app-lazy/app.routes.ts
index 35a77b19cf1..84e06cef8b1 100644
--- a/packages/angular/test/base/src/app/lazy/app-lazy/app.routes.ts
+++ b/packages/angular/test/base/src/app/lazy/app-lazy/app.routes.ts
@@ -19,7 +19,6 @@ import { NavigationPage3Component } from '../navigation-page3/navigation-page3.c
import { AlertComponent } from '../alert/alert.component';
import { AccordionComponent } from '../accordion/accordion.component';
import { TabsBasicComponent } from '../tabs-basic/tabs-basic.component';
-import { TemplateFormComponent } from '../template-form/template-form.component';
export const routes: Routes = [
{
@@ -34,7 +33,7 @@ export const routes: Routes = [
{ path: 'textarea', loadChildren: () => import('../textarea/textarea.module').then(m => m.TextareaModule) },
{ path: 'searchbar', loadChildren: () => import('../searchbar/searchbar.module').then(m => m.SearchbarModule) },
{ path: 'form', component: FormComponent },
- { path: 'template-form', component: TemplateFormComponent },
+ { path: 'template-form', loadChildren: () => import('../template-form/template-form.module').then(m => m.TemplateFormModule) },
{ path: 'modals', component: ModalComponent },
{ path: 'modal-inline', loadChildren: () => import('../modal-inline').then(m => m.ModalInlineModule) },
{ path: 'modal-sheet-inline', loadChildren: () => import('../modal-sheet-inline').then(m => m.ModalSheetInlineModule) },
diff --git a/packages/angular/test/base/src/app/lazy/template-form/template-form-routing.module.ts b/packages/angular/test/base/src/app/lazy/template-form/template-form-routing.module.ts
new file mode 100644
index 00000000000..c9d57690c6d
--- /dev/null
+++ b/packages/angular/test/base/src/app/lazy/template-form/template-form-routing.module.ts
@@ -0,0 +1,16 @@
+import { NgModule } from "@angular/core";
+import { RouterModule } from "@angular/router";
+import { TemplateFormComponent } from "./template-form.component";
+
+@NgModule({
+ imports: [
+ RouterModule.forChild([
+ {
+ path: '',
+ component: TemplateFormComponent
+ }
+ ])
+ ],
+ exports: [RouterModule]
+})
+export class TemplateFormRoutingModule { }
diff --git a/packages/angular/test/base/src/app/lazy/template-form/template-form.component.html b/packages/angular/test/base/src/app/lazy/template-form/template-form.component.html
index 870f53872f2..e6203e183a0 100644
--- a/packages/angular/test/base/src/app/lazy/template-form/template-form.component.html
+++ b/packages/angular/test/base/src/app/lazy/template-form/template-form.component.html
@@ -109,6 +109,7 @@
[(ngModel)]="checkboxValue"
name="checkboxField"
required
+ requireTrue
#checkboxField="ngModel"
id="template-checkbox-test"
helper-text="You must agree to continue"
@@ -133,6 +134,7 @@
[(ngModel)]="toggleValue"
name="toggleField"
required
+ requireTrue
#toggleField="ngModel"
id="template-toggle-test"
helper-text="You must turn on to continue"
diff --git a/packages/angular/test/base/src/app/lazy/template-form/template-form.module.ts b/packages/angular/test/base/src/app/lazy/template-form/template-form.module.ts
new file mode 100644
index 00000000000..d25e9d41a17
--- /dev/null
+++ b/packages/angular/test/base/src/app/lazy/template-form/template-form.module.ts
@@ -0,0 +1,23 @@
+import { CommonModule } from "@angular/common";
+import { NgModule } from "@angular/core";
+import { FormsModule, ReactiveFormsModule } from "@angular/forms";
+import { IonicModule } from "@ionic/angular";
+
+import { TemplateFormRoutingModule } from "./template-form-routing.module";
+import { TemplateFormComponent } from "./template-form.component";
+import { ValidatorsModule } from "../validators/validators.module";
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ ReactiveFormsModule,
+ IonicModule,
+ TemplateFormRoutingModule,
+ ValidatorsModule
+ ],
+ declarations: [
+ TemplateFormComponent
+ ]
+})
+export class TemplateFormModule { }
diff --git a/packages/angular/test/base/src/app/lazy/validators/require-true.directive.ts b/packages/angular/test/base/src/app/lazy/validators/require-true.directive.ts
new file mode 100644
index 00000000000..73baf28ff6c
--- /dev/null
+++ b/packages/angular/test/base/src/app/lazy/validators/require-true.directive.ts
@@ -0,0 +1,19 @@
+import { Directive, forwardRef } from '@angular/core';
+import { NG_VALIDATORS, Validator, AbstractControl, ValidationErrors, Validators } from '@angular/forms';
+
+@Directive({
+ selector: '[requireTrue]',
+ providers: [
+ {
+ provide: NG_VALIDATORS,
+ useExisting: forwardRef(() => RequireTrueValidatorDirective),
+ multi: true,
+ },
+ ],
+ standalone: false,
+})
+export class RequireTrueValidatorDirective implements Validator {
+ validate(control: AbstractControl): ValidationErrors | null {
+ return Validators.requiredTrue(control);
+ }
+}
diff --git a/packages/angular/test/base/src/app/lazy/validators/validators.module.ts b/packages/angular/test/base/src/app/lazy/validators/validators.module.ts
new file mode 100644
index 00000000000..c135d3164b9
--- /dev/null
+++ b/packages/angular/test/base/src/app/lazy/validators/validators.module.ts
@@ -0,0 +1,20 @@
+import { CommonModule } from "@angular/common";
+import { NgModule } from "@angular/core";
+import { FormsModule, ReactiveFormsModule } from "@angular/forms";
+
+import { RequireTrueValidatorDirective } from "./require-true.directive";
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ ReactiveFormsModule
+ ],
+ declarations: [
+ RequireTrueValidatorDirective
+ ],
+ exports: [
+ RequireTrueValidatorDirective
+ ]
+})
+export class ValidatorsModule { }
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 3f9f82933f6..dd0ccbb4ac5 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
@@ -24,6 +24,7 @@ export const routes: Routes = [
},
{ path: 'programmatic-modal', loadComponent: () => import('../programmatic-modal/programmatic-modal.component').then(c => c.ProgrammaticModalComponent) },
{ path: 'modal-custom-injector', loadComponent: () => import('../modal-custom-injector/modal-custom-injector.component').then(c => c.ModalCustomInjectorComponent) },
+ { path: 'modal-options-generic', loadComponent: () => import('../modal-options-generic/modal-options-generic.component').then(c => c.ModalOptionsGenericComponent) },
{ path: 'popover-custom-injector', loadComponent: () => import('../popover-custom-injector/popover-custom-injector.component').then(c => c.PopoverCustomInjectorComponent) },
{ path: 'router-outlet', loadComponent: () => import('../router-outlet/router-outlet.component').then(c => c.RouterOutletComponent) },
{ path: 'back-button', loadComponent: () => import('../back-button/back-button.component').then(c => c.BackButtonComponent) },
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 641018e757c..00c3bf97452 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
@@ -125,6 +125,11 @@
Modal Custom Injector Test
+
+
+ Modal Options Generic Test
+
+
Overlay Controllers Test
diff --git a/packages/angular/test/base/src/app/standalone/modal-options-generic/modal-options-generic.component.ts b/packages/angular/test/base/src/app/standalone/modal-options-generic/modal-options-generic.component.ts
new file mode 100644
index 00000000000..04d630bf992
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/modal-options-generic/modal-options-generic.component.ts
@@ -0,0 +1,38 @@
+import { Component, inject } from '@angular/core';
+import { IonContent, IonHeader, IonTitle, IonToolbar, IonButton, ModalController } from '@ionic/angular/standalone';
+import type { ModalOptions } from '@ionic/angular/standalone';
+import { GenericModalComponent } from './modal/modal.component';
+
+@Component({
+ selector: 'app-modal-options-generic',
+ template: `
+
+
+ Modal Options Generic Test
+
+
+
+
+ Open Modal
+
+
+ `,
+ standalone: true,
+ imports: [IonContent, IonHeader, IonTitle, IonToolbar, IonButton],
+})
+export class ModalOptionsGenericComponent {
+ private modalController = inject(ModalController);
+
+ async openModal() {
+ // Regression: ModalOptions must accept a generic type parameter (#31012)
+ const opts: ModalOptions = {
+ component: GenericModalComponent,
+ componentProps: {
+ greeting: 'hello world',
+ },
+ };
+
+ const modal = await this.modalController.create(opts);
+ await modal.present();
+ }
+}
diff --git a/packages/angular/test/base/src/app/standalone/modal-options-generic/modal/modal.component.ts b/packages/angular/test/base/src/app/standalone/modal-options-generic/modal/modal.component.ts
new file mode 100644
index 00000000000..619adc64331
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/modal-options-generic/modal/modal.component.ts
@@ -0,0 +1,29 @@
+import { Component, Input } from '@angular/core';
+import { IonContent, IonHeader, IonTitle, IonToolbar, IonButton, IonButtons } from '@ionic/angular/standalone';
+
+@Component({
+ selector: 'app-generic-modal',
+ template: `
+
+
+ Generic Modal
+
+ Close
+
+
+
+
+ {{ greeting }}
+
+ `,
+ standalone: true,
+ imports: [IonContent, IonHeader, IonTitle, IonToolbar, IonButton, IonButtons],
+})
+export class GenericModalComponent {
+ @Input() greeting = '';
+ modal: HTMLIonModalElement | undefined;
+
+ dismiss() {
+ this.modal?.dismiss();
+ }
+}
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.html b/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.html
index c121dab37a7..0f264add5b8 100644
--- a/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.html
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.html
@@ -6,6 +6,7 @@ IonCheckbox Value Accessors
- Checkbox
+ Static Checkbox Label
+ {{dynamicLabel}}
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.ts b/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.ts
index d58672d9549..edf8d16e375 100644
--- a/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.ts
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.ts
@@ -15,6 +15,11 @@ import { ValueAccessorTestComponent } from "../value-accessor-test/value-accesso
]
})
export class CheckboxComponent {
+ dynamicLabel = '';
+
+ ngAfterViewInit(): void {
+ this.dynamicLabel = 'Dynamic Checkbox Label';
+ }
form = this.fb.group({
checkbox: [false, Validators.required],
diff --git a/packages/docs/CHANGELOG.md b/packages/docs/CHANGELOG.md
index 35714b39929..315eb465d5b 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.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25)
+
+**Note:** Version bump only for package @ionic/docs
+
+
+
+
+
## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06)
**Note:** Version bump only for package @ionic/docs
diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json
index c07ba774b3e..607f6df975e 100644
--- a/packages/docs/package-lock.json
+++ b/packages/docs/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@ionic/docs",
- "version": "8.8.1",
+ "version": "8.8.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/docs",
- "version": "8.8.1",
+ "version": "8.8.2",
"license": "MIT"
}
}
diff --git a/packages/docs/package.json b/packages/docs/package.json
index fdda438b6df..dbe18b7e194 100644
--- a/packages/docs/package.json
+++ b/packages/docs/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/docs",
- "version": "8.8.1",
+ "version": "8.8.2",
"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 a65882d9093..8e8656feffe 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.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25)
+
+**Note:** Version bump only for package @ionic/react-router
+
+
+
+
+
## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06)
**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 c2ddb561ace..726849edefc 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.1",
+ "version": "8.8.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/react-router",
- "version": "8.8.1",
+ "version": "8.8.2",
"license": "MIT",
"dependencies": {
- "@ionic/react": "^8.8.1",
+ "@ionic/react": "^8.8.2",
"tslib": "*"
},
"devDependencies": {
@@ -238,9 +238,9 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz",
- "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz",
+ "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
@@ -418,12 +418,12 @@
}
},
"node_modules/@ionic/react": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.1.tgz",
- "integrity": "sha512-KuDWk2E0HA8EA5ioDHxGF+OD/REG2PYb7SorMgVHWRWdPYMIL9PwNXrMBfWAd6PyYLLHd2fw7UoiuT2K8SbrzQ==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.2.tgz",
+ "integrity": "sha512-b2kMns556wocZ5JMoo5PZMRjNkgmQKOgxb5rIdrhgJMrLtkQ/smQi7dn3Sp9Hhy5tI3oY2ooyCMjABKe1PbKww==",
"license": "MIT",
"dependencies": {
- "@ionic/core": "8.8.1",
+ "@ionic/core": "8.8.2",
"ionicons": "^8.0.13",
"tslib": "*"
},
@@ -4178,9 +4178,9 @@
"dev": true
},
"@ionic/core": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz",
- "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz",
+ "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==",
"requires": {
"@stencil/core": "4.43.0",
"ionicons": "^8.0.13",
@@ -4284,11 +4284,11 @@
"requires": {}
},
"@ionic/react": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.1.tgz",
- "integrity": "sha512-KuDWk2E0HA8EA5ioDHxGF+OD/REG2PYb7SorMgVHWRWdPYMIL9PwNXrMBfWAd6PyYLLHd2fw7UoiuT2K8SbrzQ==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.2.tgz",
+ "integrity": "sha512-b2kMns556wocZ5JMoo5PZMRjNkgmQKOgxb5rIdrhgJMrLtkQ/smQi7dn3Sp9Hhy5tI3oY2ooyCMjABKe1PbKww==",
"requires": {
- "@ionic/core": "8.8.1",
+ "@ionic/core": "8.8.2",
"ionicons": "^8.0.13",
"tslib": "*"
}
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index 44b1d1b6c27..3029b19359b 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/react-router",
- "version": "8.8.1",
+ "version": "8.8.2",
"description": "React Router wrapper for @ionic/react",
"keywords": [
"ionic",
@@ -36,7 +36,7 @@
"dist/"
],
"dependencies": {
- "@ionic/react": "^8.8.1",
+ "@ionic/react": "^8.8.2",
"tslib": "*"
},
"peerDependencies": {
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index 4c07a6c59c4..612517174bb 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.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25)
+
+**Note:** Version bump only for package @ionic/react
+
+
+
+
+
## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06)
**Note:** Version bump only for package @ionic/react
diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json
index d9f5a8f7ddf..b13e5463be4 100644
--- a/packages/react/package-lock.json
+++ b/packages/react/package-lock.json
@@ -1,15 +1,15 @@
{
"name": "@ionic/react",
- "version": "8.8.1",
+ "version": "8.8.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ionic/react",
- "version": "8.8.1",
+ "version": "8.8.2",
"license": "MIT",
"dependencies": {
- "@ionic/core": "^8.8.1",
+ "@ionic/core": "^8.8.2",
"ionicons": "^8.0.13",
"tslib": "*"
},
@@ -736,9 +736,9 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz",
- "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz",
+ "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
diff --git a/packages/react/package.json b/packages/react/package.json
index 7df224a72c6..39b093e1296 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/react",
- "version": "8.8.1",
+ "version": "8.8.2",
"description": "React specific wrapper for @ionic/core",
"keywords": [
"ionic",
@@ -40,7 +40,7 @@
"css/"
],
"dependencies": {
- "@ionic/core": "^8.8.1",
+ "@ionic/core": "^8.8.2",
"ionicons": "^8.0.13",
"tslib": "*"
},
diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md
index 1880c2d642a..458b19a5feb 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.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25)
+
+**Note:** Version bump only for package @ionic/vue-router
+
+
+
+
+
## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06)
**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 346ba57dbe7..b67a23c33f1 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.1",
+ "version": "8.8.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/vue-router",
- "version": "8.8.1",
+ "version": "8.8.2",
"license": "MIT",
"dependencies": {
- "@ionic/vue": "^8.8.1"
+ "@ionic/vue": "^8.8.2"
},
"devDependencies": {
"@ionic/eslint-config": "^0.3.0",
@@ -673,9 +673,9 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz",
- "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz",
+ "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
@@ -868,12 +868,12 @@
}
},
"node_modules/@ionic/vue": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.1.tgz",
- "integrity": "sha512-tdNErYs6WrNiDJps1nRRY4UeyLffr2hbdkpawrMYFZxzzMd5yuExWsRAofrk5Uy6rSFObSZrfg7AgqyudDcJpQ==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.2.tgz",
+ "integrity": "sha512-egNOq0UfDrI9nq0OZcKGVstrqpajvOuAbplNF5izx0eeDCwU/3o7z+ehU7zzqnEBgK1DWW4v/TEdAxRUREMAcA==",
"license": "MIT",
"dependencies": {
- "@ionic/core": "8.8.1",
+ "@ionic/core": "8.8.2",
"@stencil/vue-output-target": "0.10.7",
"ionicons": "^8.0.13"
}
@@ -8044,9 +8044,9 @@
"dev": true
},
"@ionic/core": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz",
- "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz",
+ "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==",
"requires": {
"@stencil/core": "4.43.0",
"ionicons": "^8.0.13",
@@ -8159,11 +8159,11 @@
"requires": {}
},
"@ionic/vue": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.1.tgz",
- "integrity": "sha512-tdNErYs6WrNiDJps1nRRY4UeyLffr2hbdkpawrMYFZxzzMd5yuExWsRAofrk5Uy6rSFObSZrfg7AgqyudDcJpQ==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.2.tgz",
+ "integrity": "sha512-egNOq0UfDrI9nq0OZcKGVstrqpajvOuAbplNF5izx0eeDCwU/3o7z+ehU7zzqnEBgK1DWW4v/TEdAxRUREMAcA==",
"requires": {
- "@ionic/core": "8.8.1",
+ "@ionic/core": "8.8.2",
"@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 f6622207d7a..7c803694b8a 100644
--- a/packages/vue-router/package.json
+++ b/packages/vue-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/vue-router",
- "version": "8.8.1",
+ "version": "8.8.2",
"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.1"
+ "@ionic/vue": "^8.8.2"
},
"devDependencies": {
"@ionic/eslint-config": "^0.3.0",
diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md
index 8e28d889753..ea57c1bbacc 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.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25)
+
+**Note:** Version bump only for package @ionic/vue
+
+
+
+
+
## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06)
**Note:** Version bump only for package @ionic/vue
diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json
index 5a39b839293..754467be275 100644
--- a/packages/vue/package-lock.json
+++ b/packages/vue/package-lock.json
@@ -1,15 +1,15 @@
{
"name": "@ionic/vue",
- "version": "8.8.1",
+ "version": "8.8.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ionic/vue",
- "version": "8.8.1",
+ "version": "8.8.2",
"license": "MIT",
"dependencies": {
- "@ionic/core": "^8.8.1",
+ "@ionic/core": "^8.8.2",
"@stencil/vue-output-target": "0.10.7",
"ionicons": "^8.0.13"
},
@@ -222,9 +222,9 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz",
- "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz",
+ "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
diff --git a/packages/vue/package.json b/packages/vue/package.json
index 832e45caf65..a89093e6cc2 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/vue",
- "version": "8.8.1",
+ "version": "8.8.2",
"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.1",
+ "@ionic/core": "^8.8.2",
"@stencil/vue-output-target": "0.10.7",
"ionicons": "^8.0.13"
},