diff --git a/.github/workflows/actions/build-angular/action.yml b/.github/workflows/actions/build-angular/action.yml index 9f27f79336a..12e1db1f5dc 100644 --- a/.github/workflows/actions/build-angular/action.yml +++ b/.github/workflows/actions/build-angular/action.yml @@ -3,7 +3,7 @@ description: 'Build Ionic Angular' runs: using: 'composite' steps: - - uses: actions/setup-node@v7 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.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 2acddf9713f..97f07f8627a 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@v8 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: ${{ inputs.name }} path: ${{ inputs.path }} diff --git a/.github/workflows/actions/test-core-screenshot/action.yml b/.github/workflows/actions/test-core-screenshot/action.yml index 35eca3ec53e..379ce934edc 100644 --- a/.github/workflows/actions/test-core-screenshot/action.yml +++ b/.github/workflows/actions/test-core-screenshot/action.yml @@ -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@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: updated-screenshots-${{ inputs.shard }}-${{ inputs.totalShards }} path: UpdatedScreenshots-${{ inputs.shard }}-${{ inputs.totalShards }}.zip diff --git a/.github/workflows/actions/update-reference-screenshots/action.yml b/.github/workflows/actions/update-reference-screenshots/action.yml index a7bdde53871..844f4e6d2ac 100644 --- a/.github/workflows/actions/update-reference-screenshots/action.yml +++ b/.github/workflows/actions/update-reference-screenshots/action.yml @@ -10,7 +10,7 @@ runs: - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 24.x - - uses: actions/download-artifact@v8 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 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 c09397345f9..3cfff8853fc 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@v7 + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: ${{ inputs.name }} path: ${{ inputs.output }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ccdc9b996d2..74f504e7317 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@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - - uses: github/codeql-action/init@v4 + - uses: github/codeql-action/init@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1 with: languages: javascript - - uses: github/codeql-action/analyze@v4 + - uses: github/codeql-action/analyze@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1 diff --git a/.github/workflows/conventional-commit.yml b/.github/workflows/conventional-commit.yml index 8c0bbdebb37..65c026de5eb 100644 --- a/.github/workflows/conventional-commit.yml +++ b/.github/workflows/conventional-commit.yml @@ -12,7 +12,7 @@ jobs: if: | !contains(github.event.pull_request.title, 'release') && !contains(github.event.pull_request.title, 'chore') - uses: amannn/action-semantic-pull-request@v6 + uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 7f5d8de9787..b6014addef1 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -13,7 +13,7 @@ jobs: triage: runs-on: ubuntu-latest steps: - - uses: actions/labeler@v6 + - uses: actions/labeler@b8dd2d9be0f68b860e7dae5dae7d772984eacd6d # v6.2.0 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" sync-labels: true diff --git a/CHANGELOG.md b/CHANGELOG.md index a34a9108ca2..996f23da565 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.15](https://github.com/ionic-team/ionic-framework/compare/v8.8.14...v8.8.15) (2026-07-22) + + +### Bug Fixes + +* **angular-server:** fallback to scoped+annotations when SSR DOM lacks attachShadow ([#30967](https://github.com/ionic-team/ionic-framework/issues/30967)) ([ae6911f](https://github.com/ionic-team/ionic-framework/commit/ae6911f6c8d46467ae54114295688bbba5ccbf5e)), closes [#29751](https://github.com/ionic-team/ionic-framework/issues/29751) +* **modal:** focus the dialog wrapper on present so screen readers can enter the modal ([#31260](https://github.com/ionic-team/ionic-framework/issues/31260)) ([6251eb8](https://github.com/ionic-team/ionic-framework/commit/6251eb85db0e5b43b9e09604248dc8451e1664c0)) + + + + + ## [8.8.14](https://github.com/ionic-team/ionic-framework/compare/v8.8.13...v8.8.14) (2026-07-15) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index e1c7853b8dc..a7596c353cc 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.15](https://github.com/ionic-team/ionic-framework/compare/v8.8.14...v8.8.15) (2026-07-22) + + +### Bug Fixes + +* **modal:** focus the dialog wrapper on present so screen readers can enter the modal ([#31260](https://github.com/ionic-team/ionic-framework/issues/31260)) ([6251eb8](https://github.com/ionic-team/ionic-framework/commit/6251eb85db0e5b43b9e09604248dc8451e1664c0)) + + + + + ## [8.8.14](https://github.com/ionic-team/ionic-framework/compare/v8.8.13...v8.8.14) (2026-07-15) **Note:** Version bump only for package @ionic/core diff --git a/core/package-lock.json b/core/package-lock.json index b0c6f4dd01a..49d25b8066d 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/core", - "version": "8.8.14", + "version": "8.8.15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/core", - "version": "8.8.14", + "version": "8.8.15", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", @@ -659,9 +659,9 @@ } }, "node_modules/@capacitor/status-bar": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-8.0.2.tgz", - "integrity": "sha512-WXs8YB8B9eEaPZz+bcdY6t2nForF1FLoj/JU0Dl9RRgQnddnS98FEEyDooQhaY7wivr000j4+SC1FyeJkrFO7A==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-8.0.3.tgz", + "integrity": "sha512-csSpfNeN49Hx9JaQBSJEIiEbOLtXg3kcc2IpScq2fu5L520h3AWEvsxoH8Srk1jxfRKepaJ4S4sqSC3foI4AgA==", "dev": true, "license": "MIT", "peerDependencies": { diff --git a/core/package.json b/core/package.json index 37e9addb583..c32b1e52897 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/core", - "version": "8.8.14", + "version": "8.8.15", "description": "Base components for Ionic", "engines": { "node": ">= 16" diff --git a/core/src/components/modal/gestures/sheet.ts b/core/src/components/modal/gestures/sheet.ts index 13dadc34e81..cacf61c5b43 100644 --- a/core/src/components/modal/gestures/sheet.ts +++ b/core/src/components/modal/gestures/sheet.ts @@ -299,6 +299,13 @@ export const createSheetGesture = ( }; const onStart = (detail: GestureDetail) => { + /** + * Firefox automatically selects the header text during drag + * due to the focusable wrapper (tabindex="-1"). Remove any + * selection that may have occurred. + */ + window.getSelection()?.removeAllRanges(); + /** * If canDismiss is anything other than `true` * then users should be able to swipe down diff --git a/core/src/components/modal/gestures/swipe-to-close.ts b/core/src/components/modal/gestures/swipe-to-close.ts index 2b66e7eac24..d04220c88e7 100644 --- a/core/src/components/modal/gestures/swipe-to-close.ts +++ b/core/src/components/modal/gestures/swipe-to-close.ts @@ -116,6 +116,13 @@ export const createSwipeToCloseGesture = ( const onStart = (detail: GestureDetail) => { const { deltaY } = detail; + /** + * Firefox automatically selects the header text during drag + * due to the focusable wrapper (tabindex="-1"). Remove any + * selection that may have occurred. + */ + window.getSelection()?.removeAllRanges(); + /** * Get the initial scrollY value so * that we can correctly reset the scrollY diff --git a/core/src/components/modal/modal.scss b/core/src/components/modal/modal.scss index 160468f5792..0df4a448cd3 100644 --- a/core/src/components/modal/modal.scss +++ b/core/src/components/modal/modal.scss @@ -84,6 +84,14 @@ ion-backdrop { z-index: 10; } +/** + * The wrapper receives programmatic focus for screen readers but should not + * show a visible focus ring, which is meant only for keyboard navigation. + */ +.modal-wrapper { + outline: none; +} + .modal-shadow { position: absolute; diff --git a/core/src/components/modal/modal.tsx b/core/src/components/modal/modal.tsx index 0ea66ce8cfe..e5c5f1301e2 100644 --- a/core/src/components/modal/modal.tsx +++ b/core/src/components/modal/modal.tsx @@ -1644,10 +1644,17 @@ export class Modal implements ComponentInterface, OverlayInterface { same element. They must also be set inside the shadow DOM otherwise ion-button will not be highlighted when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134 + + tabIndex={-1} is required so present() can move focus to this + element (which carries the dialog role) instead of the role-less + host. role="dialog" alone does not make an element focusable, so + without the tabindex focus() would be a no-op and screen readers + may not properly announce the dialog and its content when it opens. */ role="dialog" {...inheritedAttributes} aria-modal="true" + tabIndex={-1} class="modal-wrapper ion-overlay-wrapper" part="content" ref={(el) => (this.wrapperEl = el)} diff --git a/core/src/components/modal/test/a11y/modal.e2e.ts b/core/src/components/modal/test/a11y/modal.e2e.ts index 5aef2cda0d8..0cacc470903 100644 --- a/core/src/components/modal/test/a11y/modal.e2e.ts +++ b/core/src/components/modal/test/a11y/modal.e2e.ts @@ -19,5 +19,22 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => const results = await new AxeBuilder({ page }).analyze(); expect(results.violations).toEqual([]); }); + + // The focused wrapper must not show a focus ring when opened via keyboard. + test('should not render a focus ring on the wrapper when presented via keyboard', async ({ page }) => { + await page.goto(`/src/components/modal/test/a11y`, config); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + const button = page.locator('#open-modal'); + const wrapper = page.locator('ion-modal .modal-wrapper'); + + // Open with the keyboard so :focus-visible applies to the wrapper. + await button.focus(); + await page.keyboard.press('Enter'); + await ionModalDidPresent.next(); + + await expect(wrapper).toBeFocused(); + await expect(wrapper).toHaveCSS('outline-style', 'none'); + }); }); }); diff --git a/core/src/utils/overlays.ts b/core/src/utils/overlays.ts index 59b341a7d52..ddcce8f4c1c 100644 --- a/core/src/utils/overlays.ts +++ b/core/src/utils/overlays.ts @@ -593,7 +593,29 @@ export const present = async ( * to the overlay container. */ if (overlay.keyboardClose && (document.activeElement === null || !overlay.el.contains(document.activeElement))) { - overlay.el.focus(); + /** + * Some overlays (e.g. modal) put the dialog role and accessible label + * on the `.ion-overlay-wrapper` instead of the host. Screen readers + * need focus on the element with `role="dialog"` to properly announce + * and navigate the dialog. + * + * We only target wrappers with `tabindex`, since `role="dialog"` alone + * does not make an element focusable. If no focusable dialog wrapper + * exists (e.g. picker-legacy), we fall back to the host. + */ + const overlayWrapper = getElementRoot(overlay.el).querySelector('[role="dialog"][tabindex]'); + const focusTarget = overlayWrapper ?? overlay.el; + /** + * `preventScroll` keeps this a pure focus move so the viewport does not + * jump when the wrapper is partially off-screen (e.g. a sheet modal). + * Guard the options call so an older engine that mishandles it can never + * reject present(); we fall back to a plain focus() in that case. + */ + try { + focusTarget.focus({ preventScroll: true }); + } catch { + focusTarget.focus(); + } } /** diff --git a/core/src/utils/test/overlays/overlays.e2e.ts b/core/src/utils/test/overlays/overlays.e2e.ts index ebe7d25a273..de73fd2f011 100644 --- a/core/src/utils/test/overlays/overlays.e2e.ts +++ b/core/src/utils/test/overlays/overlays.e2e.ts @@ -421,5 +421,87 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => // verify focus is in correct location await expect(input).toBeFocused(); }); + + // Focus the role="dialog" wrapper on present so screen readers can enter. + test('should focus the modal wrapper on present', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'FW-7611', + }); + await page.setContent( + ` + + Modal Content + + `, + config + ); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + const modal = page.locator('ion-modal'); + const wrapper = page.locator('ion-modal .modal-wrapper'); + + await modal.evaluate((el: HTMLIonModalElement) => el.present()); + await ionModalDidPresent.next(); + + await expect(wrapper).toHaveAttribute('role', 'dialog'); + await expect(wrapper).toBeFocused(); + }); + + test('should focus the sheet modal wrapper on present', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'FW-7611', + }); + await page.setContent( + ` + + Sheet Modal Content + + `, + config + ); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + const modal = page.locator('ion-modal'); + const wrapper = page.locator('ion-modal .modal-wrapper'); + + await modal.evaluate((el: HTMLIonModalElement) => el.present()); + await ionModalDidPresent.next(); + + await expect(wrapper).toHaveAttribute('role', 'dialog'); + await expect(wrapper).toBeFocused(); + }); + + test('should focus the card modal wrapper on present', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'FW-7611', + }); + await page.setContent( + ` +
+ Root Content +
+ + Card Modal Content + + `, + config + ); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + const modal = page.locator('ion-modal'); + const wrapper = page.locator('ion-modal .modal-wrapper'); + + await modal.evaluate((el: HTMLIonModalElement) => { + el.presentingElement = document.querySelector('.ion-page')!; + return el.present(); + }); + await ionModalDidPresent.next(); + + await expect(wrapper).toHaveAttribute('role', 'dialog'); + await expect(wrapper).toBeFocused(); + }); }); }); diff --git a/core/src/utils/test/playwright/drag-element.ts b/core/src/utils/test/playwright/drag-element.ts index ec0a8d9ce83..febff65078e 100644 --- a/core/src/utils/test/playwright/drag-element.ts +++ b/core/src/utils/test/playwright/drag-element.ts @@ -35,6 +35,12 @@ export const dragElementBy = async ( await page.mouse.down(); + // Firefox treats focusable elements (tabindex="-1") as draggable text and + // initiates text selection on mouse.down(). In Playwright, this selection + // locks in before the gesture detector fires, blocking pointer events. + // Clearing it here allows the drag gesture to proceed normally. + await page.evaluate(() => window.getSelection()?.removeAllRanges()); + // Drag the element. await moveElement(page, startX, startY, dragByX, dragByY); diff --git a/lerna.json b/lerna.json index ef652a71ace..c1999229e99 100644 --- a/lerna.json +++ b/lerna.json @@ -3,5 +3,5 @@ "core", "packages/*" ], - "version": "8.8.14" + "version": "8.8.15" } \ No newline at end of file diff --git a/packages/angular-server/CHANGELOG.md b/packages/angular-server/CHANGELOG.md index 7539580efea..4ccbf22bbce 100644 --- a/packages/angular-server/CHANGELOG.md +++ b/packages/angular-server/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.15](https://github.com/ionic-team/ionic-framework/compare/v8.8.14...v8.8.15) (2026-07-22) + + +### Bug Fixes + +* **angular-server:** fallback to scoped+annotations when SSR DOM lacks attachShadow ([#30967](https://github.com/ionic-team/ionic-framework/issues/30967)) ([ae6911f](https://github.com/ionic-team/ionic-framework/commit/ae6911f6c8d46467ae54114295688bbba5ccbf5e)), closes [#29751](https://github.com/ionic-team/ionic-framework/issues/29751) + + + + + ## [8.8.14](https://github.com/ionic-team/ionic-framework/compare/v8.8.13...v8.8.14) (2026-07-15) **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 61c1642676a..399e46b387c 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.14", + "version": "8.8.15", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular-server", - "version": "8.8.14", + "version": "8.8.15", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.14" + "@ionic/core": "^8.8.15" }, "devDependencies": { "@angular-eslint/eslint-plugin": "^16.0.0", @@ -1031,9 +1031,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.14", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.14.tgz", - "integrity": "sha512-xI1y1OqPFsEjVE6nvLdUpb77Xt4uy5cQrNbDT/sRM6RN3vMs2zOFWubeRaQkBf0WslFetiJ/5uAALS/mW4d4TA==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.15.tgz", + "integrity": "sha512-iEREpxWYEakK3ZVGdFVi6Vm+MIpVhNlfy5qds5IjVnZqUPKaD8ynN/2LPfgQiLO/e8eEo40KJj+QuW97uMW53Q==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", @@ -7309,9 +7309,9 @@ "dev": true }, "@ionic/core": { - "version": "8.8.14", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.14.tgz", - "integrity": "sha512-xI1y1OqPFsEjVE6nvLdUpb77Xt4uy5cQrNbDT/sRM6RN3vMs2zOFWubeRaQkBf0WslFetiJ/5uAALS/mW4d4TA==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.15.tgz", + "integrity": "sha512-iEREpxWYEakK3ZVGdFVi6Vm+MIpVhNlfy5qds5IjVnZqUPKaD8ynN/2LPfgQiLO/e8eEo40KJj+QuW97uMW53Q==", "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 937c5ca5b32..ee10b028ddb 100644 --- a/packages/angular-server/package.json +++ b/packages/angular-server/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular-server", - "version": "8.8.14", + "version": "8.8.15", "description": "Angular SSR Module for Ionic", "keywords": [ "ionic", @@ -62,6 +62,6 @@ }, "prettier": "@ionic/prettier-config", "dependencies": { - "@ionic/core": "^8.8.14" + "@ionic/core": "^8.8.15" } } diff --git a/packages/angular-server/src/ionic-server-module.ts b/packages/angular-server/src/ionic-server-module.ts index 72b53de322e..f2d65755a6a 100644 --- a/packages/angular-server/src/ionic-server-module.ts +++ b/packages/angular-server/src/ionic-server-module.ts @@ -20,8 +20,17 @@ export class IonicServerModule {} export function hydrateIonicComponents(doc: any, appId: any) { // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types return () => { + const supportsNativeAttachShadow = + typeof doc?.createElement?.('div')?.attachShadow === 'function'; + return hydrateDocument(doc, { - clientHydrateAnnotations: false, + // Fallback for SSR DOMs (e.g. Domino) that do not implement attachShadow. + ...(supportsNativeAttachShadow + ? { clientHydrateAnnotations: false } + : { + serializeShadowRoot: 'scoped', + clientHydrateAnnotations: true, + }), excludeComponents: [ // overlays 'ion-action-sheet', diff --git a/packages/angular/CHANGELOG.md b/packages/angular/CHANGELOG.md index 6ca79e1400c..20ab7d5ba4c 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.15](https://github.com/ionic-team/ionic-framework/compare/v8.8.14...v8.8.15) (2026-07-22) + +**Note:** Version bump only for package @ionic/angular + + + + + ## [8.8.14](https://github.com/ionic-team/ionic-framework/compare/v8.8.13...v8.8.14) (2026-07-15) **Note:** Version bump only for package @ionic/angular diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index 0e99daf909c..adbea154935 100644 --- a/packages/angular/package-lock.json +++ b/packages/angular/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/angular", - "version": "8.8.14", + "version": "8.8.15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/angular", - "version": "8.8.14", + "version": "8.8.15", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.14", + "@ionic/core": "^8.8.15", "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.14", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.14.tgz", - "integrity": "sha512-xI1y1OqPFsEjVE6nvLdUpb77Xt4uy5cQrNbDT/sRM6RN3vMs2zOFWubeRaQkBf0WslFetiJ/5uAALS/mW4d4TA==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.15.tgz", + "integrity": "sha512-iEREpxWYEakK3ZVGdFVi6Vm+MIpVhNlfy5qds5IjVnZqUPKaD8ynN/2LPfgQiLO/e8eEo40KJj+QuW97uMW53Q==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", diff --git a/packages/angular/package.json b/packages/angular/package.json index 5ba7fc8dc7b..5eb59586f14 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular", - "version": "8.8.14", + "version": "8.8.15", "description": "Angular specific wrappers for @ionic/core", "keywords": [ "ionic", @@ -48,7 +48,7 @@ } }, "dependencies": { - "@ionic/core": "^8.8.14", + "@ionic/core": "^8.8.15", "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 17ef130f5c3..15c703ffa25 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.15](https://github.com/ionic-team/ionic-framework/compare/v8.8.14...v8.8.15) (2026-07-22) + +**Note:** Version bump only for package @ionic/docs + + + + + ## [8.8.14](https://github.com/ionic-team/ionic-framework/compare/v8.8.13...v8.8.14) (2026-07-15) **Note:** Version bump only for package @ionic/docs diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index f5bb9be743c..2f96d120cbd 100644 --- a/packages/docs/package-lock.json +++ b/packages/docs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/docs", - "version": "8.8.14", + "version": "8.8.15", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/docs", - "version": "8.8.14", + "version": "8.8.15", "license": "MIT" } } diff --git a/packages/docs/package.json b/packages/docs/package.json index 9871469ef64..262e89331b3 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/docs", - "version": "8.8.14", + "version": "8.8.15", "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 b007659dbc6..119692c6d83 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.15](https://github.com/ionic-team/ionic-framework/compare/v8.8.14...v8.8.15) (2026-07-22) + +**Note:** Version bump only for package @ionic/react-router + + + + + ## [8.8.14](https://github.com/ionic-team/ionic-framework/compare/v8.8.13...v8.8.14) (2026-07-15) **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 de6eb728429..9031a7d4ea7 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.14", + "version": "8.8.15", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react-router", - "version": "8.8.14", + "version": "8.8.15", "license": "MIT", "dependencies": { - "@ionic/react": "^8.8.14", + "@ionic/react": "^8.8.15", "tslib": "*" }, "devDependencies": { @@ -238,9 +238,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.14", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.14.tgz", - "integrity": "sha512-xI1y1OqPFsEjVE6nvLdUpb77Xt4uy5cQrNbDT/sRM6RN3vMs2zOFWubeRaQkBf0WslFetiJ/5uAALS/mW4d4TA==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.15.tgz", + "integrity": "sha512-iEREpxWYEakK3ZVGdFVi6Vm+MIpVhNlfy5qds5IjVnZqUPKaD8ynN/2LPfgQiLO/e8eEo40KJj+QuW97uMW53Q==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", @@ -418,12 +418,12 @@ } }, "node_modules/@ionic/react": { - "version": "8.8.14", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.14.tgz", - "integrity": "sha512-oEj1nIznqFQpnWGU3qsqY6jpPl1fQoX/cPtL0sgXMBOFPtbuQx1R+NOwKh9ozHsRXTpmmfCjLZPioboieyEyyw==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.15.tgz", + "integrity": "sha512-8bjys95dICAfJMwA0iuKIYfg5pbz2lY56eQpIG6In+796PvMNVXE9eFLhIZ15jjpRE1O/HZHxO2OFV/pL3NVdA==", "license": "MIT", "dependencies": { - "@ionic/core": "8.8.14", + "@ionic/core": "8.8.15", "ionicons": "^8.0.13", "tslib": "*" }, @@ -4178,9 +4178,9 @@ "dev": true }, "@ionic/core": { - "version": "8.8.14", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.14.tgz", - "integrity": "sha512-xI1y1OqPFsEjVE6nvLdUpb77Xt4uy5cQrNbDT/sRM6RN3vMs2zOFWubeRaQkBf0WslFetiJ/5uAALS/mW4d4TA==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.15.tgz", + "integrity": "sha512-iEREpxWYEakK3ZVGdFVi6Vm+MIpVhNlfy5qds5IjVnZqUPKaD8ynN/2LPfgQiLO/e8eEo40KJj+QuW97uMW53Q==", "requires": { "@stencil/core": "4.43.5", "ionicons": "^8.0.13", @@ -4284,11 +4284,11 @@ "requires": {} }, "@ionic/react": { - "version": "8.8.14", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.14.tgz", - "integrity": "sha512-oEj1nIznqFQpnWGU3qsqY6jpPl1fQoX/cPtL0sgXMBOFPtbuQx1R+NOwKh9ozHsRXTpmmfCjLZPioboieyEyyw==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.15.tgz", + "integrity": "sha512-8bjys95dICAfJMwA0iuKIYfg5pbz2lY56eQpIG6In+796PvMNVXE9eFLhIZ15jjpRE1O/HZHxO2OFV/pL3NVdA==", "requires": { - "@ionic/core": "8.8.14", + "@ionic/core": "8.8.15", "ionicons": "^8.0.13", "tslib": "*" } diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 8ab38ff8ca8..818393ac6b9 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react-router", - "version": "8.8.14", + "version": "8.8.15", "description": "React Router wrapper for @ionic/react", "keywords": [ "ionic", @@ -36,7 +36,7 @@ "dist/" ], "dependencies": { - "@ionic/react": "^8.8.14", + "@ionic/react": "^8.8.15", "tslib": "*" }, "peerDependencies": { diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index a71a4c75e85..e0e3c9aeba1 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.15](https://github.com/ionic-team/ionic-framework/compare/v8.8.14...v8.8.15) (2026-07-22) + +**Note:** Version bump only for package @ionic/react + + + + + ## [8.8.14](https://github.com/ionic-team/ionic-framework/compare/v8.8.13...v8.8.14) (2026-07-15) diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index 892ab9c320d..c7d267d5894 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react", - "version": "8.8.14", + "version": "8.8.15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/react", - "version": "8.8.14", + "version": "8.8.15", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.14", + "@ionic/core": "^8.8.15", "ionicons": "^8.0.13", "tslib": "*" }, @@ -736,9 +736,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.14", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.14.tgz", - "integrity": "sha512-xI1y1OqPFsEjVE6nvLdUpb77Xt4uy5cQrNbDT/sRM6RN3vMs2zOFWubeRaQkBf0WslFetiJ/5uAALS/mW4d4TA==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.15.tgz", + "integrity": "sha512-iEREpxWYEakK3ZVGdFVi6Vm+MIpVhNlfy5qds5IjVnZqUPKaD8ynN/2LPfgQiLO/e8eEo40KJj+QuW97uMW53Q==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", diff --git a/packages/react/package.json b/packages/react/package.json index 8264c55f24a..64af2f66975 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react", - "version": "8.8.14", + "version": "8.8.15", "description": "React specific wrapper for @ionic/core", "keywords": [ "ionic", @@ -40,7 +40,7 @@ "css/" ], "dependencies": { - "@ionic/core": "^8.8.14", + "@ionic/core": "^8.8.15", "ionicons": "^8.0.13", "tslib": "*" }, diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md index a3c5210d5ad..3f626505934 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.15](https://github.com/ionic-team/ionic-framework/compare/v8.8.14...v8.8.15) (2026-07-22) + +**Note:** Version bump only for package @ionic/vue-router + + + + + ## [8.8.14](https://github.com/ionic-team/ionic-framework/compare/v8.8.13...v8.8.14) (2026-07-15) **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 4d48fed22a4..ef1cc487fdd 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.14", + "version": "8.8.15", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue-router", - "version": "8.8.14", + "version": "8.8.15", "license": "MIT", "dependencies": { - "@ionic/vue": "^8.8.14" + "@ionic/vue": "^8.8.15" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", @@ -673,9 +673,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.14", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.14.tgz", - "integrity": "sha512-xI1y1OqPFsEjVE6nvLdUpb77Xt4uy5cQrNbDT/sRM6RN3vMs2zOFWubeRaQkBf0WslFetiJ/5uAALS/mW4d4TA==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.15.tgz", + "integrity": "sha512-iEREpxWYEakK3ZVGdFVi6Vm+MIpVhNlfy5qds5IjVnZqUPKaD8ynN/2LPfgQiLO/e8eEo40KJj+QuW97uMW53Q==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", @@ -868,12 +868,12 @@ } }, "node_modules/@ionic/vue": { - "version": "8.8.14", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.14.tgz", - "integrity": "sha512-mGmK77YZM+Os+sYsDaw4QCpvNd7DhHIJvih8lfRSqo/zLyLm7x6Ya4OwCbPxKRL3CMERDKLW10p7rImihhMilA==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.15.tgz", + "integrity": "sha512-WYM51Qlh1PES6Xst+085ueGj4iars2AhBnTboQBLxS9knU6hHQ90/5/pNjOl3WyFkmWV7/kL8iQaR7o+qESLxQ==", "license": "MIT", "dependencies": { - "@ionic/core": "8.8.14", + "@ionic/core": "8.8.15", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" } @@ -8044,9 +8044,9 @@ "dev": true }, "@ionic/core": { - "version": "8.8.14", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.14.tgz", - "integrity": "sha512-xI1y1OqPFsEjVE6nvLdUpb77Xt4uy5cQrNbDT/sRM6RN3vMs2zOFWubeRaQkBf0WslFetiJ/5uAALS/mW4d4TA==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.15.tgz", + "integrity": "sha512-iEREpxWYEakK3ZVGdFVi6Vm+MIpVhNlfy5qds5IjVnZqUPKaD8ynN/2LPfgQiLO/e8eEo40KJj+QuW97uMW53Q==", "requires": { "@stencil/core": "4.43.5", "ionicons": "^8.0.13", @@ -8159,11 +8159,11 @@ "requires": {} }, "@ionic/vue": { - "version": "8.8.14", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.14.tgz", - "integrity": "sha512-mGmK77YZM+Os+sYsDaw4QCpvNd7DhHIJvih8lfRSqo/zLyLm7x6Ya4OwCbPxKRL3CMERDKLW10p7rImihhMilA==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.15.tgz", + "integrity": "sha512-WYM51Qlh1PES6Xst+085ueGj4iars2AhBnTboQBLxS9knU6hHQ90/5/pNjOl3WyFkmWV7/kL8iQaR7o+qESLxQ==", "requires": { - "@ionic/core": "8.8.14", + "@ionic/core": "8.8.15", "@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 fd99a532c28..148fe0aa14a 100644 --- a/packages/vue-router/package.json +++ b/packages/vue-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue-router", - "version": "8.8.14", + "version": "8.8.15", "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.14" + "@ionic/vue": "^8.8.15" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 0ec380d4bee..060691a3ca7 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.15](https://github.com/ionic-team/ionic-framework/compare/v8.8.14...v8.8.15) (2026-07-22) + +**Note:** Version bump only for package @ionic/vue + + + + + ## [8.8.14](https://github.com/ionic-team/ionic-framework/compare/v8.8.13...v8.8.14) (2026-07-15) **Note:** Version bump only for package @ionic/vue diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index d1e1b6ffba6..07a3e46add3 100644 --- a/packages/vue/package-lock.json +++ b/packages/vue/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue", - "version": "8.8.14", + "version": "8.8.15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/vue", - "version": "8.8.14", + "version": "8.8.15", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.14", + "@ionic/core": "^8.8.15", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" }, @@ -222,9 +222,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.14", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.14.tgz", - "integrity": "sha512-xI1y1OqPFsEjVE6nvLdUpb77Xt4uy5cQrNbDT/sRM6RN3vMs2zOFWubeRaQkBf0WslFetiJ/5uAALS/mW4d4TA==", + "version": "8.8.15", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.15.tgz", + "integrity": "sha512-iEREpxWYEakK3ZVGdFVi6Vm+MIpVhNlfy5qds5IjVnZqUPKaD8ynN/2LPfgQiLO/e8eEo40KJj+QuW97uMW53Q==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.5", diff --git a/packages/vue/package.json b/packages/vue/package.json index d2e6962a255..68f9e44cdea 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue", - "version": "8.8.14", + "version": "8.8.15", "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.14", + "@ionic/core": "^8.8.15", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" },