diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0fae4854106..84abbbee409 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.4](https://github.com/ionic-team/ionic-framework/compare/v8.8.3...v8.8.4) (2026-04-15)
+
+
+### Bug Fixes
+
+* **checkbox:** show labels after page navigation ([#31062](https://github.com/ionic-team/ionic-framework/issues/31062)) ([f4ac445](https://github.com/ionic-team/ionic-framework/commit/f4ac4459f8317bd5eeff7d4809f9cb0991c8efd9)), closes [#31052](https://github.com/ionic-team/ionic-framework/issues/31052)
+* **datetime:** multiple month selected and flakiness display ([#31053](https://github.com/ionic-team/ionic-framework/issues/31053)) ([308aef5](https://github.com/ionic-team/ionic-framework/commit/308aef569d8c6ebc3ad2186bca6969da8e4b2a8d))
+* **tab-button:** update dark palette focused background color ([#31050](https://github.com/ionic-team/ionic-framework/issues/31050)) ([dec46b5](https://github.com/ionic-team/ionic-framework/commit/dec46b5d317080dd5d97dc056f0d8e6d4c8c45ac))
+
+
+
+
+
## [8.8.3](https://github.com/ionic-team/ionic-framework/compare/v8.8.2...v8.8.3) (2026-04-01)
diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md
index 1fd2212efdf..ee45ffd629a 100644
--- a/core/CHANGELOG.md
+++ b/core/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.4](https://github.com/ionic-team/ionic-framework/compare/v8.8.3...v8.8.4) (2026-04-15)
+
+
+### Bug Fixes
+
+* **checkbox:** show labels after page navigation ([#31062](https://github.com/ionic-team/ionic-framework/issues/31062)) ([f4ac445](https://github.com/ionic-team/ionic-framework/commit/f4ac4459f8317bd5eeff7d4809f9cb0991c8efd9)), closes [#31052](https://github.com/ionic-team/ionic-framework/issues/31052)
+* **datetime:** multiple month selected and flakiness display ([#31053](https://github.com/ionic-team/ionic-framework/issues/31053)) ([308aef5](https://github.com/ionic-team/ionic-framework/commit/308aef569d8c6ebc3ad2186bca6969da8e4b2a8d))
+* **tab-button:** update dark palette focused background color ([#31050](https://github.com/ionic-team/ionic-framework/issues/31050)) ([dec46b5](https://github.com/ionic-team/ionic-framework/commit/dec46b5d317080dd5d97dc056f0d8e6d4c8c45ac))
+
+
+
+
+
## [8.8.3](https://github.com/ionic-team/ionic-framework/compare/v8.8.2...v8.8.3) (2026-04-01)
diff --git a/core/package-lock.json b/core/package-lock.json
index 01a06435345..007fed4a238 100644
--- a/core/package-lock.json
+++ b/core/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@ionic/core",
- "version": "8.8.3",
+ "version": "8.8.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ionic/core",
- "version": "8.8.3",
+ "version": "8.8.4",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
diff --git a/core/package.json b/core/package.json
index 47566399094..4321a90686f 100644
--- a/core/package.json
+++ b/core/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/core",
- "version": "8.8.3",
+ "version": "8.8.4",
"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 8a25b9200d5..99cb13c474a 100644
--- a/core/src/components/checkbox/checkbox.tsx
+++ b/core/src/components/checkbox/checkbox.tsx
@@ -151,44 +151,54 @@ export class Checkbox implements ComponentInterface {
connectedCallback() {
const { el } = this;
- // Watch for class changes to update validation state.
if (Build.isBrowser && typeof MutationObserver !== 'undefined') {
- this.validationObserver = new MutationObserver(() => {
- const newIsInvalid = checkInvalidState(el);
- if (this.isInvalid !== newIsInvalid) {
- this.isInvalid = newIsInvalid;
- /**
- * Screen readers tend to announce changes
- * to `aria-describedby` when the attribute
- * is changed during a blur event for a
- * native form control.
- * However, the announcement can be spotty
- * when using a non-native form control
- * and `forceUpdate()`.
- * This is due to `forceUpdate()` internally
- * rescheduling the DOM update to a lower
- * priority queue regardless if it's called
- * inside a Promise or not, thus causing
- * the screen reader to potentially miss the
- * change.
- * By using a State variable inside a Promise,
- * it guarantees a re-render immediately at
- * a higher priority.
- */
- Promise.resolve().then(() => {
- this.hintTextId = this.getHintTextId();
- });
+ this.validationObserver = new MutationObserver((mutations) => {
+ // Watch for label content changes
+ if (mutations.some((mutation) => mutation.type === 'characterData' || mutation.type === 'childList')) {
+ this.hasLabelContent = this.el.textContent !== '';
+ }
+ // Watch for class changes to update validation state.
+ if (mutations.some((mutation) => mutation.type === 'attributes' && mutation.target === el)) {
+ const newIsInvalid = checkInvalidState(el);
+ if (this.isInvalid !== newIsInvalid) {
+ this.isInvalid = newIsInvalid;
+ /**
+ * Screen readers tend to announce changes
+ * to `aria-describedby` when the attribute
+ * is changed during a blur event for a
+ * native form control.
+ * However, the announcement can be spotty
+ * when using a non-native form control
+ * and `forceUpdate()`.
+ * This is due to `forceUpdate()` internally
+ * rescheduling the DOM update to a lower
+ * priority queue regardless if it's called
+ * inside a Promise or not, thus causing
+ * the screen reader to potentially miss the
+ * change.
+ * By using a State variable inside a Promise,
+ * it guarantees a re-render immediately at
+ * a higher priority.
+ */
+ Promise.resolve().then(() => {
+ this.hintTextId = this.getHintTextId();
+ });
+ }
}
});
this.validationObserver.observe(el, {
attributes: true,
attributeFilter: ['class'],
+ characterData: true,
+ childList: true,
+ subtree: true,
});
}
// Always set initial state
this.isInvalid = checkInvalidState(el);
+ this.hasLabelContent = this.el.textContent !== '';
}
componentWillLoad() {
@@ -267,10 +277,6 @@ 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;
@@ -387,7 +393,7 @@ export class Checkbox implements ComponentInterface {
id={this.inputLabelId}
onClick={this.onDivLabelClick}
>
-
+
{this.renderHintText()}
diff --git a/core/src/components/datetime/datetime.tsx b/core/src/components/datetime/datetime.tsx
index c591972fd8d..e73cd55e0b8 100644
--- a/core/src/components/datetime/datetime.tsx
+++ b/core/src/components/datetime/datetime.tsx
@@ -1086,6 +1086,9 @@ export class Datetime implements ComponentInterface {
connectedCallback() {
this.clearFocusVisible = startFocusVisible(this.el).destroy;
+ this.loadTimeout = setTimeout(() => {
+ this.ensureReadyIfVisible();
+ }, 100);
}
disconnectedCallback() {
@@ -1093,9 +1096,7 @@ export class Datetime implements ComponentInterface {
this.clearFocusVisible();
this.clearFocusVisible = undefined;
}
- if (this.loadTimeout) {
- clearTimeout(this.loadTimeout);
- }
+ this.loadTimeoutCleanup();
}
/**
@@ -1146,6 +1147,13 @@ export class Datetime implements ComponentInterface {
});
};
+ private loadTimeoutCleanup = () => {
+ if (this.loadTimeout) {
+ clearTimeout(this.loadTimeout);
+ this.loadTimeout = undefined;
+ }
+ };
+
componentDidLoad() {
const { el, intersectionTrackerRef } = this;
@@ -1193,7 +1201,10 @@ export class Datetime implements ComponentInterface {
* we still initialize listeners and mark the component as ready.
*
* We schedule this after everything has had a chance to run.
+ *
+ * We also clean up the load timeout to ensure that we don't have multiple timeouts running.
*/
+ this.loadTimeoutCleanup();
this.loadTimeout = setTimeout(() => {
this.ensureReadyIfVisible();
}, 100);
diff --git a/core/src/components/datetime/test/basic/datetime.e2e.ts b/core/src/components/datetime/test/basic/datetime.e2e.ts
index 6104d0014cf..4865e243092 100644
--- a/core/src/components/datetime/test/basic/datetime.e2e.ts
+++ b/core/src/components/datetime/test/basic/datetime.e2e.ts
@@ -349,6 +349,43 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
});
});
+/**
+ * This behavior does not differ across
+ * modes/directions.
+ */
+
+configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
+ test.describe(title('datetime: month picker selection'), () => {
+ test('datetime: month picker selection', async ({ page }) => {
+ await page.setContent(
+ `
+
+ `,
+ config
+ );
+
+ await page.locator('.datetime-ready').waitFor();
+
+ const nextMonthButton = page.locator('ion-datetime .calendar-next-prev ion-button').nth(1);
+ const monthYearButton = page.locator('ion-datetime .calendar-month-year');
+
+ await expect(monthYearButton).toHaveText(/May 2022/);
+
+ await nextMonthButton.click();
+ await expect(monthYearButton).toHaveText(/June 2022/);
+
+ await nextMonthButton.click();
+ await expect(monthYearButton).toHaveText(/July 2022/);
+
+ await monthYearButton.click();
+ await page.waitForChanges();
+
+ const selectedMonthOptions = page.locator('.month-column ion-picker-column-option.option-active');
+ await expect(selectedMonthOptions).toHaveCount(1);
+ });
+ });
+});
+
/**
* This behavior does not differ across
* modes/directions.
@@ -403,7 +440,10 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
*/
configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
test.describe(title('datetime: IO fallback'), () => {
- test('should become ready even if IntersectionObserver never reports visible', async ({ page }, testInfo) => {
+ test('should become ready even if IntersectionObserver never reports visible', async ({ page, skip }, testInfo) => {
+ // TODO(FW-7284): Re-enable on WebKit after determining why it fails
+ skip.browser('webkit', 'Wheel is not available in WebKit');
+
testInfo.annotations.push({
type: 'issue',
description: 'https://github.com/ionic-team/ionic-framework/issues/30706',
diff --git a/core/src/components/picker-column/picker-column.tsx b/core/src/components/picker-column/picker-column.tsx
index 905ba8cf81e..53d6ca90d17 100644
--- a/core/src/components/picker-column/picker-column.tsx
+++ b/core/src/components/picker-column/picker-column.tsx
@@ -1,7 +1,7 @@
import type { ComponentInterface, EventEmitter } from '@stencil/core';
import { Component, Element, Event, Host, Method, Prop, State, Watch, h } from '@stencil/core';
import { doc } from '@utils/browser';
-import { getElementRoot, raf } from '@utils/helpers';
+import { raf } from '@utils/helpers';
import { hapticSelectionChanged, hapticSelectionEnd, hapticSelectionStart } from '@utils/native/haptic';
import { isPlatform } from '@utils/platform';
import { createColorClasses } from '@utils/theme';
@@ -122,9 +122,7 @@ export class PickerColumn implements ComponentInterface {
* Because this initial call to scrollActiveItemIntoView has to fire before
* the scroll listener is set up, we need to manage the active class manually.
*/
- const oldActive = getElementRoot(el).querySelector(
- `.${PICKER_ITEM_ACTIVE_CLASS}`
- );
+ const oldActive = el.querySelector(`.${PICKER_ITEM_ACTIVE_CLASS}`);
if (oldActive) {
this.setPickerItemActiveState(oldActive, false);
}
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts b/core/src/components/tab-button/test/states/tab-button.e2e.ts
index bd10cad844b..5af2a6f660b 100644
--- a/core/src/components/tab-button/test/states/tab-button.e2e.ts
+++ b/core/src/components/tab-button/test/states/tab-button.e2e.ts
@@ -80,3 +80,25 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, screenshot, c
});
});
});
+
+configs({ palettes: ['dark'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
+ test.describe(title('tab-button: states in dark palette'), () => {
+ test.describe('focus', () => {
+ test('should render correct focus state in dark palette', async ({ page }) => {
+ await page.setContent(
+ `
+
+
+ Favorites
+
+
+ `,
+ config
+ );
+
+ const tabBar = page.locator('ion-tab-bar');
+ await expect(tabBar).toHaveScreenshot(screenshot('tab-button-focus'));
+ });
+ });
+ });
+});
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Chrome-linux.png b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Chrome-linux.png
new file mode 100644
index 00000000000..14d96bb1365
Binary files /dev/null and b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Firefox-linux.png b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Firefox-linux.png
new file mode 100644
index 00000000000..841928b47fa
Binary files /dev/null and b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Safari-linux.png b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Safari-linux.png
new file mode 100644
index 00000000000..86b46f9a31f
Binary files /dev/null and b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Safari-linux.png differ
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Chrome-linux.png b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Chrome-linux.png
new file mode 100644
index 00000000000..e12f984796d
Binary files /dev/null and b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Firefox-linux.png b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Firefox-linux.png
new file mode 100644
index 00000000000..b0f8f6eb547
Binary files /dev/null and b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Safari-linux.png b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Safari-linux.png
new file mode 100644
index 00000000000..db7b8937ec0
Binary files /dev/null and b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Safari-linux.png differ
diff --git a/core/src/css/palettes/dark.scss b/core/src/css/palettes/dark.scss
index 0c5ef08dd93..18179f2e2e8 100644
--- a/core/src/css/palettes/dark.scss
+++ b/core/src/css/palettes/dark.scss
@@ -126,6 +126,7 @@ $colors: (
--ion-text-color-step-900: #1a1a1a;
--ion-text-color-step-950: #0d0d0d;
--ion-item-background: #000000;
+ --ion-tab-bar-background-focused: #252525;
--ion-card-background: #1c1c1d;
}
@@ -183,6 +184,7 @@ $colors: (
--ion-item-background: #1e1e1e;
--ion-toolbar-background: #1f1f1f;
--ion-tab-bar-background: #1f1f1f;
+ --ion-tab-bar-background-focused: #353535;
--ion-card-background: #1e1e1e;
}
}
diff --git a/core/src/css/palettes/high-contrast-dark.scss b/core/src/css/palettes/high-contrast-dark.scss
index e0f3b8aeb57..c5533a12405 100644
--- a/core/src/css/palettes/high-contrast-dark.scss
+++ b/core/src/css/palettes/high-contrast-dark.scss
@@ -119,6 +119,7 @@ $lightest-text-color: $text-color;
--ion-text-color-rgb: #{color-to-rgb-list($text-color)};
--ion-item-background: #000000;
--ion-card-background: #1c1c1d;
+ --ion-tab-bar-background-focused: #252525;
/// Only the item borders should increase in contrast
/// Borders for elements like toolbars should remain the same
@@ -185,6 +186,7 @@ $lightest-text-color: $text-color;
--ion-item-background: #1e1e1e;
--ion-toolbar-background: #1f1f1f;
--ion-tab-bar-background: #1f1f1f;
+ --ion-tab-bar-background-focused: #353535;
--ion-card-background: #1e1e1e;
/// Only the item borders should increase in contrast
diff --git a/lerna.json b/lerna.json
index e79ac7702c2..ba3e4cc2dcf 100644
--- a/lerna.json
+++ b/lerna.json
@@ -3,5 +3,5 @@
"core",
"packages/*"
],
- "version": "8.8.3"
+ "version": "8.8.4"
}
\ No newline at end of file
diff --git a/packages/angular-server/CHANGELOG.md b/packages/angular-server/CHANGELOG.md
index 68ecf941df3..e92a2268e2e 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.4](https://github.com/ionic-team/ionic-framework/compare/v8.8.3...v8.8.4) (2026-04-15)
+
+**Note:** Version bump only for package @ionic/angular-server
+
+
+
+
+
## [8.8.3](https://github.com/ionic-team/ionic-framework/compare/v8.8.2...v8.8.3) (2026-04-01)
**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 eaa09666b5b..798964509f8 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.3",
+ "version": "8.8.4",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/angular-server",
- "version": "8.8.3",
+ "version": "8.8.4",
"license": "MIT",
"dependencies": {
- "@ionic/core": "^8.8.3"
+ "@ionic/core": "^8.8.4"
},
"devDependencies": {
"@angular-eslint/eslint-plugin": "^16.0.0",
@@ -1031,9 +1031,9 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.8.3",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.3.tgz",
- "integrity": "sha512-qvl+bRgZRvAJ35eW2iW0Vlo11T/EQsPazMU6z45QxJvcLukGJ59MwubjDTx6dPKteful4/FBzVt9etCvcNp8Gg==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.4.tgz",
+ "integrity": "sha512-RWts/72xtNNJDZQtntMRxB68KDctq76INV5OmLWWc0rlgcxOlNQDNH+lTBH7kV9vQ78JDVGSgi10ax3oQ3dIIQ==",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
@@ -7309,9 +7309,9 @@
"dev": true
},
"@ionic/core": {
- "version": "8.8.3",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.3.tgz",
- "integrity": "sha512-qvl+bRgZRvAJ35eW2iW0Vlo11T/EQsPazMU6z45QxJvcLukGJ59MwubjDTx6dPKteful4/FBzVt9etCvcNp8Gg==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.4.tgz",
+ "integrity": "sha512-RWts/72xtNNJDZQtntMRxB68KDctq76INV5OmLWWc0rlgcxOlNQDNH+lTBH7kV9vQ78JDVGSgi10ax3oQ3dIIQ==",
"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 6e7325b33e3..2af2f292161 100644
--- a/packages/angular-server/package.json
+++ b/packages/angular-server/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/angular-server",
- "version": "8.8.3",
+ "version": "8.8.4",
"description": "Angular SSR Module for Ionic",
"keywords": [
"ionic",
@@ -62,6 +62,6 @@
},
"prettier": "@ionic/prettier-config",
"dependencies": {
- "@ionic/core": "^8.8.3"
+ "@ionic/core": "^8.8.4"
}
}
diff --git a/packages/angular/CHANGELOG.md b/packages/angular/CHANGELOG.md
index 66721281c95..0c73bb9366f 100644
--- a/packages/angular/CHANGELOG.md
+++ b/packages/angular/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.4](https://github.com/ionic-team/ionic-framework/compare/v8.8.3...v8.8.4) (2026-04-15)
+
+**Note:** Version bump only for package @ionic/angular
+
+
+
+
+
## [8.8.3](https://github.com/ionic-team/ionic-framework/compare/v8.8.2...v8.8.3) (2026-04-01)
**Note:** Version bump only for package @ionic/angular
diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json
index 90b33a3e6b3..1178f97c7da 100644
--- a/packages/angular/package-lock.json
+++ b/packages/angular/package-lock.json
@@ -1,15 +1,15 @@
{
"name": "@ionic/angular",
- "version": "8.8.3",
+ "version": "8.8.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ionic/angular",
- "version": "8.8.3",
+ "version": "8.8.4",
"license": "MIT",
"dependencies": {
- "@ionic/core": "^8.8.3",
+ "@ionic/core": "^8.8.4",
"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.3",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.3.tgz",
- "integrity": "sha512-qvl+bRgZRvAJ35eW2iW0Vlo11T/EQsPazMU6z45QxJvcLukGJ59MwubjDTx6dPKteful4/FBzVt9etCvcNp8Gg==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.4.tgz",
+ "integrity": "sha512-RWts/72xtNNJDZQtntMRxB68KDctq76INV5OmLWWc0rlgcxOlNQDNH+lTBH7kV9vQ78JDVGSgi10ax3oQ3dIIQ==",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
diff --git a/packages/angular/package.json b/packages/angular/package.json
index 2211afd24b3..3785f542d0a 100644
--- a/packages/angular/package.json
+++ b/packages/angular/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/angular",
- "version": "8.8.3",
+ "version": "8.8.4",
"description": "Angular specific wrappers for @ionic/core",
"keywords": [
"ionic",
@@ -48,7 +48,7 @@
}
},
"dependencies": {
- "@ionic/core": "^8.8.3",
+ "@ionic/core": "^8.8.4",
"ionicons": "^8.0.13",
"jsonc-parser": "^3.0.0",
"tslib": "^2.3.0"
diff --git a/packages/docs/CHANGELOG.md b/packages/docs/CHANGELOG.md
index 588ab851d3d..2a483528e35 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.4](https://github.com/ionic-team/ionic-framework/compare/v8.8.3...v8.8.4) (2026-04-15)
+
+**Note:** Version bump only for package @ionic/docs
+
+
+
+
+
## [8.8.3](https://github.com/ionic-team/ionic-framework/compare/v8.8.2...v8.8.3) (2026-04-01)
**Note:** Version bump only for package @ionic/docs
diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json
index 6e6bd26dc7a..5110fe60ab6 100644
--- a/packages/docs/package-lock.json
+++ b/packages/docs/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@ionic/docs",
- "version": "8.8.3",
+ "version": "8.8.4",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/docs",
- "version": "8.8.3",
+ "version": "8.8.4",
"license": "MIT"
}
}
diff --git a/packages/docs/package.json b/packages/docs/package.json
index 91c1147613d..71eabacc599 100644
--- a/packages/docs/package.json
+++ b/packages/docs/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/docs",
- "version": "8.8.3",
+ "version": "8.8.4",
"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 d7185dd9b1d..4354d774ac4 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.4](https://github.com/ionic-team/ionic-framework/compare/v8.8.3...v8.8.4) (2026-04-15)
+
+**Note:** Version bump only for package @ionic/react-router
+
+
+
+
+
## [8.8.3](https://github.com/ionic-team/ionic-framework/compare/v8.8.2...v8.8.3) (2026-04-01)
**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 dc82458d0e3..37b215ff62c 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.3",
+ "version": "8.8.4",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/react-router",
- "version": "8.8.3",
+ "version": "8.8.4",
"license": "MIT",
"dependencies": {
- "@ionic/react": "^8.8.3",
+ "@ionic/react": "^8.8.4",
"tslib": "*"
},
"devDependencies": {
@@ -238,9 +238,9 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.8.3",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.3.tgz",
- "integrity": "sha512-qvl+bRgZRvAJ35eW2iW0Vlo11T/EQsPazMU6z45QxJvcLukGJ59MwubjDTx6dPKteful4/FBzVt9etCvcNp8Gg==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.4.tgz",
+ "integrity": "sha512-RWts/72xtNNJDZQtntMRxB68KDctq76INV5OmLWWc0rlgcxOlNQDNH+lTBH7kV9vQ78JDVGSgi10ax3oQ3dIIQ==",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
@@ -418,12 +418,12 @@
}
},
"node_modules/@ionic/react": {
- "version": "8.8.3",
- "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.3.tgz",
- "integrity": "sha512-mqUftIoYROKSiqD9rOyF0XwR1/5dsGpAW/JD5bcPJqbNKx2bopb0/uiddeQ3Vbhi37tz5nsxzX0NB1+3cdx7hQ==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.4.tgz",
+ "integrity": "sha512-qlQNV6sRVIsq+vs33COKfzvMbNKRpPBGWYATv6vsNWmX7OhOm9tk7QSZl91LECvZRHMIe6Sqn9xMB+Aw/IBRfA==",
"license": "MIT",
"dependencies": {
- "@ionic/core": "8.8.3",
+ "@ionic/core": "8.8.4",
"ionicons": "^8.0.13",
"tslib": "*"
},
@@ -4178,9 +4178,9 @@
"dev": true
},
"@ionic/core": {
- "version": "8.8.3",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.3.tgz",
- "integrity": "sha512-qvl+bRgZRvAJ35eW2iW0Vlo11T/EQsPazMU6z45QxJvcLukGJ59MwubjDTx6dPKteful4/FBzVt9etCvcNp8Gg==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.4.tgz",
+ "integrity": "sha512-RWts/72xtNNJDZQtntMRxB68KDctq76INV5OmLWWc0rlgcxOlNQDNH+lTBH7kV9vQ78JDVGSgi10ax3oQ3dIIQ==",
"requires": {
"@stencil/core": "4.43.0",
"ionicons": "^8.0.13",
@@ -4284,11 +4284,11 @@
"requires": {}
},
"@ionic/react": {
- "version": "8.8.3",
- "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.3.tgz",
- "integrity": "sha512-mqUftIoYROKSiqD9rOyF0XwR1/5dsGpAW/JD5bcPJqbNKx2bopb0/uiddeQ3Vbhi37tz5nsxzX0NB1+3cdx7hQ==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.4.tgz",
+ "integrity": "sha512-qlQNV6sRVIsq+vs33COKfzvMbNKRpPBGWYATv6vsNWmX7OhOm9tk7QSZl91LECvZRHMIe6Sqn9xMB+Aw/IBRfA==",
"requires": {
- "@ionic/core": "8.8.3",
+ "@ionic/core": "8.8.4",
"ionicons": "^8.0.13",
"tslib": "*"
}
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index e77fef9f281..ed337f5b494 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/react-router",
- "version": "8.8.3",
+ "version": "8.8.4",
"description": "React Router wrapper for @ionic/react",
"keywords": [
"ionic",
@@ -36,7 +36,7 @@
"dist/"
],
"dependencies": {
- "@ionic/react": "^8.8.3",
+ "@ionic/react": "^8.8.4",
"tslib": "*"
},
"peerDependencies": {
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index 0f8400c8511..dc8997adad5 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.4](https://github.com/ionic-team/ionic-framework/compare/v8.8.3...v8.8.4) (2026-04-15)
+
+**Note:** Version bump only for package @ionic/react
+
+
+
+
+
## [8.8.3](https://github.com/ionic-team/ionic-framework/compare/v8.8.2...v8.8.3) (2026-04-01)
**Note:** Version bump only for package @ionic/react
diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json
index 3395ac5f3dc..487b165f5b4 100644
--- a/packages/react/package-lock.json
+++ b/packages/react/package-lock.json
@@ -1,15 +1,15 @@
{
"name": "@ionic/react",
- "version": "8.8.3",
+ "version": "8.8.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ionic/react",
- "version": "8.8.3",
+ "version": "8.8.4",
"license": "MIT",
"dependencies": {
- "@ionic/core": "^8.8.3",
+ "@ionic/core": "^8.8.4",
"ionicons": "^8.0.13",
"tslib": "*"
},
@@ -736,9 +736,9 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.8.3",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.3.tgz",
- "integrity": "sha512-qvl+bRgZRvAJ35eW2iW0Vlo11T/EQsPazMU6z45QxJvcLukGJ59MwubjDTx6dPKteful4/FBzVt9etCvcNp8Gg==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.4.tgz",
+ "integrity": "sha512-RWts/72xtNNJDZQtntMRxB68KDctq76INV5OmLWWc0rlgcxOlNQDNH+lTBH7kV9vQ78JDVGSgi10ax3oQ3dIIQ==",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
diff --git a/packages/react/package.json b/packages/react/package.json
index a08514a5476..d7253110c7e 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/react",
- "version": "8.8.3",
+ "version": "8.8.4",
"description": "React specific wrapper for @ionic/core",
"keywords": [
"ionic",
@@ -40,7 +40,7 @@
"css/"
],
"dependencies": {
- "@ionic/core": "^8.8.3",
+ "@ionic/core": "^8.8.4",
"ionicons": "^8.0.13",
"tslib": "*"
},
diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md
index 00d1ab61982..ea8af11eccb 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.4](https://github.com/ionic-team/ionic-framework/compare/v8.8.3...v8.8.4) (2026-04-15)
+
+**Note:** Version bump only for package @ionic/vue-router
+
+
+
+
+
## [8.8.3](https://github.com/ionic-team/ionic-framework/compare/v8.8.2...v8.8.3) (2026-04-01)
**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 9c7b1d57853..0dffc9612f6 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.3",
+ "version": "8.8.4",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/vue-router",
- "version": "8.8.3",
+ "version": "8.8.4",
"license": "MIT",
"dependencies": {
- "@ionic/vue": "^8.8.3"
+ "@ionic/vue": "^8.8.4"
},
"devDependencies": {
"@ionic/eslint-config": "^0.3.0",
@@ -673,9 +673,9 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.8.3",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.3.tgz",
- "integrity": "sha512-qvl+bRgZRvAJ35eW2iW0Vlo11T/EQsPazMU6z45QxJvcLukGJ59MwubjDTx6dPKteful4/FBzVt9etCvcNp8Gg==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.4.tgz",
+ "integrity": "sha512-RWts/72xtNNJDZQtntMRxB68KDctq76INV5OmLWWc0rlgcxOlNQDNH+lTBH7kV9vQ78JDVGSgi10ax3oQ3dIIQ==",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
@@ -868,12 +868,12 @@
}
},
"node_modules/@ionic/vue": {
- "version": "8.8.3",
- "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.3.tgz",
- "integrity": "sha512-6bwi2RodoxECt2Ef6C6km4ZkuH4TweyhF800/XpunOKjM2Iya3pD1j230KSRd35cJpAenGc1uplLdIZhAyMsWg==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.4.tgz",
+ "integrity": "sha512-FZftTMul3zw7vjZHAxznheSu0sy0h6GSLtKNeU5U4XtziOaMYZ9dLP5TWsBjRVahAEtqn+n6493fYW4EPE+dvw==",
"license": "MIT",
"dependencies": {
- "@ionic/core": "8.8.3",
+ "@ionic/core": "8.8.4",
"@stencil/vue-output-target": "0.10.7",
"ionicons": "^8.0.13"
}
@@ -8044,9 +8044,9 @@
"dev": true
},
"@ionic/core": {
- "version": "8.8.3",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.3.tgz",
- "integrity": "sha512-qvl+bRgZRvAJ35eW2iW0Vlo11T/EQsPazMU6z45QxJvcLukGJ59MwubjDTx6dPKteful4/FBzVt9etCvcNp8Gg==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.4.tgz",
+ "integrity": "sha512-RWts/72xtNNJDZQtntMRxB68KDctq76INV5OmLWWc0rlgcxOlNQDNH+lTBH7kV9vQ78JDVGSgi10ax3oQ3dIIQ==",
"requires": {
"@stencil/core": "4.43.0",
"ionicons": "^8.0.13",
@@ -8159,11 +8159,11 @@
"requires": {}
},
"@ionic/vue": {
- "version": "8.8.3",
- "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.3.tgz",
- "integrity": "sha512-6bwi2RodoxECt2Ef6C6km4ZkuH4TweyhF800/XpunOKjM2Iya3pD1j230KSRd35cJpAenGc1uplLdIZhAyMsWg==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.4.tgz",
+ "integrity": "sha512-FZftTMul3zw7vjZHAxznheSu0sy0h6GSLtKNeU5U4XtziOaMYZ9dLP5TWsBjRVahAEtqn+n6493fYW4EPE+dvw==",
"requires": {
- "@ionic/core": "8.8.3",
+ "@ionic/core": "8.8.4",
"@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 96fbba44ad2..b1ae2a0db94 100644
--- a/packages/vue-router/package.json
+++ b/packages/vue-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/vue-router",
- "version": "8.8.3",
+ "version": "8.8.4",
"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.3"
+ "@ionic/vue": "^8.8.4"
},
"devDependencies": {
"@ionic/eslint-config": "^0.3.0",
diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md
index 425c7e49817..30c774c6c81 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.4](https://github.com/ionic-team/ionic-framework/compare/v8.8.3...v8.8.4) (2026-04-15)
+
+**Note:** Version bump only for package @ionic/vue
+
+
+
+
+
## [8.8.3](https://github.com/ionic-team/ionic-framework/compare/v8.8.2...v8.8.3) (2026-04-01)
**Note:** Version bump only for package @ionic/vue
diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json
index a5c15bc6024..b21f4c5a4ba 100644
--- a/packages/vue/package-lock.json
+++ b/packages/vue/package-lock.json
@@ -1,15 +1,15 @@
{
"name": "@ionic/vue",
- "version": "8.8.3",
+ "version": "8.8.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ionic/vue",
- "version": "8.8.3",
+ "version": "8.8.4",
"license": "MIT",
"dependencies": {
- "@ionic/core": "^8.8.3",
+ "@ionic/core": "^8.8.4",
"@stencil/vue-output-target": "0.10.7",
"ionicons": "^8.0.13"
},
@@ -222,9 +222,9 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.8.3",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.3.tgz",
- "integrity": "sha512-qvl+bRgZRvAJ35eW2iW0Vlo11T/EQsPazMU6z45QxJvcLukGJ59MwubjDTx6dPKteful4/FBzVt9etCvcNp8Gg==",
+ "version": "8.8.4",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.4.tgz",
+ "integrity": "sha512-RWts/72xtNNJDZQtntMRxB68KDctq76INV5OmLWWc0rlgcxOlNQDNH+lTBH7kV9vQ78JDVGSgi10ax3oQ3dIIQ==",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.43.0",
diff --git a/packages/vue/package.json b/packages/vue/package.json
index 372305c4b78..277719e7c3b 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/vue",
- "version": "8.8.3",
+ "version": "8.8.4",
"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.3",
+ "@ionic/core": "^8.8.4",
"@stencil/vue-output-target": "0.10.7",
"ionicons": "^8.0.13"
},