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

{{ greeting }}

+
+ `, + standalone: true, + imports: [IonContent, IonHeader, IonTitle, IonToolbar, IonButton, IonButtons], +}) +export class GenericModalComponent { + @Input() greeting = ''; + modal: HTMLIonModalElement | undefined; + + dismiss() { + this.modal?.dismiss(); + } +} diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.html b/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.html index c121dab37a7..0f264add5b8 100644 --- a/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.html +++ b/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.html @@ -6,6 +6,7 @@

IonCheckbox Value Accessors

- Checkbox + Static Checkbox Label + {{dynamicLabel}}
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.ts b/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.ts index d58672d9549..edf8d16e375 100644 --- a/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.ts +++ b/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.ts @@ -15,6 +15,11 @@ import { ValueAccessorTestComponent } from "../value-accessor-test/value-accesso ] }) export class CheckboxComponent { + dynamicLabel = ''; + + ngAfterViewInit(): void { + this.dynamicLabel = 'Dynamic Checkbox Label'; + } form = this.fb.group({ checkbox: [false, Validators.required], diff --git a/packages/docs/CHANGELOG.md b/packages/docs/CHANGELOG.md index 35714b39929..315eb465d5b 100644 --- a/packages/docs/CHANGELOG.md +++ b/packages/docs/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25) + +**Note:** Version bump only for package @ionic/docs + + + + + ## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06) **Note:** Version bump only for package @ionic/docs diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index c07ba774b3e..607f6df975e 100644 --- a/packages/docs/package-lock.json +++ b/packages/docs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/docs", - "version": "8.8.1", + "version": "8.8.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/docs", - "version": "8.8.1", + "version": "8.8.2", "license": "MIT" } } diff --git a/packages/docs/package.json b/packages/docs/package.json index fdda438b6df..dbe18b7e194 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/docs", - "version": "8.8.1", + "version": "8.8.2", "description": "Pre-packaged API documentation for the Ionic docs.", "main": "core.json", "types": "core.d.ts", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index a65882d9093..8e8656feffe 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25) + +**Note:** Version bump only for package @ionic/react-router + + + + + ## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06) **Note:** Version bump only for package @ionic/react-router diff --git a/packages/react-router/package-lock.json b/packages/react-router/package-lock.json index c2ddb561ace..726849edefc 100644 --- a/packages/react-router/package-lock.json +++ b/packages/react-router/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react-router", - "version": "8.8.1", + "version": "8.8.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react-router", - "version": "8.8.1", + "version": "8.8.2", "license": "MIT", "dependencies": { - "@ionic/react": "^8.8.1", + "@ionic/react": "^8.8.2", "tslib": "*" }, "devDependencies": { @@ -238,9 +238,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz", - "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz", + "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.0", @@ -418,12 +418,12 @@ } }, "node_modules/@ionic/react": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.1.tgz", - "integrity": "sha512-KuDWk2E0HA8EA5ioDHxGF+OD/REG2PYb7SorMgVHWRWdPYMIL9PwNXrMBfWAd6PyYLLHd2fw7UoiuT2K8SbrzQ==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.2.tgz", + "integrity": "sha512-b2kMns556wocZ5JMoo5PZMRjNkgmQKOgxb5rIdrhgJMrLtkQ/smQi7dn3Sp9Hhy5tI3oY2ooyCMjABKe1PbKww==", "license": "MIT", "dependencies": { - "@ionic/core": "8.8.1", + "@ionic/core": "8.8.2", "ionicons": "^8.0.13", "tslib": "*" }, @@ -4178,9 +4178,9 @@ "dev": true }, "@ionic/core": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz", - "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz", + "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==", "requires": { "@stencil/core": "4.43.0", "ionicons": "^8.0.13", @@ -4284,11 +4284,11 @@ "requires": {} }, "@ionic/react": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.1.tgz", - "integrity": "sha512-KuDWk2E0HA8EA5ioDHxGF+OD/REG2PYb7SorMgVHWRWdPYMIL9PwNXrMBfWAd6PyYLLHd2fw7UoiuT2K8SbrzQ==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.8.2.tgz", + "integrity": "sha512-b2kMns556wocZ5JMoo5PZMRjNkgmQKOgxb5rIdrhgJMrLtkQ/smQi7dn3Sp9Hhy5tI3oY2ooyCMjABKe1PbKww==", "requires": { - "@ionic/core": "8.8.1", + "@ionic/core": "8.8.2", "ionicons": "^8.0.13", "tslib": "*" } diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 44b1d1b6c27..3029b19359b 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react-router", - "version": "8.8.1", + "version": "8.8.2", "description": "React Router wrapper for @ionic/react", "keywords": [ "ionic", @@ -36,7 +36,7 @@ "dist/" ], "dependencies": { - "@ionic/react": "^8.8.1", + "@ionic/react": "^8.8.2", "tslib": "*" }, "peerDependencies": { diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 4c07a6c59c4..612517174bb 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25) + +**Note:** Version bump only for package @ionic/react + + + + + ## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06) **Note:** Version bump only for package @ionic/react diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index d9f5a8f7ddf..b13e5463be4 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react", - "version": "8.8.1", + "version": "8.8.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/react", - "version": "8.8.1", + "version": "8.8.2", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.1", + "@ionic/core": "^8.8.2", "ionicons": "^8.0.13", "tslib": "*" }, @@ -736,9 +736,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz", - "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz", + "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.0", diff --git a/packages/react/package.json b/packages/react/package.json index 7df224a72c6..39b093e1296 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react", - "version": "8.8.1", + "version": "8.8.2", "description": "React specific wrapper for @ionic/core", "keywords": [ "ionic", @@ -40,7 +40,7 @@ "css/" ], "dependencies": { - "@ionic/core": "^8.8.1", + "@ionic/core": "^8.8.2", "ionicons": "^8.0.13", "tslib": "*" }, diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md index 1880c2d642a..458b19a5feb 100644 --- a/packages/vue-router/CHANGELOG.md +++ b/packages/vue-router/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25) + +**Note:** Version bump only for package @ionic/vue-router + + + + + ## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06) **Note:** Version bump only for package @ionic/vue-router diff --git a/packages/vue-router/package-lock.json b/packages/vue-router/package-lock.json index 346ba57dbe7..b67a23c33f1 100644 --- a/packages/vue-router/package-lock.json +++ b/packages/vue-router/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue-router", - "version": "8.8.1", + "version": "8.8.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue-router", - "version": "8.8.1", + "version": "8.8.2", "license": "MIT", "dependencies": { - "@ionic/vue": "^8.8.1" + "@ionic/vue": "^8.8.2" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", @@ -673,9 +673,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz", - "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz", + "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.0", @@ -868,12 +868,12 @@ } }, "node_modules/@ionic/vue": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.1.tgz", - "integrity": "sha512-tdNErYs6WrNiDJps1nRRY4UeyLffr2hbdkpawrMYFZxzzMd5yuExWsRAofrk5Uy6rSFObSZrfg7AgqyudDcJpQ==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.2.tgz", + "integrity": "sha512-egNOq0UfDrI9nq0OZcKGVstrqpajvOuAbplNF5izx0eeDCwU/3o7z+ehU7zzqnEBgK1DWW4v/TEdAxRUREMAcA==", "license": "MIT", "dependencies": { - "@ionic/core": "8.8.1", + "@ionic/core": "8.8.2", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" } @@ -8044,9 +8044,9 @@ "dev": true }, "@ionic/core": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz", - "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz", + "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==", "requires": { "@stencil/core": "4.43.0", "ionicons": "^8.0.13", @@ -8159,11 +8159,11 @@ "requires": {} }, "@ionic/vue": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.1.tgz", - "integrity": "sha512-tdNErYs6WrNiDJps1nRRY4UeyLffr2hbdkpawrMYFZxzzMd5yuExWsRAofrk5Uy6rSFObSZrfg7AgqyudDcJpQ==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.2.tgz", + "integrity": "sha512-egNOq0UfDrI9nq0OZcKGVstrqpajvOuAbplNF5izx0eeDCwU/3o7z+ehU7zzqnEBgK1DWW4v/TEdAxRUREMAcA==", "requires": { - "@ionic/core": "8.8.1", + "@ionic/core": "8.8.2", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" } diff --git a/packages/vue-router/package.json b/packages/vue-router/package.json index f6622207d7a..7c803694b8a 100644 --- a/packages/vue-router/package.json +++ b/packages/vue-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue-router", - "version": "8.8.1", + "version": "8.8.2", "description": "Vue Router integration for @ionic/vue", "scripts": { "test.spec": "jest", @@ -44,7 +44,7 @@ }, "homepage": "https://github.com/ionic-team/ionic-framework#readme", "dependencies": { - "@ionic/vue": "^8.8.1" + "@ionic/vue": "^8.8.2" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 8e28d889753..ea57c1bbacc 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.8.2](https://github.com/ionic-team/ionic-framework/compare/v8.8.1...v8.8.2) (2026-03-25) + +**Note:** Version bump only for package @ionic/vue + + + + + ## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06) **Note:** Version bump only for package @ionic/vue diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index 5a39b839293..754467be275 100644 --- a/packages/vue/package-lock.json +++ b/packages/vue/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue", - "version": "8.8.1", + "version": "8.8.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/vue", - "version": "8.8.1", + "version": "8.8.2", "license": "MIT", "dependencies": { - "@ionic/core": "^8.8.1", + "@ionic/core": "^8.8.2", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" }, @@ -222,9 +222,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz", - "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.2.tgz", + "integrity": "sha512-br0XaVX/mct0d+ArQk7Gg6R8iLsfcgGdSVs+554iv5U4TjmqVIbmkF+o4IZSe2WkulUHnLVF20/EJ1ZH00aTnw==", "license": "MIT", "dependencies": { "@stencil/core": "4.43.0", diff --git a/packages/vue/package.json b/packages/vue/package.json index 832e45caf65..a89093e6cc2 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue", - "version": "8.8.1", + "version": "8.8.2", "description": "Vue specific wrapper for @ionic/core", "scripts": { "eslint": "eslint src", @@ -68,7 +68,7 @@ "vue-router": "^4.0.16" }, "dependencies": { - "@ionic/core": "^8.8.1", + "@ionic/core": "^8.8.2", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" },