diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 0e27f252903..f17a5f9a264 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -15,7 +15,7 @@ jobs: security-events: write steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - uses: github/codeql-action/init@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6 + - uses: github/codeql-action/init@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4.37.7 with: languages: javascript - - uses: github/codeql-action/analyze@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6 + - uses: github/codeql-action/analyze@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4.37.7 diff --git a/CHANGELOG.md b/CHANGELOG.md index fcd32072979..e8177e09f91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.19](https://github.com/ionic-team/ionic-framework/compare/v8.8.18...v8.8.19) (2026-08-19) + +### Bug Fixes + +* **gesture:** remove leaked optsTest listener from passive support check ([#31363](https://github.com/ionic-team/ionic-framework/issues/31363)) ([c689000](https://github.com/ionic-team/ionic-framework/commit/c6890002df0a1ec5ac030626b1694e87022365c0)), closes [#30539](https://github.com/ionic-team/ionic-framework/issues/30539) +* **menu:** respect ion-app dir attribute for menu animation side ([#31246](https://github.com/ionic-team/ionic-framework/issues/31246)) ([2618a6f](https://github.com/ionic-team/ionic-framework/commit/2618a6f7bd793ad09e38e4868d753189610eff9d)), closes [#30226](https://github.com/ionic-team/ionic-framework/issues/30226) +* **range:** update knob positions when dualKnobs changes ([#31365](https://github.com/ionic-team/ionic-framework/issues/31365)) ([7d64d62](https://github.com/ionic-team/ionic-framework/commit/7d64d62a31d59078560575ad9c4fc67a8e49e524)), closes [#31026](https://github.com/ionic-team/ionic-framework/issues/31026) + + ## [8.8.18](https://github.com/ionic-team/ionic-framework/compare/v8.8.17...v8.8.18) (2026-08-12) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 84ed9ee1068..ab4393bfa1f 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.19](https://github.com/ionic-team/ionic-framework/compare/v8.8.18...v8.8.19) (2026-08-19) + +### Bug Fixes + +* **gesture:** remove leaked optsTest listener from passive support check ([#31363](https://github.com/ionic-team/ionic-framework/issues/31363)) ([c689000](https://github.com/ionic-team/ionic-framework/commit/c6890002df0a1ec5ac030626b1694e87022365c0)), closes [#30539](https://github.com/ionic-team/ionic-framework/issues/30539) +* **menu:** respect ion-app dir attribute for menu animation side ([#31246](https://github.com/ionic-team/ionic-framework/issues/31246)) ([2618a6f](https://github.com/ionic-team/ionic-framework/commit/2618a6f7bd793ad09e38e4868d753189610eff9d)), closes [#30226](https://github.com/ionic-team/ionic-framework/issues/30226) +* **range:** update knob positions when dualKnobs changes ([#31365](https://github.com/ionic-team/ionic-framework/issues/31365)) ([7d64d62](https://github.com/ionic-team/ionic-framework/commit/7d64d62a31d59078560575ad9c4fc67a8e49e524)), closes [#31026](https://github.com/ionic-team/ionic-framework/issues/31026) + + ## [8.8.18](https://github.com/ionic-team/ionic-framework/compare/v8.8.17...v8.8.18) (2026-08-12) diff --git a/core/package-lock.json b/core/package-lock.json index 2b219a34b3f..71ea390bcdc 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/core", - "version": "8.8.18", + "version": "8.8.19", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/core", - "version": "8.8.18", + "version": "8.8.19", "license": "MIT", "dependencies": { "@stencil/core": "^4.43.5", diff --git a/core/package.json b/core/package.json index f91bf79a1df..4adbc62b276 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/core", - "version": "8.8.18", + "version": "8.8.19", "description": "Base components for Ionic", "engines": { "node": ">= 16" diff --git a/core/src/components.d.ts b/core/src/components.d.ts index 37ad13b6c01..2873ac12d68 100644 --- a/core/src/components.d.ts +++ b/core/src/components.d.ts @@ -2545,7 +2545,7 @@ export namespace Components { */ "disabled": boolean; /** - * Show two knobs. + * If `true`, the range shows two knobs and `value` is an object with `lower` and `upper` properties. If `false`, the range shows one knob and `value` is a number. * @default false */ "dualKnobs": boolean; @@ -7679,7 +7679,7 @@ declare namespace LocalJSX { */ "disabled"?: boolean; /** - * Show two knobs. + * If `true`, the range shows two knobs and `value` is an object with `lower` and `upper` properties. If `false`, the range shows one knob and `value` is a number. * @default false */ "dualKnobs"?: boolean; diff --git a/core/src/components/menu/menu.tsx b/core/src/components/menu/menu.tsx index 4769f609914..4bf4564c40f 100644 --- a/core/src/components/menu/menu.tsx +++ b/core/src/components/menu/menu.tsx @@ -150,7 +150,7 @@ export class Menu implements ComponentInterface, MenuI { @Watch('side') protected sideChanged() { - this.isEndSide = isEnd(this.side); + this.isEndSide = isEnd(this.side, this.el); /** * Menu direction animation is calculated based on the document direction. * If the document direction changes, we need to create a new animation. @@ -499,7 +499,7 @@ export class Menu implements ComponentInterface, MenuI { * Menu direction animation is calculated based on the document direction. * If the document direction changes, we need to create a new animation. */ - const isEndSide = isEnd(this.side); + const isEndSide = isEnd(this.side, this.el); if (width === this.width && this.animation !== undefined && isEndSide === this.isEndSide) { return; } diff --git a/core/src/components/range/range.tsx b/core/src/components/range/range.tsx index 26e5ef785dd..c3875c8e30e 100644 --- a/core/src/components/range/range.tsx +++ b/core/src/components/range/range.tsx @@ -134,10 +134,19 @@ export class Range implements ComponentInterface { @Prop() label?: string; /** - * Show two knobs. + * If `true`, the range shows two knobs and `value` is an object with `lower` + * and `upper` properties. If `false`, the range shows one knob and `value` is + * a number. */ @Prop() dualKnobs = false; + @Watch('dualKnobs') + protected dualKnobsChanged() { + if (!this.noUpdate) { + this.updateRatio(); + } + } + /** * Minimum integer value of the range. */ diff --git a/core/src/components/range/test/dual-knobs/index.html b/core/src/components/range/test/dual-knobs/index.html new file mode 100644 index 00000000000..a477dae62d8 --- /dev/null +++ b/core/src/components/range/test/dual-knobs/index.html @@ -0,0 +1,122 @@ + + + + + Range - Dual Knobs + + + + + + + + + + + + + + + Range - Dual Knobs + + + + +

+ Every range below is assigned { lower: 20, upper: 80 }. The lower knob is purple while the upper + is blue. +

+ +

dualKnobs set on the component

+ + 20 - 80 + + +

dualKnobs assigned before value

+ + 20 - 80 + + +

dualKnobs assigned after value

+ + 20 - 80 + + +

dualKnobs toggled

+ + + + Toggle Dual Knobs +
+
+ + + + diff --git a/core/src/components/range/test/dual-knobs/range.e2e.ts b/core/src/components/range/test/dual-knobs/range.e2e.ts new file mode 100644 index 00000000000..f3e8e610568 --- /dev/null +++ b/core/src/components/range/test/dual-knobs/range.e2e.ts @@ -0,0 +1,82 @@ +import type { Locator } from '@playwright/test'; +import { expect } from '@playwright/test'; +import { configs, test } from '@utils/test/playwright'; + +const DUAL_VALUE = { lower: 20, upper: 80 }; + +/** + * Returns the value each knob is positioned at. Sorted low to high because knob + * A is not guaranteed to be the knob holding the lower value. + */ +const knobValues = async (range: Locator) => { + const values: string[] = await range + .locator('.range-knob-handle') + .evaluateAll((els: HTMLElement[]) => els.map((el) => el.getAttribute('aria-valuenow')!)); + + return values.sort((a, b) => parseFloat(a) - parseFloat(b)); +}; + +/** + * This behavior does not vary across modes/directions + */ +configs({ directions: ['ltr'], modes: ['md'] }).forEach(({ title, config }) => { + test.describe(title('range: dual knobs'), () => { + test('should position knobs when dualKnobs is assigned before value', async ({ page }) => { + await page.setContent(``, config); + + const range = page.locator('ion-range'); + await range.evaluate((el: HTMLIonRangeElement, value) => { + el.dualKnobs = true; + el.value = value; + }, DUAL_VALUE); + await page.waitForChanges(); + + expect(await knobValues(range)).toEqual(['20', '80']); + + // A single knob range ignores the lower half of an object value. + await range.evaluate((el: HTMLIonRangeElement) => (el.dualKnobs = false)); + await page.waitForChanges(); + + expect(await knobValues(range)).toEqual(['80']); + }); + + test('should position knobs when dualKnobs is assigned after value', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/31026', + }); + + await page.setContent(``, config); + + const range = page.locator('ion-range'); + await range.evaluate((el: HTMLIonRangeElement, value) => { + el.value = value; + el.dualKnobs = true; + }, DUAL_VALUE); + await page.waitForChanges(); + + expect(await knobValues(range)).toEqual(['20', '80']); + }); + + test('should reposition knobs when dualKnobs is toggled at runtime', async ({ page }) => { + await page.setContent(``, config); + + const range = page.locator('ion-range'); + await range.evaluate((el: HTMLIonRangeElement, value) => (el.value = value), DUAL_VALUE); + await page.waitForChanges(); + + // A single knob range ignores the lower half of an object value. + expect(await knobValues(range)).toEqual(['80']); + + await range.evaluate((el: HTMLIonRangeElement) => (el.dualKnobs = true)); + await page.waitForChanges(); + + expect(await knobValues(range)).toEqual(['20', '80']); + + await range.evaluate((el: HTMLIonRangeElement) => (el.dualKnobs = false)); + await page.waitForChanges(); + + expect(await knobValues(range)).toEqual(['80']); + }); + }); +}); diff --git a/core/src/utils/gesture/listener.ts b/core/src/utils/gesture/listener.ts index 669af4e0887..90cba24e6ae 100644 --- a/core/src/utils/gesture/listener.ts +++ b/core/src/utils/gesture/listener.ts @@ -7,14 +7,10 @@ export const addEventListener = ( capture?: boolean; } ): (() => void) => { - // use event listener options when supported - // otherwise it's just a boolean for the "capture" arg - const listenerOpts = supportsPassive(el) - ? { - capture: !!opts.capture, - passive: !!opts.passive, - } - : !!opts.capture; + const listenerOpts = { + capture: !!opts.capture, + passive: !!opts.passive, + }; let add: string; let remove: string; @@ -31,27 +27,3 @@ export const addEventListener = ( el[remove](eventName, callback, listenerOpts); }; }; - -const supportsPassive = (node: Node) => { - if (_sPassive === undefined) { - try { - const opts = Object.defineProperty({}, 'passive', { - get: () => { - _sPassive = true; - }, - }); - node.addEventListener( - 'optsTest', - () => { - return; - }, - opts - ); - } catch { - _sPassive = false; - } - } - return !!_sPassive; -}; - -let _sPassive: boolean | undefined; diff --git a/core/src/utils/helpers.spec.ts b/core/src/utils/helpers.spec.ts index 44dd9d8c3ce..aaa4b7dbdb7 100644 --- a/core/src/utils/helpers.spec.ts +++ b/core/src/utils/helpers.spec.ts @@ -1,4 +1,36 @@ -import { inheritAriaAttributes } from './helpers'; +import { inheritAriaAttributes, isEndSide } from './helpers'; + +describe('isEndSide', () => { + afterEach(() => { + document.dir = ''; + document.body.innerHTML = ''; + }); + + it('should use document direction when no host element is provided', () => { + document.dir = 'ltr'; + expect(isEndSide('start')).toBe(false); + expect(isEndSide('end')).toBe(true); + + document.dir = 'rtl'; + expect(isEndSide('start')).toBe(true); + expect(isEndSide('end')).toBe(false); + }); + + // https://github.com/ionic-team/ionic-framework/issues/30226 + it('should use the nearest ancestor dir attribute', () => { + document.dir = 'ltr'; + + const app = document.createElement('ion-app'); + app.setAttribute('dir', 'rtl'); + + const menu = document.createElement('ion-menu'); + app.appendChild(menu); + document.body.appendChild(app); + + expect(isEndSide('start', menu)).toBe(true); + expect(isEndSide('end', menu)).toBe(false); + }); +}); describe('inheritAriaAttributes', () => { it('should inherit aria attributes', () => { diff --git a/core/src/utils/helpers.ts b/core/src/utils/helpers.ts index e32956c35eb..9c6052b466f 100644 --- a/core/src/utils/helpers.ts +++ b/core/src/utils/helpers.ts @@ -1,5 +1,6 @@ import type { EventEmitter } from '@stencil/core'; import { printIonError } from '@utils/logging'; +import { isRTL } from '@utils/rtl'; import type { Side } from '../components/menu/menu-interface'; @@ -316,18 +317,22 @@ export const pointerCoord = (ev: any): { x: number; y: number } => { /** * @hidden - * Given a side, return if it should be on the end - * based on the value of dir - * @param side the side - * @param isRTL whether the application dir is rtl + * Given a side, returns whether it resolves to the end side for the current + * direction. In RTL `start` is the end side, and in LTR `end` is. + * + * @param side The current side before being redefined based on the direction. + * @param hostEl The component's host element. The direction is resolved from + * it or its nearest ancestor that declares one. When omitted, the direction + * is resolved from the document. */ -export const isEndSide = (side: Side): boolean => { - const isRTL = document.dir === 'rtl'; +export const isEndSide = (side: Side, hostEl?: HTMLElement): boolean => { + const rtl = isRTL(hostEl); + switch (side) { case 'start': - return isRTL; + return rtl; case 'end': - return !isRTL; + return !rtl; default: throw new Error(`"${side}" is not a valid value for [side]. Use "start" or "end" instead.`); } diff --git a/core/src/utils/rtl/dir.spec.ts b/core/src/utils/rtl/dir.spec.ts index 57061abc5cb..cc3245e0f55 100644 --- a/core/src/utils/rtl/dir.spec.ts +++ b/core/src/utils/rtl/dir.spec.ts @@ -1,25 +1,93 @@ import { isRTL } from './dir'; describe('rtl: dir', () => { - describe('with host element', () => { - it('should return true', () => { - expect(isRTL({ dir: 'rtl' })).toBe(true); + /** + * Renders the given markup and returns the element with `id="target"`. + */ + const render = (html: string): Element => { + document.body.innerHTML = html; + + const target = document.body.querySelector('#target'); + if (target === null) { + throw new Error('Test markup must contain an element with id="target".'); + } + + return target; + }; + + beforeEach(() => { + /** + * Reset to the state of a document that never set a direction, rather than + * to `ltr`, so that tests relying on the default are not masked. + */ + document.dir = ''; + document.body.innerHTML = ''; + }); + + describe('with a host element', () => { + it('should use the dir on the element itself', () => { + expect(isRTL(render('
'))).toBe(true); + expect(isRTL(render('
'))).toBe(false); + }); + + it('should use the nearest ancestor that declares a dir', () => { + expect(isRTL(render('
'))).toBe(true); + expect(isRTL(render('
'))).toBe(false); + }); + + it('should let an inner dir override an outer one', () => { + expect(isRTL(render('
'))).toBe(false); + expect(isRTL(render('
'))).toBe(true); + }); + + it('should ignore casing', () => { + expect(isRTL(render('
'))).toBe(true); + expect(isRTL(render('
'))).toBe(false); }); - it('should return false', () => { - expect(isRTL({ dir: 'ltr' })).toBe(false); - expect(isRTL({ dir: '' })).toBe(false); + it('should skip values that do not declare a direction', () => { + /** + * `dir=""`, `dir="auto"` and unknown values are not used as a direction, + * so the nearest ancestor that does declare one still wins. + */ + expect(isRTL(render('
'))).toBe(true); + expect(isRTL(render('
'))).toBe(true); + expect(isRTL(render('
'))).toBe(true); }); }); - describe('without host element', () => { - it('should return true', () => { - global.document.dir = 'rtl'; - expect(isRTL()).toBe(true); + describe('falling back to the document', () => { + it('should use the document dir when no ancestor declares one', () => { + document.dir = 'rtl'; + expect(isRTL(render('
'))).toBe(true); + + document.dir = 'ltr'; + expect(isRTL(render('
'))).toBe(false); + }); + + it('should use the document dir for a detached element', () => { + document.dir = 'rtl'; + expect(isRTL(document.createElement('div'))).toBe(true); }); - it('should return false', () => { - global.document.dir = 'ltr'; + it('should default to ltr when no dir is set anywhere', () => { + // Ensure the default is actually being tested rather than a + // value left behind by another test. + expect(document.dir).toBe(''); + + expect(isRTL()).toBe(false); + expect(isRTL(null)).toBe(false); + expect(isRTL(document.createElement('div'))).toBe(false); + expect(isRTL(render('
'))).toBe(false); + }); + }); + + describe('without a host element', () => { + it('should use the document dir', () => { + document.dir = 'rtl'; + expect(isRTL()).toBe(true); + + document.dir = 'ltr'; expect(isRTL()).toBe(false); }); }); diff --git a/core/src/utils/rtl/dir.ts b/core/src/utils/rtl/dir.ts index 7e1cb9cb1b9..1d7de2dd261 100644 --- a/core/src/utils/rtl/dir.ts +++ b/core/src/utils/rtl/dir.ts @@ -1,13 +1,24 @@ /** - * Returns `true` if the document or host element - * has a `dir` set to `rtl`. The host value will always - * take priority over the root document value. + * Returns `true` if the direction resolves to `rtl` for the given element. + * + * The direction comes from the nearest ancestor that declares one, starting + * with `hostEl` itself, and falls back to the root document value. Setting + * `dir="auto"` or setting `dir` to an empty string are skipped rather than + * treated as `ltr`. When nothing declares a direction, including the document, + * the direction is `ltr`. + * + * @param hostEl the element to resolve the direction for. */ -export const isRTL = (hostEl?: Pick) => { - if (hostEl) { - if (hostEl.dir !== '') { - return hostEl.dir.toLowerCase() === 'rtl'; +export const isRTL = (hostEl?: Element | null): boolean => { + for (let el = hostEl; el; el = el.parentElement) { + const dir = el.getAttribute('dir')?.toLowerCase(); + + if (dir === 'rtl') { + return true; + } + if (dir === 'ltr') { + return false; } } - return document?.dir.toLowerCase() === 'rtl'; + return document?.dir?.toLowerCase() === 'rtl'; }; diff --git a/lerna.json b/lerna.json index cfe9cb7da97..80ec1d2f11c 100644 --- a/lerna.json +++ b/lerna.json @@ -10,5 +10,5 @@ "packages/vue", "packages/vue-router" ], - "version": "8.8.18" + "version": "8.8.19" } diff --git a/packages/angular-server/CHANGELOG.md b/packages/angular-server/CHANGELOG.md index e21d866a157..d469c30c2b9 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.19](https://github.com/ionic-team/ionic-framework/compare/v8.8.18...v8.8.19) (2026-08-19) + +**Note:** Version bump only for package @ionic/angular-server + + + + + ## [8.8.18](https://github.com/ionic-team/ionic-framework/compare/v8.8.17...v8.8.18) (2026-08-12) **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 627d526f342..91bc49e6260 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.18", + "version": "8.8.19", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular-server", - "version": "8.8.18", + "version": "8.8.19", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.18" + "@ionic/core": "^8.8.19" }, "devDependencies": { "@angular/animations": "^22.0.0", @@ -1135,9 +1135,9 @@ } }, "node_modules/@ionic/core": { - "version": "8.8.18", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.18.tgz", - "integrity": "sha512-QRFqi6gMSTk89FMjtoDx3p6e2dD7mYxqYzS0+Hl+yjxnoWoNFluWKM9rnGEEkdvpY7bF1pt6CI5IwMt+vjYQWg==", + "version": "8.8.19", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.19.tgz", + "integrity": "sha512-eAAKZi/qR0U44OxH3MXAyoyLxTl1AeQCoOWvGdzywKbpl/JTVlGnfZJCiJGTmXszQlRsNXsl7fMDOvpsOtf6sQ==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", @@ -7626,9 +7626,9 @@ "dev": true }, "@ionic/core": { - "version": "8.8.18", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.18.tgz", - "integrity": "sha512-QRFqi6gMSTk89FMjtoDx3p6e2dD7mYxqYzS0+Hl+yjxnoWoNFluWKM9rnGEEkdvpY7bF1pt6CI5IwMt+vjYQWg==", + "version": "8.8.19", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.19.tgz", + "integrity": "sha512-eAAKZi/qR0U44OxH3MXAyoyLxTl1AeQCoOWvGdzywKbpl/JTVlGnfZJCiJGTmXszQlRsNXsl7fMDOvpsOtf6sQ==", "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 d4bbae70076..604f5205831 100644 --- a/packages/angular-server/package.json +++ b/packages/angular-server/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular-server", - "version": "8.8.18", + "version": "8.8.19", "description": "Angular SSR Module for Ionic", "keywords": [ "ionic", @@ -78,6 +78,6 @@ }, "prettier": "@ionic/prettier-config", "dependencies": { - "@ionic/core": "^8.8.18" + "@ionic/core": "^8.8.19" } } diff --git a/packages/angular/CHANGELOG.md b/packages/angular/CHANGELOG.md index eba40d13271..04daab290e1 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.19](https://github.com/ionic-team/ionic-framework/compare/v8.8.18...v8.8.19) (2026-08-19) + +**Note:** Version bump only for package @ionic/angular + + + + + ## [8.8.18](https://github.com/ionic-team/ionic-framework/compare/v8.8.17...v8.8.18) (2026-08-12) **Note:** Version bump only for package @ionic/angular diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index 9f8a19e087b..2c9ecac486d 100644 --- a/packages/angular/package-lock.json +++ b/packages/angular/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/angular", - "version": "8.8.18", + "version": "8.8.19", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/angular", - "version": "8.8.18", + "version": "8.8.19", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.18", + "@ionic/core": "^8.8.19", "ionicons": "^8.0.13", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" @@ -1579,9 +1579,9 @@ } }, "node_modules/@ionic/core": { - "version": "8.8.18", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.18.tgz", - "integrity": "sha512-QRFqi6gMSTk89FMjtoDx3p6e2dD7mYxqYzS0+Hl+yjxnoWoNFluWKM9rnGEEkdvpY7bF1pt6CI5IwMt+vjYQWg==", + "version": "8.8.19", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.19.tgz", + "integrity": "sha512-eAAKZi/qR0U44OxH3MXAyoyLxTl1AeQCoOWvGdzywKbpl/JTVlGnfZJCiJGTmXszQlRsNXsl7fMDOvpsOtf6sQ==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", diff --git a/packages/angular/package.json b/packages/angular/package.json index d3b7077fd10..caa5cd66a58 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular", - "version": "8.8.18", + "version": "8.8.19", "description": "Angular specific wrappers for @ionic/core", "keywords": [ "ionic", @@ -157,7 +157,7 @@ "css/" ], "dependencies": { - "@ionic/core": "^8.8.18", + "@ionic/core": "^8.8.19", "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 36c4332ec5e..0fe339ae639 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.19](https://github.com/ionic-team/ionic-framework/compare/v8.8.18...v8.8.19) (2026-08-19) + +**Note:** Version bump only for package @ionic/docs + + + + + ## [8.8.18](https://github.com/ionic-team/ionic-framework/compare/v8.8.17...v8.8.18) (2026-08-12) **Note:** Version bump only for package @ionic/docs diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index 195bd3a51b8..fc1fb688a72 100644 --- a/packages/docs/package-lock.json +++ b/packages/docs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/docs", - "version": "8.8.18", + "version": "8.8.19", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/docs", - "version": "8.8.18", + "version": "8.8.19", "license": "MIT" } } diff --git a/packages/docs/package.json b/packages/docs/package.json index bfa8999c5af..db9149374fa 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/docs", - "version": "8.8.18", + "version": "8.8.19", "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 01f78e17712..d74403f8414 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.19](https://github.com/ionic-team/ionic-framework/compare/v8.8.18...v8.8.19) (2026-08-19) + +**Note:** Version bump only for package @ionic/react-router + + + + + ## [8.8.18](https://github.com/ionic-team/ionic-framework/compare/v8.8.17...v8.8.18) (2026-08-12) **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 e3767d71569..f9f171728f1 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.18", + "version": "8.8.19", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/react-router", - "version": "8.8.18", + "version": "8.8.19", "license": "MIT", "dependencies": { - "@ionic/react": "^8.8.18", + "@ionic/react": "^8.8.19", "tslib": "*" }, "devDependencies": { @@ -250,9 +250,9 @@ } }, "node_modules/@ionic/core": { - "version": "8.8.18", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.18.tgz", - "integrity": "sha512-QRFqi6gMSTk89FMjtoDx3p6e2dD7mYxqYzS0+Hl+yjxnoWoNFluWKM9rnGEEkdvpY7bF1pt6CI5IwMt+vjYQWg==", + "version": "8.8.19", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.19.tgz", + "integrity": "sha512-eAAKZi/qR0U44OxH3MXAyoyLxTl1AeQCoOWvGdzywKbpl/JTVlGnfZJCiJGTmXszQlRsNXsl7fMDOvpsOtf6sQ==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", @@ -290,12 +290,12 @@ } }, "node_modules/@ionic/react": { - "version": "8.8.18", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.18.tgz", - "integrity": "sha512-Hp7PuvuzqREzyWTDFYykgDLDE4RqE932+YX/gr0O3N/EfrPBAeuDeVZqPh2NLGQvliDcU1mwItGxWy/H0PK+Qg==", + "version": "8.8.19", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.19.tgz", + "integrity": "sha512-IAY0iywSxG73sYepTPzDvNJo3q9VeWQk/ubA4PQv8cMej4NWwS4VdnwRnLql4pV2fIBGdM06zZJgVFP/WKDNFg==", "license": "MIT", "dependencies": { - "@ionic/core": "8.8.18", + "@ionic/core": "8.8.19", "ionicons": "^8.0.13", "tslib": "*" }, diff --git a/packages/react-router/package.json b/packages/react-router/package.json index c34671c7696..b3a9b4ae6cf 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react-router", - "version": "8.8.18", + "version": "8.8.19", "description": "React Router wrapper for @ionic/react", "keywords": [ "ionic", @@ -37,7 +37,7 @@ "dist/" ], "dependencies": { - "@ionic/react": "^8.8.18", + "@ionic/react": "^8.8.19", "tslib": "*" }, "peerDependencies": { diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 7daf28a6f78..390d0ebc90b 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.19](https://github.com/ionic-team/ionic-framework/compare/v8.8.18...v8.8.19) (2026-08-19) + +**Note:** Version bump only for package @ionic/react + + + + + ## [8.8.18](https://github.com/ionic-team/ionic-framework/compare/v8.8.17...v8.8.18) (2026-08-12) **Note:** Version bump only for package @ionic/react diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index 7ef79cdaede..25534ae7972 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react", - "version": "8.8.18", + "version": "8.8.19", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/react", - "version": "8.8.18", + "version": "8.8.19", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.18", + "@ionic/core": "^8.8.19", "@stencil/react-output-target": "^1.6.2", "ionicons": "^8.0.13", "tslib": "*" @@ -891,9 +891,9 @@ } }, "node_modules/@ionic/core": { - "version": "8.8.18", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.18.tgz", - "integrity": "sha512-QRFqi6gMSTk89FMjtoDx3p6e2dD7mYxqYzS0+Hl+yjxnoWoNFluWKM9rnGEEkdvpY7bF1pt6CI5IwMt+vjYQWg==", + "version": "8.8.19", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.19.tgz", + "integrity": "sha512-eAAKZi/qR0U44OxH3MXAyoyLxTl1AeQCoOWvGdzywKbpl/JTVlGnfZJCiJGTmXszQlRsNXsl7fMDOvpsOtf6sQ==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", diff --git a/packages/react/package.json b/packages/react/package.json index 667afb71dac..5cc1ed70daa 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react", - "version": "8.8.18", + "version": "8.8.19", "description": "React specific wrapper for @ionic/core", "keywords": [ "ionic", @@ -41,7 +41,7 @@ "css/" ], "dependencies": { - "@ionic/core": "^8.8.18", + "@ionic/core": "^8.8.19", "@stencil/react-output-target": "^1.6.2", "ionicons": "^8.0.13", "tslib": "*" diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md index fe3d03966f9..e75021d11d0 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.19](https://github.com/ionic-team/ionic-framework/compare/v8.8.18...v8.8.19) (2026-08-19) + +**Note:** Version bump only for package @ionic/vue-router + + + + + ## [8.8.18](https://github.com/ionic-team/ionic-framework/compare/v8.8.17...v8.8.18) (2026-08-12) **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 401db4d810a..b8fd7465331 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.18", + "version": "8.8.19", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/vue-router", - "version": "8.8.18", + "version": "8.8.19", "license": "MIT", "dependencies": { - "@ionic/vue": "^8.8.18" + "@ionic/vue": "^8.8.19" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", @@ -342,9 +342,9 @@ } }, "node_modules/@ionic/core": { - "version": "8.8.18", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.18.tgz", - "integrity": "sha512-QRFqi6gMSTk89FMjtoDx3p6e2dD7mYxqYzS0+Hl+yjxnoWoNFluWKM9rnGEEkdvpY7bF1pt6CI5IwMt+vjYQWg==", + "version": "8.8.19", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.19.tgz", + "integrity": "sha512-eAAKZi/qR0U44OxH3MXAyoyLxTl1AeQCoOWvGdzywKbpl/JTVlGnfZJCiJGTmXszQlRsNXsl7fMDOvpsOtf6sQ==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", @@ -382,12 +382,12 @@ } }, "node_modules/@ionic/vue": { - "version": "8.8.18", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.18.tgz", - "integrity": "sha512-4Cqp9L+nubSK5PnG8eKENfdnjFL/ze0Et7W87rQYTQzAVxiNqK9vmdVzWK8BErP1uSV+lbXsiQ8SrzQl6mlNiQ==", + "version": "8.8.19", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.19.tgz", + "integrity": "sha512-/9ZsxUHgTWSU/1lGx1hx8oRV9XRlXRaaFTvwuJfJu4XmkpZmbmT2pCIjxRAf5eQunMMZUuXViOuT9wZBQOBchA==", "license": "MIT", "dependencies": { - "@ionic/core": "8.8.18", + "@ionic/core": "8.8.19", "@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 136265a176b..c2c517ad020 100644 --- a/packages/vue-router/package.json +++ b/packages/vue-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue-router", - "version": "8.8.18", + "version": "8.8.19", "description": "Vue Router integration for @ionic/vue", "scripts": { "eslint": "eslint src", @@ -44,7 +44,7 @@ }, "homepage": "https://github.com/ionic-team/ionic-framework#readme", "dependencies": { - "@ionic/vue": "^8.8.18" + "@ionic/vue": "^8.8.19" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 3a17d3483f4..5484e1bbc05 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.19](https://github.com/ionic-team/ionic-framework/compare/v8.8.18...v8.8.19) (2026-08-19) + +**Note:** Version bump only for package @ionic/vue + + + + + ## [8.8.18](https://github.com/ionic-team/ionic-framework/compare/v8.8.17...v8.8.18) (2026-08-12) **Note:** Version bump only for package @ionic/vue diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index 55079f9a6b1..6a71ec1f4b6 100644 --- a/packages/vue/package-lock.json +++ b/packages/vue/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue", - "version": "8.8.18", + "version": "8.8.19", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/vue", - "version": "8.8.18", + "version": "8.8.19", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.18", + "@ionic/core": "^8.8.19", "@stencil/vue-output-target": "0.14.1", "ionicons": "^8.0.13" }, @@ -346,9 +346,9 @@ } }, "node_modules/@ionic/core": { - "version": "8.8.18", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.18.tgz", - "integrity": "sha512-QRFqi6gMSTk89FMjtoDx3p6e2dD7mYxqYzS0+Hl+yjxnoWoNFluWKM9rnGEEkdvpY7bF1pt6CI5IwMt+vjYQWg==", + "version": "8.8.19", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.19.tgz", + "integrity": "sha512-eAAKZi/qR0U44OxH3MXAyoyLxTl1AeQCoOWvGdzywKbpl/JTVlGnfZJCiJGTmXszQlRsNXsl7fMDOvpsOtf6sQ==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", diff --git a/packages/vue/package.json b/packages/vue/package.json index 728ae5fc0a1..403c788e270 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue", - "version": "8.8.18", + "version": "8.8.19", "description": "Vue specific wrapper for @ionic/core", "scripts": { "eslint": "eslint src", @@ -78,7 +78,7 @@ } }, "dependencies": { - "@ionic/core": "^8.8.18", + "@ionic/core": "^8.8.19", "@stencil/vue-output-target": "0.14.1", "ionicons": "^8.0.13" },