diff --git a/CHANGELOG.md b/CHANGELOG.md index f211e17232e..aa0352217ba 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.5.2](https://github.com/ionic-team/ionic-framework/compare/v8.5.1...v8.5.2) (2025-03-26) + + +### Bug Fixes + +* **datetime:** support typing time values in a 24-hour format ([#30147](https://github.com/ionic-team/ionic-framework/issues/30147)) ([ac6e6a0](https://github.com/ionic-team/ionic-framework/commit/ac6e6a03174263d09ec55c9742a026862a3df444)), closes [#28877](https://github.com/ionic-team/ionic-framework/issues/28877) +* **range:** emit ionInput when value changes ([#30293](https://github.com/ionic-team/ionic-framework/issues/30293)) ([7789bb5](https://github.com/ionic-team/ionic-framework/commit/7789bb59ee5c76074ff4872dc6a50ae2d83df8f5)), closes [#29619](https://github.com/ionic-team/ionic-framework/issues/29619) +* **segment-button:** ensure consistent disabled state for segment-content error handling ([#30288](https://github.com/ionic-team/ionic-framework/issues/30288)) ([1cfa915](https://github.com/ionic-team/ionic-framework/commit/1cfa915e8fe362951c521bce970a9f5f10918ab2)) + + + + + ## [8.5.1](https://github.com/ionic-team/ionic-framework/compare/v8.5.0...v8.5.1) (2025-03-19) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index dea94360e5c..4ae50b507f8 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.5.2](https://github.com/ionic-team/ionic-framework/compare/v8.5.1...v8.5.2) (2025-03-26) + + +### Bug Fixes + +* **datetime:** support typing time values in a 24-hour format ([#30147](https://github.com/ionic-team/ionic-framework/issues/30147)) ([ac6e6a0](https://github.com/ionic-team/ionic-framework/commit/ac6e6a03174263d09ec55c9742a026862a3df444)), closes [#28877](https://github.com/ionic-team/ionic-framework/issues/28877) +* **range:** emit ionInput when value changes ([#30293](https://github.com/ionic-team/ionic-framework/issues/30293)) ([7789bb5](https://github.com/ionic-team/ionic-framework/commit/7789bb59ee5c76074ff4872dc6a50ae2d83df8f5)), closes [#29619](https://github.com/ionic-team/ionic-framework/issues/29619) +* **segment-button:** ensure consistent disabled state for segment-content error handling ([#30288](https://github.com/ionic-team/ionic-framework/issues/30288)) ([1cfa915](https://github.com/ionic-team/ionic-framework/commit/1cfa915e8fe362951c521bce970a9f5f10918ab2)) + + + + + ## [8.5.1](https://github.com/ionic-team/ionic-framework/compare/v8.5.0...v8.5.1) (2025-03-19) diff --git a/core/package-lock.json b/core/package-lock.json index f47e5f708de..163e667d0be 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/core", - "version": "8.5.1", + "version": "8.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/core", - "version": "8.5.1", + "version": "8.5.2", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -22,7 +22,7 @@ "@clack/prompts": "^0.10.0", "@ionic/eslint-config": "^0.3.0", "@ionic/prettier-config": "^2.0.0", - "@playwright/test": "^1.51.0", + "@playwright/test": "^1.51.1", "@rollup/plugin-node-resolve": "^8.4.0", "@rollup/plugin-virtual": "^2.0.3", "@stencil/angular-output-target": "^0.10.0", @@ -1718,12 +1718,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.0.tgz", - "integrity": "sha512-dJ0dMbZeHhI+wb77+ljx/FeC8VBP6j/rj9OAojO08JI80wTZy6vRk9KvHKiDCUh4iMpEiseMgqRBIeW+eKX6RA==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.1.tgz", + "integrity": "sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==", "dev": true, "dependencies": { - "playwright": "1.51.0" + "playwright": "1.51.1" }, "bin": { "playwright": "cli.js" @@ -8495,12 +8495,12 @@ } }, "node_modules/playwright": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.0.tgz", - "integrity": "sha512-442pTfGM0xxfCYxuBa/Pu6B2OqxqqaYq39JS8QDMGThUvIOCd6s0ANDog3uwA0cHavVlnTQzGCN7Id2YekDSXA==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz", + "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==", "dev": true, "dependencies": { - "playwright-core": "1.51.0" + "playwright-core": "1.51.1" }, "bin": { "playwright": "cli.js" @@ -8513,9 +8513,9 @@ } }, "node_modules/playwright-core": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.0.tgz", - "integrity": "sha512-x47yPE3Zwhlil7wlNU/iktF7t2r/URR3VLbH6EknJd/04Qc/PSJ0EY3CMXipmglLG+zyRxW6HNo2EGbKLHPWMg==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz", + "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -11765,12 +11765,12 @@ } }, "@playwright/test": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.0.tgz", - "integrity": "sha512-dJ0dMbZeHhI+wb77+ljx/FeC8VBP6j/rj9OAojO08JI80wTZy6vRk9KvHKiDCUh4iMpEiseMgqRBIeW+eKX6RA==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.1.tgz", + "integrity": "sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==", "dev": true, "requires": { - "playwright": "1.51.0" + "playwright": "1.51.1" } }, "@rollup/plugin-node-resolve": { @@ -16663,19 +16663,19 @@ } }, "playwright": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.0.tgz", - "integrity": "sha512-442pTfGM0xxfCYxuBa/Pu6B2OqxqqaYq39JS8QDMGThUvIOCd6s0ANDog3uwA0cHavVlnTQzGCN7Id2YekDSXA==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz", + "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==", "dev": true, "requires": { "fsevents": "2.3.2", - "playwright-core": "1.51.0" + "playwright-core": "1.51.1" } }, "playwright-core": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.0.tgz", - "integrity": "sha512-x47yPE3Zwhlil7wlNU/iktF7t2r/URR3VLbH6EknJd/04Qc/PSJ0EY3CMXipmglLG+zyRxW6HNo2EGbKLHPWMg==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz", + "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==", "dev": true }, "postcss": { diff --git a/core/package.json b/core/package.json index 2dcc81f72d9..e017e3b68ac 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/core", - "version": "8.5.1", + "version": "8.5.2", "description": "Base components for Ionic", "keywords": [ "ionic", @@ -44,7 +44,7 @@ "@clack/prompts": "^0.10.0", "@ionic/eslint-config": "^0.3.0", "@ionic/prettier-config": "^2.0.0", - "@playwright/test": "^1.51.0", + "@playwright/test": "^1.51.1", "@rollup/plugin-node-resolve": "^8.4.0", "@rollup/plugin-virtual": "^2.0.3", "@stencil/angular-output-target": "^0.10.0", diff --git a/core/src/components/datetime/datetime.tsx b/core/src/components/datetime/datetime.tsx index 9154c24e60b..fcdb8bcabe0 100644 --- a/core/src/components/datetime/datetime.tsx +++ b/core/src/components/datetime/datetime.tsx @@ -1984,7 +1984,7 @@ export class Datetime implements ComponentInterface { }); this.setActiveParts({ - ...activePart, + ...this.getActivePartsWithFallback(), hour: ev.detail.value, }); @@ -2024,7 +2024,7 @@ export class Datetime implements ComponentInterface { }); this.setActiveParts({ - ...activePart, + ...this.getActivePartsWithFallback(), minute: ev.detail.value, }); @@ -2070,7 +2070,7 @@ export class Datetime implements ComponentInterface { }); this.setActiveParts({ - ...activePart, + ...this.getActivePartsWithFallback(), ampm: ev.detail.value, hour, }); diff --git a/core/src/components/picker/picker.tsx b/core/src/components/picker/picker.tsx index 1d98e049d4b..71db6a3cac7 100644 --- a/core/src/components/picker/picker.tsx +++ b/core/src/components/picker/picker.tsx @@ -410,8 +410,13 @@ export class Picker implements ComponentInterface { colEl: HTMLIonPickerColumnElement, value: string, zeroBehavior: 'start' | 'end' = 'start' - ) => { + ): boolean => { + if (!value) { + return false; + } + const behavior = zeroBehavior === 'start' ? /^0+/ : /0$/; + value = value.replace(behavior, ''); const option = Array.from(colEl.querySelectorAll('ion-picker-column-option')).find((el) => { return el.disabled !== true && el.textContent!.replace(behavior, '') === value; }); @@ -419,6 +424,58 @@ export class Picker implements ComponentInterface { if (option) { colEl.setValue(option.value); } + + return !!option; + }; + + /** + * Attempts to intelligently search the first and second + * column as if they're number columns for the provided numbers + * where the first two numbers are the first column + * and the last 2 are the last column. Tries to allow for the first + * number to be ignored for situations where typos occurred. + */ + private multiColumnSearch = ( + firstColumn: HTMLIonPickerColumnElement, + secondColumn: HTMLIonPickerColumnElement, + input: string + ) => { + if (input.length === 0) { + return; + } + + const inputArray = input.split(''); + const hourValue = inputArray.slice(0, 2).join(''); + // Try to find a match for the first two digits in the first column + const foundHour = this.searchColumn(firstColumn, hourValue); + + // If we have more than 2 digits and found a match for hours, + // use the remaining digits for the second column (minutes) + if (inputArray.length > 2 && foundHour) { + const minuteValue = inputArray.slice(2, 4).join(''); + this.searchColumn(secondColumn, minuteValue); + } + // If we couldn't find a match for the two-digit hour, try single digit approaches + else if (!foundHour && inputArray.length >= 1) { + // First try the first digit as a single-digit hour + let singleDigitHour = inputArray[0]; + let singleDigitFound = this.searchColumn(firstColumn, singleDigitHour); + + // If that didn't work, try the second digit as a single-digit hour + // (handles case where user made a typo in the first digit, or they typed over themselves) + if (!singleDigitFound) { + inputArray.shift(); + singleDigitHour = inputArray[0]; + singleDigitFound = this.searchColumn(firstColumn, singleDigitHour); + } + + // If we found a single-digit hour and have remaining digits, + // use up to 2 of the remaining digits for the second column + if (singleDigitFound && inputArray.length > 1) { + const remainingDigits = inputArray.slice(1, 3).join(''); + this.searchColumn(secondColumn, remainingDigits); + } + } }; private selectMultiColumn = () => { @@ -433,91 +490,15 @@ export class Picker implements ComponentInterface { const lastColumn = numericPickers[1]; let value = inputEl.value; - let minuteValue; - switch (value.length) { - case 1: - this.searchColumn(firstColumn, value); - break; - case 2: - /** - * If the first character is `0` or `1` it is - * possible that users are trying to type `09` - * or `11` into the hour field, so we should look - * at that first. - */ - const firstCharacter = inputEl.value.substring(0, 1); - value = firstCharacter === '0' || firstCharacter === '1' ? inputEl.value : firstCharacter; - - this.searchColumn(firstColumn, value); - - /** - * If only checked the first value, - * we can check the second value - * for a match in the minutes column - */ - if (value.length === 1) { - minuteValue = inputEl.value.substring(inputEl.value.length - 1); - this.searchColumn(lastColumn, minuteValue, 'end'); - } - break; - case 3: - /** - * If the first character is `0` or `1` it is - * possible that users are trying to type `09` - * or `11` into the hour field, so we should look - * at that first. - */ - const firstCharacterAgain = inputEl.value.substring(0, 1); - value = - firstCharacterAgain === '0' || firstCharacterAgain === '1' - ? inputEl.value.substring(0, 2) - : firstCharacterAgain; - - this.searchColumn(firstColumn, value); - - /** - * If only checked the first value, - * we can check the second value - * for a match in the minutes column - */ - minuteValue = value.length === 1 ? inputEl.value.substring(1) : inputEl.value.substring(2); - - this.searchColumn(lastColumn, minuteValue, 'end'); - break; - case 4: - /** - * If the first character is `0` or `1` it is - * possible that users are trying to type `09` - * or `11` into the hour field, so we should look - * at that first. - */ - const firstCharacterAgainAgain = inputEl.value.substring(0, 1); - value = - firstCharacterAgainAgain === '0' || firstCharacterAgainAgain === '1' - ? inputEl.value.substring(0, 2) - : firstCharacterAgainAgain; - this.searchColumn(firstColumn, value); + if (value.length > 4) { + const startIndex = inputEl.value.length - 4; + const newString = inputEl.value.substring(startIndex); - /** - * If only checked the first value, - * we can check the second value - * for a match in the minutes column - */ - const minuteValueAgain = - value.length === 1 - ? inputEl.value.substring(1, inputEl.value.length) - : inputEl.value.substring(2, inputEl.value.length); - this.searchColumn(lastColumn, minuteValueAgain, 'end'); - - break; - default: - const startIndex = inputEl.value.length - 4; - const newString = inputEl.value.substring(startIndex); - - inputEl.value = newString; - this.selectMultiColumn(); - break; + inputEl.value = newString; + value = newString; } + + this.multiColumnSearch(firstColumn, lastColumn, value); }; /** diff --git a/core/src/components/picker/test/keyboard-entry/picker.e2e.ts b/core/src/components/picker/test/keyboard-entry/picker.e2e.ts index 64d4a1cce13..b54cd03585a 100644 --- a/core/src/components/picker/test/keyboard-entry/picker.e2e.ts +++ b/core/src/components/picker/test/keyboard-entry/picker.e2e.ts @@ -163,6 +163,172 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => await expect(ionChange).toHaveReceivedEventDetail({ value: 12 }); await expect(column).toHaveJSProperty('value', 12); }); + + test('should allow typing 22 in a column where the max value is 23 and not just set it to 2', async ({ + page, + }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/28877', + }); + await page.setContent( + ` + + + + + + + `, + config + ); + + const hoursColumn = page.locator('ion-picker-column#hours'); + const minutesColumn = page.locator('ion-picker-column#minutes'); + const hoursIonChange = await (hoursColumn as E2ELocator).spyOnEvent('ionChange'); + const minutesIonChange = await (minutesColumn as E2ELocator).spyOnEvent('ionChange'); + const highlight = page.locator('ion-picker .picker-highlight'); + + const box = await highlight.boundingBox(); + if (box !== null) { + await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2); + } + + // Simulate typing '2230' (22 hours, 30 minutes) + await page.keyboard.press('Digit2'); + await page.keyboard.press('Digit2'); + await page.keyboard.press('Digit3'); + await page.keyboard.press('Digit0'); + + // Ensure the hours column is set to 22 + await expect(hoursIonChange).toHaveReceivedEventDetail({ value: 22 }); + await expect(hoursColumn).toHaveJSProperty('value', 22); + + // Ensure the minutes column is set to 30 + await expect(minutesIonChange).toHaveReceivedEventDetail({ value: 30 }); + await expect(minutesColumn).toHaveJSProperty('value', 30); + }); + + test('should set value to 2 and not wait for another digit when max value is 12', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/28877', + }); + await page.setContent( + ` + + + + + + + `, + config + ); + + const hoursColumn = page.locator('ion-picker-column#hours'); + const minutesColumn = page.locator('ion-picker-column#minutes'); + const hoursIonChange = await (hoursColumn as E2ELocator).spyOnEvent('ionChange'); + const minutesIonChange = await (minutesColumn as E2ELocator).spyOnEvent('ionChange'); + const highlight = page.locator('ion-picker .picker-highlight'); + + const box = await highlight.boundingBox(); + if (box !== null) { + await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2); + } + + // Simulate typing '245' (2 hours, 45 minutes) + await page.keyboard.press('Digit2'); + await page.keyboard.press('Digit4'); + await page.keyboard.press('Digit5'); + + // Ensure the hours column is set to 2 + await expect(hoursIonChange).toHaveReceivedEventDetail({ value: 2 }); + await expect(hoursColumn).toHaveJSProperty('value', 2); + + // Ensure the minutes column is set to 45 + await expect(minutesIonChange).toHaveReceivedEventDetail({ value: 45 }); + await expect(minutesColumn).toHaveJSProperty('value', 45); + }); + test('pressing Enter should dismiss the keyboard', async ({ page }) => { test.info().annotations.push({ type: 'issue', diff --git a/core/src/components/range/range.tsx b/core/src/components/range/range.tsx index b36617ad3e1..478b2a57e2e 100644 --- a/core/src/components/range/range.tsx +++ b/core/src/components/range/range.tsx @@ -213,12 +213,32 @@ export class Range implements ComponentInterface { */ @Prop({ mutable: true }) value: RangeValue = 0; @Watch('value') - protected valueChanged() { + protected valueChanged(newValue: RangeValue, oldValue: RangeValue) { + const valuesChanged = this.compareValues(newValue, oldValue); + if (valuesChanged) { + this.ionInput.emit({ value: this.value }); + } + if (!this.noUpdate) { this.updateRatio(); } } + /** + * Compares two RangeValue inputs to determine if they are different. + * + * @param newVal - The new value. + * @param oldVal - The old value. + * @returns `true` if the values are different, `false` otherwise. + */ + private compareValues = (newVal: RangeValue, oldVal: RangeValue) => { + if (typeof newVal === 'object' && typeof oldVal === 'object') { + return newVal.lower !== oldVal.lower || newVal.upper !== oldVal.upper; + } + + return newVal !== oldVal; + }; + private clampBounds = (value: any): number => { return clamp(this.min, value, this.max); }; @@ -591,8 +611,6 @@ export class Range implements ComponentInterface { upper: Math.max(valA, valB), }; - this.ionInput.emit({ value: this.value }); - this.noUpdate = false; } diff --git a/core/src/components/range/test/range-events.e2e.ts b/core/src/components/range/test/range-events.e2e.ts index bfbdfac48e4..f76d147627b 100644 --- a/core/src/components/range/test/range-events.e2e.ts +++ b/core/src/components/range/test/range-events.e2e.ts @@ -217,6 +217,42 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => expect(ionInputSpy).toHaveReceivedEvent(); }); + test('should not emit when the value does not change', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/29619', + }); + + /** + * Requires padding to prevent the knob from being clipped. + * If it's clipped, then the value might be one off. + * For example, if the knob is clipped on the right, then the value + * will be 99 instead of 100. + */ + await page.setContent( + ` +
+ +
+ `, + config + ); + + const rangeHandle = page.locator('ion-range .range-knob-handle'); + const ionInputSpy = await page.spyOnEvent('ionInput'); + + const rangeHandleBoundingBox = await rangeHandle.boundingBox(); + const x = rangeHandleBoundingBox!.width / 2; + const y = rangeHandleBoundingBox!.height / 2; + + // Click in the middle of the knob to prevent the knob from moving. + await rangeHandle.click({ + position: { x, y }, + }); + + expect(ionInputSpy).not.toHaveReceivedEvent(); + }); + test('should emit when the knob is moved with the keyboard', async ({ page }) => { await page.setContent(``, config); diff --git a/core/src/components/segment-button/segment-button.tsx b/core/src/components/segment-button/segment-button.tsx index 3a2135421c2..fb940c9d99b 100644 --- a/core/src/components/segment-button/segment-button.tsx +++ b/core/src/components/segment-button/segment-button.tsx @@ -2,7 +2,7 @@ import type { ComponentInterface } from '@stencil/core'; import { Component, Element, Host, Prop, Method, State, Watch, forceUpdate, h } from '@stencil/core'; import type { ButtonInterface } from '@utils/element-interface'; import type { Attributes } from '@utils/helpers'; -import { addEventListener, removeEventListener, inheritAttributes, getNextSiblingOfType } from '@utils/helpers'; +import { addEventListener, removeEventListener, inheritAttributes } from '@utils/helpers'; import { hostContext } from '@utils/theme'; import { getIonMode } from '../../global/ionic-global'; @@ -65,41 +65,7 @@ export class SegmentButton implements ComponentInterface, ButtonInterface { this.updateState(); } - private waitForSegmentContent(ionSegment: HTMLIonSegmentElement | null, contentId: string): Promise { - return new Promise((resolve, reject) => { - let timeoutId: NodeJS.Timeout | undefined = undefined; - let animationFrameId: number; - - const check = () => { - if (!ionSegment) { - reject(new Error(`Segment not found when looking for Segment Content`)); - return; - } - - const segmentView = getNextSiblingOfType(ionSegment); // Skip the text nodes - const segmentContent = segmentView?.querySelector( - `ion-segment-content[id="${contentId}"]` - ) as HTMLIonSegmentContentElement | null; - if (segmentContent && timeoutId) { - clearTimeout(timeoutId); // Clear the timeout if the segmentContent is found - cancelAnimationFrame(animationFrameId); - resolve(segmentContent); - } else { - animationFrameId = requestAnimationFrame(check); // Keep checking on the next animation frame - } - }; - - check(); - - // Set a timeout to reject the promise - timeoutId = setTimeout(() => { - cancelAnimationFrame(animationFrameId); - reject(new Error(`Unable to find Segment Content with id="${contentId} within 1000 ms`)); - }, 1000); - }); - } - - async connectedCallback() { + connectedCallback() { const segmentEl = (this.segmentEl = this.el.closest('ion-segment')); if (segmentEl) { this.updateState(); @@ -107,27 +73,8 @@ export class SegmentButton implements ComponentInterface, ButtonInterface { addEventListener(segmentEl, 'ionStyle', this.updateStyle); } - // Return if there is no contentId defined - if (!this.contentId) return; - - let segmentContent; - try { - // Attempt to find the Segment Content by its contentId - segmentContent = await this.waitForSegmentContent(segmentEl, this.contentId); - } catch (error) { - // If no associated Segment Content exists, log an error and return - console.error('Segment Button: ', (error as Error).message); - return; - } - - // Ensure the found element is a valid ION-SEGMENT-CONTENT - if (segmentContent.tagName !== 'ION-SEGMENT-CONTENT') { - console.error(`Segment Button: Element with id="${this.contentId}" is not an element.`); - return; - } - // Prevent buttons from being disabled when associated with segment content - if (this.disabled) { + if (this.contentId && this.disabled) { console.warn(`Segment Button: Segment buttons cannot be disabled when associated with an .`); this.disabled = false; } @@ -146,6 +93,24 @@ export class SegmentButton implements ComponentInterface, ButtonInterface { this.inheritedAttributes = { ...inheritAttributes(this.el, ['aria-label']), }; + + // Return if there is no contentId defined + if (!this.contentId) return; + + // Attempt to find the Segment Content by its contentId + const segmentContent = document.getElementById(this.contentId) as HTMLIonSegmentContentElement | null; + + // If no associated Segment Content exists, log an error and return + if (!segmentContent) { + console.error(`Segment Button: Unable to find Segment Content with id="${this.contentId}".`); + return; + } + + // Ensure the found element is a valid ION-SEGMENT-CONTENT + if (segmentContent.tagName !== 'ION-SEGMENT-CONTENT') { + console.error(`Segment Button: Element with id="${this.contentId}" is not an element.`); + return; + } } private get hasLabel() { diff --git a/core/src/utils/helpers.ts b/core/src/utils/helpers.ts index 1a3cd15b0d8..e2a65407c0d 100644 --- a/core/src/utils/helpers.ts +++ b/core/src/utils/helpers.ts @@ -388,17 +388,6 @@ export const shallowEqualStringMap = ( return true; }; -export const getNextSiblingOfType = (element: Element): T | null => { - let sibling = element.nextSibling; - while (sibling) { - if (sibling.nodeType === Node.ELEMENT_NODE && (sibling as T) !== null) { - return sibling as T; - } - sibling = sibling.nextSibling; - } - return null; -}; - /** * Checks input for usable number. Not NaN and not Infinite. */ diff --git a/lerna.json b/lerna.json index 56745d0c303..444bc6effc1 100644 --- a/lerna.json +++ b/lerna.json @@ -3,5 +3,5 @@ "core", "packages/*" ], - "version": "8.5.1" + "version": "8.5.2" } \ No newline at end of file diff --git a/packages/angular-server/CHANGELOG.md b/packages/angular-server/CHANGELOG.md index c8472bf96b2..84386d758b5 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.5.2](https://github.com/ionic-team/ionic-framework/compare/v8.5.1...v8.5.2) (2025-03-26) + +**Note:** Version bump only for package @ionic/angular-server + + + + + ## [8.5.1](https://github.com/ionic-team/ionic-framework/compare/v8.5.0...v8.5.1) (2025-03-19) **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 031aa0a5540..62e3fbb91be 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.5.1", + "version": "8.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular-server", - "version": "8.5.1", + "version": "8.5.2", "license": "MIT", "dependencies": { - "@ionic/core": "^8.5.1" + "@ionic/core": "^8.5.2" }, "devDependencies": { "@angular-eslint/eslint-plugin": "^16.0.0", @@ -1031,9 +1031,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.1.tgz", - "integrity": "sha512-XsI1ImfgO87EdNucfmKESPN4djLyclNTwzU2AY7xSzSonKjTAft6qrK1/qU2ys829bmbM7/4+tHFb0UOnt3uHQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.2.tgz", + "integrity": "sha512-XTiZqyLv2gzPzU4l4EvegHc2nDv5TniVU102MAxT739Lw0tFywZV9R1bv590z7Ue7w43ndwGdnfLuOuBksSeRA==", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -7190,9 +7190,9 @@ "dev": true }, "@ionic/core": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.1.tgz", - "integrity": "sha512-XsI1ImfgO87EdNucfmKESPN4djLyclNTwzU2AY7xSzSonKjTAft6qrK1/qU2ys829bmbM7/4+tHFb0UOnt3uHQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.2.tgz", + "integrity": "sha512-XTiZqyLv2gzPzU4l4EvegHc2nDv5TniVU102MAxT739Lw0tFywZV9R1bv590z7Ue7w43ndwGdnfLuOuBksSeRA==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", diff --git a/packages/angular-server/package.json b/packages/angular-server/package.json index e43acdbf3ac..5a475c32c3b 100644 --- a/packages/angular-server/package.json +++ b/packages/angular-server/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular-server", - "version": "8.5.1", + "version": "8.5.2", "description": "Angular SSR Module for Ionic", "keywords": [ "ionic", @@ -62,6 +62,6 @@ }, "prettier": "@ionic/prettier-config", "dependencies": { - "@ionic/core": "^8.5.1" + "@ionic/core": "^8.5.2" } } diff --git a/packages/angular/CHANGELOG.md b/packages/angular/CHANGELOG.md index 293ee1aee18..194bdb9a1ca 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.5.2](https://github.com/ionic-team/ionic-framework/compare/v8.5.1...v8.5.2) (2025-03-26) + +**Note:** Version bump only for package @ionic/angular + + + + + ## [8.5.1](https://github.com/ionic-team/ionic-framework/compare/v8.5.0...v8.5.1) (2025-03-19) **Note:** Version bump only for package @ionic/angular diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index 86c17ba9f3c..55e3c732995 100644 --- a/packages/angular/package-lock.json +++ b/packages/angular/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/angular", - "version": "8.5.1", + "version": "8.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular", - "version": "8.5.1", + "version": "8.5.2", "license": "MIT", "dependencies": { - "@ionic/core": "^8.5.1", + "@ionic/core": "^8.5.2", "ionicons": "^7.0.0", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" @@ -1398,9 +1398,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.1.tgz", - "integrity": "sha512-XsI1ImfgO87EdNucfmKESPN4djLyclNTwzU2AY7xSzSonKjTAft6qrK1/qU2ys829bmbM7/4+tHFb0UOnt3uHQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.2.tgz", + "integrity": "sha512-XTiZqyLv2gzPzU4l4EvegHc2nDv5TniVU102MAxT739Lw0tFywZV9R1bv590z7Ue7w43ndwGdnfLuOuBksSeRA==", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -9821,9 +9821,9 @@ "dev": true }, "@ionic/core": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.1.tgz", - "integrity": "sha512-XsI1ImfgO87EdNucfmKESPN4djLyclNTwzU2AY7xSzSonKjTAft6qrK1/qU2ys829bmbM7/4+tHFb0UOnt3uHQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.2.tgz", + "integrity": "sha512-XTiZqyLv2gzPzU4l4EvegHc2nDv5TniVU102MAxT739Lw0tFywZV9R1bv590z7Ue7w43ndwGdnfLuOuBksSeRA==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -9920,7 +9920,8 @@ }, "@ionic/prettier-config": { "version": "2.0.0", - "dev": true + "dev": true, + "requires": {} }, "@isaacs/cliui": { "version": "8.0.2", @@ -10755,7 +10756,8 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "agent-base": { "version": "6.0.2", @@ -14784,7 +14786,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/typescript-eslint-language-service/-/typescript-eslint-language-service-5.0.0.tgz", "integrity": "sha512-QB3YsL+lDOpKwblXuqD9GkzpHhJC2D02e/3OIj38kIe6LSL97cEsUtnsVPqIaofnOsV2glj2T5VLxp5gmLTERQ==", - "dev": true + "dev": true, + "requires": {} }, "unbox-primitive": { "version": "1.0.1", diff --git a/packages/angular/package.json b/packages/angular/package.json index 9fea398c030..9906bf3456f 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular", - "version": "8.5.1", + "version": "8.5.2", "description": "Angular specific wrappers for @ionic/core", "keywords": [ "ionic", @@ -47,7 +47,7 @@ } }, "dependencies": { - "@ionic/core": "^8.5.1", + "@ionic/core": "^8.5.2", "ionicons": "^7.0.0", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" diff --git a/packages/angular/test/apps/ng19/src/app/app.module.ts b/packages/angular/test/apps/ng19/src/app/app.module.ts deleted file mode 100644 index cdc0a89be04..00000000000 --- a/packages/angular/test/apps/ng19/src/app/app.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { APP_ID, NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { RouteReuseStrategy } from '@angular/router'; -import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; -import { AppComponent } from './app.component'; -import { AppRoutingModule } from './app-routing.module'; - -const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'; - -export function ionicConfigFactory(): any { - const isLazy = isBrowser && window.location.href.includes('lazy'); - return isLazy ? { keyboardHeight: 12345 } : {}; -} - -@NgModule({ - declarations: [AppComponent], - imports: [ - BrowserModule, - AppRoutingModule, - IonicModule.forRoot(ionicConfigFactory()), - ], - providers: [ - { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, - { provide: APP_ID, useValue: 'serverApp' }, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/packages/angular/test/base/e2e/src/lazy/tabs.spec.ts b/packages/angular/test/base/e2e/src/lazy/tabs.spec.ts index ac31d74060b..ef3b8a3f32b 100644 --- a/packages/angular/test/base/e2e/src/lazy/tabs.spec.ts +++ b/packages/angular/test/base/e2e/src/lazy/tabs.spec.ts @@ -3,122 +3,122 @@ describe('Tabs', () => { beforeEach(() => { cy.visit('/lazy/tabs'); }) - + describe('entry url - /tabs', () => { it('should redirect and load tab-account', () => { testTabTitle('Tab 1 - Page 1'); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1']); testState(1, 'account'); }); - + it('should navigate between tabs and ionChange events should be dispatched', () => { let tab = testTabTitle('Tab 1 - Page 1'); tab.find('.segment-changed').should('have.text', 'false'); - + cy.get('#tab-button-contact').click(); tab = testTabTitle('Tab 2 - Page 1'); tab.find('.segment-changed').should('have.text', 'false'); }); - + describe('when navigating between tabs', () => { - + it('should emit ionTabsWillChange before setting the selected tab', () => { cy.get('#ionTabsWillChangeCounter').should('have.text', '1'); cy.get('#ionTabsWillChangeEvent').should('have.text', 'account'); cy.get('#ionTabsWillChangeSelectedTab').should('have.text', ''); - + cy.get('#ionTabsDidChangeCounter').should('have.text', '1'); cy.get('#ionTabsDidChangeEvent').should('have.text', 'account'); cy.get('#ionTabsDidChangeSelectedTab').should('have.text', 'account'); - + cy.get('#tab-button-contact').click(); - + cy.get('#ionTabsWillChangeCounter').should('have.text', '2'); cy.get('#ionTabsWillChangeEvent').should('have.text', 'contact'); cy.get('#ionTabsWillChangeSelectedTab').should('have.text', 'account'); - + cy.get('#ionTabsDidChangeCounter').should('have.text', '2'); cy.get('#ionTabsDidChangeEvent').should('have.text', 'contact'); cy.get('#ionTabsDidChangeSelectedTab').should('have.text', 'contact'); }) - + }); - + it('should simulate stack + double tab click', () => { let tab = getSelectedTab(); tab.find('#goto-tab1-page2').click(); testTabTitle('Tab 1 - Page 2 (1)'); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab1-nested']); testState(1, 'account'); - + // When you call find on tab above it changes the value of tab // so we need to redefine it tab = getSelectedTab(); tab.find('ion-back-button').should('be.visible'); - + cy.get('#tab-button-contact').click(); testTabTitle('Tab 2 - Page 1'); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab1-nested', 'app-tabs-tab2']); testState(2, 'contact'); - + cy.get('#tab-button-account').click(); testTabTitle('Tab 1 - Page 2 (1)'); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab1-nested', 'app-tabs-tab2']); testState(3, 'account'); - + tab = getSelectedTab(); tab.find('ion-back-button').should('be.visible'); - + cy.get('#tab-button-account').click(); testTabTitle('Tab 1 - Page 1'); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab2']); testState(3, 'account'); }); - + it('should simulate stack + back button click', () => { const tab = getSelectedTab(); tab.find('#goto-tab1-page2').click(); testTabTitle('Tab 1 - Page 2 (1)'); testState(1, 'account'); - + cy.get('#tab-button-contact').click(); testTabTitle('Tab 2 - Page 1'); testState(2, 'contact'); - + cy.get('#tab-button-account').click(); testTabTitle('Tab 1 - Page 2 (1)'); testState(3, 'account'); - + cy.get('ion-back-button').click(); testTabTitle('Tab 1 - Page 1'); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab2']); testState(3, 'account'); }); - + it('should navigate deep then go home', () => { const tab = getSelectedTab(); tab.find('#goto-tab1-page2').click(); cy.ionPageVisible('app-tabs-tab1-nested'); cy.ionPageHidden('app-tabs-tab1'); - + testTabTitle('Tab 1 - Page 2 (1)'); - + cy.get('#goto-next').click(); cy.ionPageVisible('app-tabs-tab1-nested:last-of-type'); cy.ionPageHidden('app-tabs-tab1-nested:first-of-type'); - + testTabTitle('Tab 1 - Page 2 (2)'); - + cy.get('#tab-button-contact').click(); cy.ionPageVisible('app-tabs-tab2'); cy.ionPageHidden('app-tabs-tab1-nested:last-of-type'); - + testTabTitle('Tab 2 - Page 1'); - + cy.get('#tab-button-account').click(); cy.ionPageVisible('app-tabs-tab1-nested:last-of-type'); cy.ionPageHidden('app-tabs-tab2'); - + testTabTitle('Tab 1 - Page 2 (2)'); cy.testStack('ion-tabs ion-router-outlet', [ 'app-tabs-tab1', @@ -126,9 +126,9 @@ describe('Tabs', () => { 'app-tabs-tab1-nested', 'app-tabs-tab2' ]); - + cy.get('#tab-button-account').click(); - + /** * Wait for the leaving view to * be unmounted otherwise testTabTitle @@ -137,65 +137,65 @@ describe('Tabs', () => { */ cy.ionPageVisible('app-tabs-tab1'); cy.ionPageDoesNotExist('app-tabs-tab1-nested'); - + testTabTitle('Tab 1 - Page 1'); cy.testStack('ion-tabs ion-router-outlet', [ 'app-tabs-tab1', 'app-tabs-tab2' ]); }); - + it('should switch tabs and go back', () => { cy.get('#tab-button-contact').click(); const tab = testTabTitle('Tab 2 - Page 1'); - + tab.find('#goto-tab1-page1').click(); testTabTitle('Tab 1 - Page 1'); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab2']); }); - + it('should switch tabs and go to nested', () => { cy.get('#tab-button-contact').click(); const tab = testTabTitle('Tab 2 - Page 1'); - + tab.find('#goto-tab1-page2').click(); testTabTitle('Tab 1 - Page 2 (1)'); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab2', 'app-tabs-tab1-nested']); }); - + it('should load lazy loaded tab', () => { cy.get('#tab-button-lazy').click(); cy.ionPageVisible('app-tabs-tab3'); testTabTitle('Tab 3 - Page 1'); }); - + it('should use ion-back-button defaultHref', () => { let tab = getSelectedTab(); tab.find('#goto-tab3-page2').click(); testTabTitle('Tab 3 - Page 2'); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab3-nested']); - + tab = getSelectedTab(); tab.find('ion-back-button').click(); testTabTitle('Tab 3 - Page 1'); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab3']); }); - + it('should preserve navigation extras when switching tabs', () => { const expectUrlToContain = 'search=hello#fragment'; let tab = getSelectedTab(); tab.find('#goto-nested-page1-with-query-params').click(); testTabTitle('Tab 1 - Page 2 (1)'); testUrlContains(expectUrlToContain); - + cy.get('#tab-button-contact').click(); testTabTitle('Tab 2 - Page 1'); - + cy.get('#tab-button-account').click(); tab = testTabTitle('Tab 1 - Page 2 (1)'); testUrlContains(expectUrlToContain); }); - + it('should set root when clicking on an active tab to navigate to the root', () => { const expectNestedTabUrlToContain = 'search=hello#fragment'; cy.url().then(url => { @@ -203,74 +203,74 @@ describe('Tabs', () => { tab.find('#goto-nested-page1-with-query-params').click(); testTabTitle('Tab 1 - Page 2 (1)'); testUrlContains(expectNestedTabUrlToContain); - + cy.get('#tab-button-account').click(); testTabTitle('Tab 1 - Page 1'); - + testUrlEquals(url); }) }); }) - + describe('entry tab contains navigation extras', () => { const expectNestedTabUrlToContain = 'search=hello#fragment'; const rootUrlParams = 'test=123#rootFragment'; const rootUrl = `/lazy/tabs/account?${rootUrlParams}`; - + beforeEach(() => { cy.visit(rootUrl); }) - + it('should preserve root url navigation extras when clicking on an active tab to navigate to the root', () => { const tab = getSelectedTab(); tab.find('#goto-nested-page1-with-query-params').click(); - + testTabTitle('Tab 1 - Page 2 (1)'); testUrlContains(expectNestedTabUrlToContain); - + cy.get('#tab-button-account').click(); testTabTitle('Tab 1 - Page 1'); - + testUrlContains(rootUrl); }); - + it('should preserve root url navigation extras when changing tabs', () => { getSelectedTab(); cy.get('#tab-button-contact').click(); testTabTitle('Tab 2 - Page 1'); - + cy.get('#tab-button-account').click(); testTabTitle('Tab 1 - Page 1'); - + testUrlContains(rootUrl); }); - + it('should navigate deep then go home and preserve navigation extras', () => { let tab = getSelectedTab(); tab.find('#goto-tab1-page2').click(); cy.ionPageVisible('app-tabs-tab1-nested'); cy.ionPageHidden('app-tabs-tab1'); - + tab = testTabTitle('Tab 1 - Page 2 (1)'); - + tab.find('#goto-next').click(); cy.ionPageVisible('app-tabs-tab1-nested:last-of-type'); cy.ionPageHidden('app-tabs-tab1-nested:first-of-type'); - + testTabTitle('Tab 1 - Page 2 (2)'); - + cy.ionTabClick('Tab Two'); cy.ionPageVisible('app-tabs-tab2'); cy.ionPageHidden('app-tabs-tab1-nested:last-of-type'); - + testTabTitle('Tab 2 - Page 1'); - + cy.ionTabClick('Tab One'); cy.ionPageVisible('app-tabs-tab1-nested:last-of-type'); cy.ionPageHidden('app-tabs-tab2'); - + testTabTitle('Tab 1 - Page 2 (2)'); - + cy.ionTabClick('Tab One'); /** * Wait for the leaving view to @@ -280,37 +280,37 @@ describe('Tabs', () => { */ cy.ionPageVisible('app-tabs-tab1'); cy.ionPageDoesNotExist('app-tabs-tab1-nested'); - + testTabTitle('Tab 1 - Page 1'); - + testUrlContains(rootUrl); }); }) - + describe('entry url - /tabs/account', () => { beforeEach(() => { cy.visit('/lazy/tabs/account'); }); it('should pop to previous view when leaving tabs outlet', () => { - + cy.get('ion-title').should('contain.text', 'Tab 1 - Page 1'); - + cy.get('#goto-tab1-page2').click(); - + cy.get('ion-title').should('contain.text', 'Tab 1 - Page 2 (1)'); - + cy.get('#goto-global').click(); - + cy.get('ion-title').should('contain.text', 'Global Page'); - + cy.get('#goto-prev-pop').click(); - + cy.get('ion-title').should('contain.text', 'Tab 1 - Page 2 (1)'); - + cy.get('#goto-prev').click(); - + cy.get('ion-title').should('contain.text', 'Tab 1 - Page 1'); - + /** * Verifies that when entering the tabs outlet directly, * the navController.pop() method does not pop the previous view, @@ -320,117 +320,117 @@ describe('Tabs', () => { cy.get('ion-title').should('contain.text', 'Tab 1 - Page 1'); }); }); - + describe('entry url - /', () => { it('should pop to the root outlet from the tabs outlet', () => { cy.visit('/lazy/'); - + cy.get('ion-title').should('contain.text', 'Test App'); - - cy.get('ion-item').contains('Tabs test').click(); - + + cy.get('ion-item').contains('Tabs Test').click(); + cy.get('ion-title').should('contain.text', 'Tab 1 - Page 1'); - + cy.get('#goto-tab1-page2').click(); - + cy.get('ion-title').should('contain.text', 'Tab 1 - Page 2 (1)'); - + cy.get('#goto-global').click(); - + cy.get('ion-title').should('contain.text', 'Global Page'); - + cy.get('#goto-prev-pop').click(); - + cy.get('ion-title').should('contain.text', 'Tab 1 - Page 2 (1)'); - + cy.get('#goto-prev').click(); - + cy.get('ion-title').should('contain.text', 'Tab 1 - Page 1'); - + cy.get('#goto-previous-page').click(); - + cy.get('ion-title').should('contain.text', 'Test App'); - + }); }); - - + + describe('entry url - /tabs/account/nested/1', () => { beforeEach(() => { cy.visit('/lazy/tabs/account/nested/1'); }) - + it('should only display the back-button when there is a page in the stack', () => { let tab = getSelectedTab(); tab.find('ion-back-button').should('not.be.visible'); testTabTitle('Tab 1 - Page 2 (1)'); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1-nested']); - + cy.get('#tab-button-account').click(); tab = testTabTitle('Tab 1 - Page 1'); - + tab.find('#goto-tab1-page2').click(); tab = testTabTitle('Tab 1 - Page 2 (1)'); tab.find('ion-back-button').should('be.visible'); }); - + it('should not reuse the same page', () => { let tab = testTabTitle('Tab 1 - Page 2 (1)'); tab.find('#goto-next').click(); tab = testTabTitle('Tab 1 - Page 2 (2)'); - + tab.find('#goto-next').click(); tab = testTabTitle('Tab 1 - Page 2 (3)'); - + cy.testStack('ion-tabs ion-router-outlet', [ 'app-tabs-tab1-nested', 'app-tabs-tab1-nested', 'app-tabs-tab1-nested' ]); - + tab = getSelectedTab(); tab.find('ion-back-button').click(); tab = testTabTitle('Tab 1 - Page 2 (2)'); tab.find('ion-back-button').click(); tab = testTabTitle('Tab 1 - Page 2 (1)'); - + tab.find('ion-back-button').should('not.be.visible'); - + cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1-nested']); }); }) - + describe('entry url - /tabs/lazy', () => { beforeEach(() => { cy.visit('/lazy/tabs/lazy'); }); - + it('should not display the back-button if coming from a different stack', () => { let tab = testTabTitle('Tab 3 - Page 1'); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab3']); - + tab = getSelectedTab(); tab.find('#goto-tab1-page2').click(); cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab3', 'app-tabs-tab1-nested']); - + tab = testTabTitle('Tab 1 - Page 2 (1)'); tab.find('ion-back-button').should('not.be.visible'); }); }) - + describe('enter url - /tabs/contact/one', () => { beforeEach(() => { cy.visit('/lazy/tabs/contact/one'); }); - + it('should return to correct tab after going to page in different outlet', () => { const tab = getSelectedTab(); tab.find('#goto-nested-page1').click(); cy.testStack('app-nested-outlet ion-router-outlet', ['app-nested-outlet-page']); - + const nestedOutlet = cy.get('app-nested-outlet'); nestedOutlet.find('ion-back-button').click(); - + testTabTitle('Tab 2 - Page 1'); }); }) diff --git a/packages/angular/test/base/src/app/app-landing/app-landing.component.html b/packages/angular/test/base/src/app/app-landing/app-landing.component.html new file mode 100644 index 00000000000..8689c0e29bc --- /dev/null +++ b/packages/angular/test/base/src/app/app-landing/app-landing.component.html @@ -0,0 +1,16 @@ + + + Test App - Angular {{ angularVersion.major }} + + + + + + + Go to Lazy App + + + Go to Standalone App + + + diff --git a/packages/angular/test/base/src/app/app-landing/app-landing.component.ts b/packages/angular/test/base/src/app/app-landing/app-landing.component.ts new file mode 100644 index 00000000000..62814291cdd --- /dev/null +++ b/packages/angular/test/base/src/app/app-landing/app-landing.component.ts @@ -0,0 +1,13 @@ +import { Component, VERSION } from '@angular/core'; + +@Component({ + selector: 'app-landing', + templateUrl: './app-landing.component.html', + standalone: false +}) +export class AppLandingComponent { + angularVersion = VERSION; + + constructor() {} + +} diff --git a/packages/angular/test/base/src/app/app.module.ts b/packages/angular/test/base/src/app/app.module.ts index 9d0a2a78eab..c419cd6d0d8 100644 --- a/packages/angular/test/base/src/app/app.module.ts +++ b/packages/angular/test/base/src/app/app.module.ts @@ -1,30 +1,29 @@ +import { APP_ID, NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; -import { NgModule } from '@angular/core'; import { RouteReuseStrategy } from '@angular/router'; - -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; +import { AppComponent } from './app.component'; +import { AppRoutingModule } from './app-routing.module'; +import { AppLandingComponent } from './app-landing/app-landing.component'; -const isLazy = window.location.href.includes('lazy'); - -const imports = [ - BrowserModule.withServerTransition({ appId: 'serverApp' }), - AppRoutingModule, -]; +const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'; -if (isLazy) { - imports.push(IonicModule.forRoot({ keyboardHeight: 12345 })); +export function ionicConfigFactory(): any { + const isLazy = isBrowser && window.location.href.includes('lazy'); + return isLazy ? { keyboardHeight: 12345 } : {}; } @NgModule({ - declarations: [ - AppComponent, + declarations: [AppComponent, AppLandingComponent], + imports: [ + BrowserModule, + AppRoutingModule, + IonicModule.forRoot(ionicConfigFactory()), ], - imports, providers: [ { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, + { provide: APP_ID, useValue: 'serverApp' }, ], - bootstrap: [AppComponent] + bootstrap: [AppComponent], }) -export class AppModule { } +export class AppModule {} diff --git a/packages/angular/test/base/src/app/app.routes.ts b/packages/angular/test/base/src/app/app.routes.ts index 679d1812259..291e96540de 100644 --- a/packages/angular/test/base/src/app/app.routes.ts +++ b/packages/angular/test/base/src/app/app.routes.ts @@ -1,16 +1,18 @@ import { Routes } from '@angular/router'; +import { AppLandingComponent } from './app-landing/app-landing.component'; export const routes: Routes = [ { path: '', pathMatch: 'full', - /** - * Omit the slash at the beginning - * so query params are preserved. - * https://github.com/angular/angular/issues/13315#issuecomment-427254639 - */ - redirectTo: 'lazy' + component: AppLandingComponent }, - { path: 'lazy', loadChildren: () => import('./lazy/app-lazy/app.module').then(m => m.AppModule) }, - { path: 'standalone', loadChildren: () => import('./standalone/app-standalone/app.routes').then(m => m.routes) } + { + path: 'lazy', + loadChildren: () => import('./lazy/app-lazy/app.module').then(m => m.AppModule) + }, + { + path: 'standalone', + loadChildren: () => import('./standalone/app-standalone/app.routes').then(m => m.routes) + } ]; diff --git a/packages/angular/test/base/src/app/lazy/home-page/home-page.component.html b/packages/angular/test/base/src/app/lazy/home-page/home-page.component.html index 7fdca9c50d8..80418148c5e 100644 --- a/packages/angular/test/base/src/app/lazy/home-page/home-page.component.html +++ b/packages/angular/test/base/src/app/lazy/home-page/home-page.component.html @@ -1,7 +1,10 @@ + + + - Test App - Angular {{ angularVersion.major }} + Test App - Angular {{ angularVersion.major }} - Lazy @@ -9,37 +12,37 @@ - Alerts test + Alerts Test - Inputs test + Inputs Test - Form test + Form Test - Modals test + Modals Test - Router link test + Router link Test - Tabs test + Tabs Test - Basic Tabs test + Basic Tabs Test diff --git a/packages/angular/test/base/src/app/standalone/app-standalone/app.component.ts b/packages/angular/test/base/src/app/standalone/app-standalone/app.component.ts index d51d38c860b..7940f8d10e1 100644 --- a/packages/angular/test/base/src/app/standalone/app-standalone/app.component.ts +++ b/packages/angular/test/base/src/app/standalone/app-standalone/app.component.ts @@ -1,12 +1,11 @@ import { Component } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { IonRouterOutlet, IonApp } from '@ionic/angular/standalone'; +import { IonApp, IonRouterOutlet } from '@ionic/angular/standalone'; @Component({ selector: 'app-root-standalone', templateUrl: './app.component.html', standalone: true, - imports: [RouterModule, IonRouterOutlet, IonApp] + imports: [IonRouterOutlet, IonApp] }) export class AppComponent { } 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 40afc7a68de..c58432e0e9d 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 @@ -6,6 +6,7 @@ export const routes: Routes = [ path: '', component: AppComponent, children: [ + { path: '', loadComponent: () => import('../home-page/home-page.component').then(c => c.HomePageComponent) }, { path: 'menu-controller', loadComponent: () => import('../menu-controller/menu-controller.component').then(c => c.MenuControllerComponent) }, { path: 'action-sheet-controller', loadComponent: () => import('../action-sheet-controller/action-sheet-controller.component').then(c => c.ActionSheetControllerComponent) }, { path: 'popover', loadComponent: () => import('../popover/popover.component').then(c => c.PopoverComponent) }, @@ -18,6 +19,14 @@ export const routes: Routes = [ { path: 'overlay-controllers', loadComponent: () => import('../overlay-controllers/overlay-controllers.component').then(c => c.OverlayControllersComponent) }, { path: 'button', loadComponent: () => import('../button/button.component').then(c => c.ButtonComponent) }, { path: 'icon', loadComponent: () => import('../icon/icon.component').then(c => c.IconComponent) }, + { path: 'split-pane', redirectTo: '/standalone/split-pane/inbox', pathMatch: 'full' }, + { + path: 'split-pane', + loadComponent: () => import('../split-pane/split-pane.component').then(c => c.SplitPaneComponent), + children: [ + { path: ':id', loadComponent: () => import('../split-pane/split-pane-page.component').then(c => c.SplitPanePageComponent) }, + ] + }, { path: 'tabs', redirectTo: '/standalone/tabs/tab-one', pathMatch: 'full' }, { path: 'tabs', 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 new file mode 100644 index 00000000000..af57a62512c --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html @@ -0,0 +1,166 @@ + + + + + + + Test App - Angular {{ angularVersion.major }} - Standalone + + + + + + + Components + + + + Back Button Test + + + + + Button Test + + + + + Icon Test + + + + + + + Navigation + + + + Nav Test + + + + + Router Link Test + + + + + Router Outlet Test + + + + + Split Pane Test + + + + + Tabs Test + + + + + Tabs Basic Test + + + + + + + Overlays + + + + Action Sheet Controller Test + + + + + Menu Controller Test + + + + + Modal Test + + + + + Overlay Controllers Test + + + + + Popover Test + + + + + + + Value Accessors + + + + Checkbox Test + + + + + Datetime Test + + + + + Input Test + + + + + Radio Group Test + + + + + Range Test + + + + + Searchbar Test + + + + + Segment Test + + + + + Select Test + + + + + Textarea Test + + + + + Toggle Test + + + + + + + Miscellaneous + + + + Providers Test + + + + diff --git a/packages/angular/test/base/src/app/standalone/home-page/home-page.component.ts b/packages/angular/test/base/src/app/standalone/home-page/home-page.component.ts new file mode 100644 index 00000000000..dc2d78e6ab9 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/home-page/home-page.component.ts @@ -0,0 +1,15 @@ +import { Component, VERSION } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { IonBackButton, IonButtons, IonContent, IonLabel, IonList, IonListHeader, IonHeader, IonItem, IonRouterLink, IonTitle, IonToolbar } from '@ionic/angular/standalone'; + +@Component({ + selector: 'app-home-page', + templateUrl: './home-page.component.html', + standalone: true, + imports: [ IonBackButton, IonButtons, IonContent, IonLabel, IonList, IonHeader, IonListHeader, IonItem, IonRouterLink, IonTitle, IonToolbar, RouterModule ] +}) +export class HomePageComponent { + angularVersion = VERSION; + + constructor() {} +} diff --git a/packages/angular/test/base/src/app/standalone/router-link/router-link.component.ts b/packages/angular/test/base/src/app/standalone/router-link/router-link.component.ts index 4e0e1bcff3c..31653f3bb0d 100644 --- a/packages/angular/test/base/src/app/standalone/router-link/router-link.component.ts +++ b/packages/angular/test/base/src/app/standalone/router-link/router-link.component.ts @@ -1,11 +1,11 @@ import { Component } from '@angular/core'; -import { RouterModule } from '@angular/router'; +import { RouterLink } from '@angular/router'; import { IonRouterLink, IonRouterLinkWithHref } from '@ionic/angular/standalone'; @Component({ selector: 'app-router-link', templateUrl: './router-link.component.html', standalone: true, - imports: [RouterModule, IonRouterLink, IonRouterLinkWithHref], + imports: [RouterLink, IonRouterLink, IonRouterLinkWithHref], }) export class RouterLinkComponent {} diff --git a/packages/angular/test/base/src/app/standalone/split-pane/split-pane-page.component.html b/packages/angular/test/base/src/app/standalone/split-pane/split-pane-page.component.html new file mode 100644 index 00000000000..3d03206fee4 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/split-pane/split-pane-page.component.html @@ -0,0 +1,23 @@ + + + + + + {{ folder }} + + + + + + + {{ folder }} + + + +
+ Button One + Button Two + Button Three + Button Four +
+
diff --git a/packages/angular/test/base/src/app/standalone/split-pane/split-pane-page.component.ts b/packages/angular/test/base/src/app/standalone/split-pane/split-pane-page.component.ts new file mode 100644 index 00000000000..d913c6a3b64 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/split-pane/split-pane-page.component.ts @@ -0,0 +1,24 @@ +import { Component, inject, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { IonButton, IonButtons, IonContent, IonHeader, IonMenuButton, IonTitle, IonToolbar } from '@ionic/angular/standalone'; + +@Component({ + selector: 'app-split-pane-page', + templateUrl: './split-pane-page.component.html', + imports: [ IonButton, IonButtons, IonContent, IonHeader, IonMenuButton, IonTitle, IonToolbar ], + standalone: true, +}) +export class SplitPanePageComponent implements OnInit { + public folder!: string; + private activatedRoute = inject(ActivatedRoute); + + constructor() {} + + ngOnInit() { + this.folder = this.activatedRoute.snapshot.paramMap.get('id') as string; + } + + onClick(val: string) { + console.log(val); + } +} diff --git a/packages/angular/test/base/src/app/standalone/split-pane/split-pane.component.css b/packages/angular/test/base/src/app/standalone/split-pane/split-pane.component.css new file mode 100644 index 00000000000..f91c443385e --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/split-pane/split-pane.component.css @@ -0,0 +1,3 @@ +ion-item.selected { + --background: rgb(var(--ion-color-primary-rgb, 0, 84, 233), 0.14); +} diff --git a/packages/angular/test/base/src/app/standalone/split-pane/split-pane.component.html b/packages/angular/test/base/src/app/standalone/split-pane/split-pane.component.html new file mode 100644 index 00000000000..89a192dc6e3 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/split-pane/split-pane.component.html @@ -0,0 +1,22 @@ + + + + + Inbox + + + + {{ p.title }} + + + + + + + diff --git a/packages/angular/test/base/src/app/standalone/split-pane/split-pane.component.ts b/packages/angular/test/base/src/app/standalone/split-pane/split-pane.component.ts new file mode 100644 index 00000000000..747e28d75f5 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/split-pane/split-pane.component.ts @@ -0,0 +1,49 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { RouterLink, RouterLinkActive } from '@angular/router'; +import { + IonContent, + IonItem, + IonLabel, + IonList, + IonListHeader, + IonMenu, + IonMenuToggle, + IonRouterLink, + IonRouterOutlet, + IonSplitPane +} from '@ionic/angular/standalone'; + +@Component({ + selector: 'app-split-pane', + templateUrl: 'split-pane.component.html', + styleUrls: ['split-pane.component.css'], + standalone: true, + imports: [ + CommonModule, + IonContent, + IonItem, + IonLabel, + IonList, + IonListHeader, + IonMenu, + IonMenuToggle, + IonRouterLink, + IonRouterOutlet, + IonSplitPane, + RouterLink, + RouterLinkActive, + ], +}) +export class SplitPaneComponent { + public appPages = [ + { title: 'Inbox', url: '/standalone/split-pane/inbox' }, + { title: 'Outbox', url: '/standalone/split-pane/outbox' }, + { title: 'Favorites', url: '/standalone/split-pane/favorites' }, + { title: 'Archived', url: '/standalone/split-pane/archived' }, + { title: 'Trash', url: '/standalone/split-pane/trash' }, + { title: 'Spam', url: '/standalone/split-pane/spam'} + ]; + + constructor() { } +} diff --git a/packages/angular/test/base/src/app/standalone/standalone.component.ts b/packages/angular/test/base/src/app/standalone/standalone.component.ts index 56f6f8a92b0..9b707ade839 100644 --- a/packages/angular/test/base/src/app/standalone/standalone.component.ts +++ b/packages/angular/test/base/src/app/standalone/standalone.component.ts @@ -1,5 +1,4 @@ import { Component } from "@angular/core"; -import { RouterModule } from "@angular/router"; import { IonicModule } from '@ionic/angular'; @@ -7,6 +6,6 @@ import { IonicModule } from '@ionic/angular'; selector: 'app-standalone', templateUrl: './standalone.component.html', standalone: true, - imports: [IonicModule, RouterModule] + imports: [IonicModule] }) export class StandaloneComponent { } diff --git a/packages/docs/CHANGELOG.md b/packages/docs/CHANGELOG.md index abf78b68eb8..a13b889de90 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.5.2](https://github.com/ionic-team/ionic-framework/compare/v8.5.1...v8.5.2) (2025-03-26) + +**Note:** Version bump only for package @ionic/docs + + + + + ## [8.5.1](https://github.com/ionic-team/ionic-framework/compare/v8.5.0...v8.5.1) (2025-03-19) **Note:** Version bump only for package @ionic/docs diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index d753d3f0c24..00f58e23541 100644 --- a/packages/docs/package-lock.json +++ b/packages/docs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/docs", - "version": "8.5.1", + "version": "8.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/docs", - "version": "8.5.1", + "version": "8.5.2", "license": "MIT" } } diff --git a/packages/docs/package.json b/packages/docs/package.json index 6b7e6db698a..ad6c1484bee 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/docs", - "version": "8.5.1", + "version": "8.5.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 5d389fd1e5d..03237b6be35 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.5.2](https://github.com/ionic-team/ionic-framework/compare/v8.5.1...v8.5.2) (2025-03-26) + +**Note:** Version bump only for package @ionic/react-router + + + + + ## [8.5.1](https://github.com/ionic-team/ionic-framework/compare/v8.5.0...v8.5.1) (2025-03-19) **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 cfe240a607a..225b2af912c 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.5.1", + "version": "8.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react-router", - "version": "8.5.1", + "version": "8.5.2", "license": "MIT", "dependencies": { - "@ionic/react": "^8.5.1", + "@ionic/react": "^8.5.2", "tslib": "*" }, "devDependencies": { @@ -238,9 +238,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.1.tgz", - "integrity": "sha512-XsI1ImfgO87EdNucfmKESPN4djLyclNTwzU2AY7xSzSonKjTAft6qrK1/qU2ys829bmbM7/4+tHFb0UOnt3uHQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.2.tgz", + "integrity": "sha512-XTiZqyLv2gzPzU4l4EvegHc2nDv5TniVU102MAxT739Lw0tFywZV9R1bv590z7Ue7w43ndwGdnfLuOuBksSeRA==", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -415,12 +415,12 @@ } }, "node_modules/@ionic/react": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.5.1.tgz", - "integrity": "sha512-Z/kW91gUhs2f378jFoOic29RfDMIYi1PD1hfZtMGEAjSlFNQxBCeihz3kvdnn1WVfcuGb3CKanHF4DeKc11f8Q==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.5.2.tgz", + "integrity": "sha512-JU/v/wNixODaDFTSf4cM3R12nzstZGfRgat/DTesOLtjSb0Wgp36YM0xAk1Nsu9iHrL1OJA9mnJGOc4g2lwnLA==", "license": "MIT", "dependencies": { - "@ionic/core": "8.5.1", + "@ionic/core": "8.5.2", "ionicons": "^7.0.0", "tslib": "*" }, @@ -4067,9 +4067,9 @@ "dev": true }, "@ionic/core": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.1.tgz", - "integrity": "sha512-XsI1ImfgO87EdNucfmKESPN4djLyclNTwzU2AY7xSzSonKjTAft6qrK1/qU2ys829bmbM7/4+tHFb0UOnt3uHQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.2.tgz", + "integrity": "sha512-XTiZqyLv2gzPzU4l4EvegHc2nDv5TniVU102MAxT739Lw0tFywZV9R1bv590z7Ue7w43ndwGdnfLuOuBksSeRA==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -4172,11 +4172,11 @@ "dev": true }, "@ionic/react": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.5.1.tgz", - "integrity": "sha512-Z/kW91gUhs2f378jFoOic29RfDMIYi1PD1hfZtMGEAjSlFNQxBCeihz3kvdnn1WVfcuGb3CKanHF4DeKc11f8Q==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.5.2.tgz", + "integrity": "sha512-JU/v/wNixODaDFTSf4cM3R12nzstZGfRgat/DTesOLtjSb0Wgp36YM0xAk1Nsu9iHrL1OJA9mnJGOc4g2lwnLA==", "requires": { - "@ionic/core": "8.5.1", + "@ionic/core": "8.5.2", "ionicons": "^7.0.0", "tslib": "*" } diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 60cb0bed464..96d8730634e 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react-router", - "version": "8.5.1", + "version": "8.5.2", "description": "React Router wrapper for @ionic/react", "keywords": [ "ionic", @@ -36,7 +36,7 @@ "dist/" ], "dependencies": { - "@ionic/react": "^8.5.1", + "@ionic/react": "^8.5.2", "tslib": "*" }, "peerDependencies": { diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 62707e39fca..d114ed2efab 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.5.2](https://github.com/ionic-team/ionic-framework/compare/v8.5.1...v8.5.2) (2025-03-26) + +**Note:** Version bump only for package @ionic/react + + + + + ## [8.5.1](https://github.com/ionic-team/ionic-framework/compare/v8.5.0...v8.5.1) (2025-03-19) **Note:** Version bump only for package @ionic/react diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index 1003a231331..59119b75c75 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react", - "version": "8.5.1", + "version": "8.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react", - "version": "8.5.1", + "version": "8.5.2", "license": "MIT", "dependencies": { - "@ionic/core": "^8.5.1", + "@ionic/core": "^8.5.2", "ionicons": "^7.0.0", "tslib": "*" }, @@ -736,9 +736,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.1.tgz", - "integrity": "sha512-XsI1ImfgO87EdNucfmKESPN4djLyclNTwzU2AY7xSzSonKjTAft6qrK1/qU2ys829bmbM7/4+tHFb0UOnt3uHQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.2.tgz", + "integrity": "sha512-XTiZqyLv2gzPzU4l4EvegHc2nDv5TniVU102MAxT739Lw0tFywZV9R1bv590z7Ue7w43ndwGdnfLuOuBksSeRA==", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -12316,9 +12316,9 @@ "dev": true }, "@ionic/core": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.1.tgz", - "integrity": "sha512-XsI1ImfgO87EdNucfmKESPN4djLyclNTwzU2AY7xSzSonKjTAft6qrK1/qU2ys829bmbM7/4+tHFb0UOnt3uHQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.2.tgz", + "integrity": "sha512-XTiZqyLv2gzPzU4l4EvegHc2nDv5TniVU102MAxT739Lw0tFywZV9R1bv590z7Ue7w43ndwGdnfLuOuBksSeRA==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", diff --git a/packages/react/package.json b/packages/react/package.json index c40d2f4399b..2d26b855f76 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react", - "version": "8.5.1", + "version": "8.5.2", "description": "React specific wrapper for @ionic/core", "keywords": [ "ionic", @@ -39,7 +39,7 @@ "css/" ], "dependencies": { - "@ionic/core": "^8.5.1", + "@ionic/core": "^8.5.2", "ionicons": "^7.0.0", "tslib": "*" }, diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md index 671456d5b00..b3a448136c1 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.5.2](https://github.com/ionic-team/ionic-framework/compare/v8.5.1...v8.5.2) (2025-03-26) + +**Note:** Version bump only for package @ionic/vue-router + + + + + ## [8.5.1](https://github.com/ionic-team/ionic-framework/compare/v8.5.0...v8.5.1) (2025-03-19) **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 ef70086cefe..9faab53c286 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.5.1", + "version": "8.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue-router", - "version": "8.5.1", + "version": "8.5.2", "license": "MIT", "dependencies": { - "@ionic/vue": "^8.5.1" + "@ionic/vue": "^8.5.2" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", @@ -243,6 +243,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -252,6 +253,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -369,6 +371,7 @@ "version": "7.26.10", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.26.10" @@ -581,6 +584,7 @@ "version": "7.26.10", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -673,9 +677,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.1.tgz", - "integrity": "sha512-XsI1ImfgO87EdNucfmKESPN4djLyclNTwzU2AY7xSzSonKjTAft6qrK1/qU2ys829bmbM7/4+tHFb0UOnt3uHQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.2.tgz", + "integrity": "sha512-XTiZqyLv2gzPzU4l4EvegHc2nDv5TniVU102MAxT739Lw0tFywZV9R1bv590z7Ue7w43ndwGdnfLuOuBksSeRA==", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -865,12 +869,12 @@ } }, "node_modules/@ionic/vue": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.5.1.tgz", - "integrity": "sha512-pE4xBb85xkHKrM24Opi0FWnsjwvbpxf7062ZU8dQIArZVOwvwnX69OIbyR8tYZ49DWqhDzfRWdBXTmr30sMb5A==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.5.2.tgz", + "integrity": "sha512-LnhYkgkd6VKXh+nMQ1yFlG/lecU7014ZpniHauCl03w41BI5O87xdJ/7igcQJDTUH3n/s2inSGo9r7LR+eHLKQ==", "license": "MIT", "dependencies": { - "@ionic/core": "8.5.1", + "@ionic/core": "8.5.2", "@stencil/vue-output-target": "0.10.7", "ionicons": "^7.0.0" } @@ -1247,6 +1251,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -2089,6 +2094,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", @@ -2102,6 +2108,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-core": "3.5.13", @@ -2112,6 +2119,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", @@ -2129,6 +2137,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.5.13", @@ -2139,13 +2148,14 @@ "version": "6.6.4", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/@vue/reactivity": { "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "dev": true, "license": "MIT", "dependencies": { "@vue/shared": "3.5.13" @@ -2155,6 +2165,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "dev": true, "license": "MIT", "dependencies": { "@vue/reactivity": "3.5.13", @@ -2165,6 +2176,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "dev": true, "license": "MIT", "dependencies": { "@vue/reactivity": "3.5.13", @@ -2177,6 +2189,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-ssr": "3.5.13", @@ -2190,6 +2203,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "dev": true, "license": "MIT" }, "node_modules/abab": { @@ -2812,6 +2826,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, "license": "MIT" }, "node_modules/data-urls": { @@ -3004,6 +3019,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -3614,7 +3630,8 @@ "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true }, "node_modules/esutils": { "version": "2.0.3", @@ -5767,6 +5784,7 @@ "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -5890,6 +5908,7 @@ "version": "3.3.9", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "dev": true, "funding": [ { "type": "github", @@ -6165,6 +6184,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -6204,6 +6224,7 @@ "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, "funding": [ { "type": "opencollective", @@ -6642,6 +6663,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -7099,7 +7121,7 @@ "version": "4.7.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", - "devOptional": true, + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7165,6 +7187,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.5.13", @@ -7186,7 +7209,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@vue/devtools-api": "^6.6.4" @@ -7607,12 +7630,14 @@ "@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true }, "@babel/helper-validator-identifier": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true }, "@babel/helper-validator-option": { "version": "7.16.7", @@ -7704,6 +7729,7 @@ "version": "7.26.10", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "dev": true, "requires": { "@babel/types": "^7.26.10" } @@ -7858,6 +7884,7 @@ "version": "7.26.10", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "dev": true, "requires": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -7927,9 +7954,9 @@ "dev": true }, "@ionic/core": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.1.tgz", - "integrity": "sha512-XsI1ImfgO87EdNucfmKESPN4djLyclNTwzU2AY7xSzSonKjTAft6qrK1/qU2ys829bmbM7/4+tHFb0UOnt3uHQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.2.tgz", + "integrity": "sha512-XTiZqyLv2gzPzU4l4EvegHc2nDv5TniVU102MAxT739Lw0tFywZV9R1bv590z7Ue7w43ndwGdnfLuOuBksSeRA==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -8038,15 +8065,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@ionic/prettier-config/-/prettier-config-2.0.0.tgz", "integrity": "sha512-ageMx54B9qqS1scnFW3kQW2NW8HyXwUM/p9c1YSWFKr6Yct7YVNbJFY3EcFapaNTiDnwo+GLlPRt+wST6E8AfA==", - "dev": true, - "requires": {} + "dev": true }, "@ionic/vue": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.5.1.tgz", - "integrity": "sha512-pE4xBb85xkHKrM24Opi0FWnsjwvbpxf7062ZU8dQIArZVOwvwnX69OIbyR8tYZ49DWqhDzfRWdBXTmr30sMb5A==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.5.2.tgz", + "integrity": "sha512-LnhYkgkd6VKXh+nMQ1yFlG/lecU7014ZpniHauCl03w41BI5O87xdJ/7igcQJDTUH3n/s2inSGo9r7LR+eHLKQ==", "requires": { - "@ionic/core": "8.5.1", + "@ionic/core": "8.5.2", "@stencil/vue-output-target": "0.10.7", "ionicons": "^7.0.0" } @@ -8342,7 +8368,8 @@ "@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true }, "@jridgewell/trace-mapping": { "version": "0.3.13", @@ -8517,8 +8544,7 @@ "@stencil/vue-output-target": { "version": "0.10.7", "resolved": "https://registry.npmjs.org/@stencil/vue-output-target/-/vue-output-target-0.10.7.tgz", - "integrity": "sha512-IYxDe+SLCkwhwsWRdynE31rTK1zN3hVwwojQ/V9lrN8Gnx4PTvrUQHiRno9jFo1dk+EaBZWX9gZSmXta0ZaZew==", - "requires": {} + "integrity": "sha512-IYxDe+SLCkwhwsWRdynE31rTK1zN3hVwwojQ/V9lrN8Gnx4PTvrUQHiRno9jFo1dk+EaBZWX9gZSmXta0ZaZew==" }, "@tootallnate/once": { "version": "2.0.0", @@ -8893,6 +8919,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "dev": true, "requires": { "@babel/parser": "^7.25.3", "@vue/shared": "3.5.13", @@ -8905,6 +8932,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "dev": true, "requires": { "@vue/compiler-core": "3.5.13", "@vue/shared": "3.5.13" @@ -8914,6 +8942,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "dev": true, "requires": { "@babel/parser": "^7.25.3", "@vue/compiler-core": "3.5.13", @@ -8930,6 +8959,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "dev": true, "requires": { "@vue/compiler-dom": "3.5.13", "@vue/shared": "3.5.13" @@ -8939,12 +8969,13 @@ "version": "6.6.4", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", - "devOptional": true + "dev": true }, "@vue/reactivity": { "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "dev": true, "requires": { "@vue/shared": "3.5.13" } @@ -8953,6 +8984,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "dev": true, "requires": { "@vue/reactivity": "3.5.13", "@vue/shared": "3.5.13" @@ -8962,6 +8994,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "dev": true, "requires": { "@vue/reactivity": "3.5.13", "@vue/runtime-core": "3.5.13", @@ -8973,6 +9006,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "dev": true, "requires": { "@vue/compiler-ssr": "3.5.13", "@vue/shared": "3.5.13" @@ -8981,7 +9015,8 @@ "@vue/shared": { "version": "3.5.13", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==" + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "dev": true }, "abab": { "version": "2.0.6", @@ -9017,8 +9052,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { "version": "7.2.0", @@ -9437,7 +9471,8 @@ "csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true }, "data-urls": { "version": "3.0.2", @@ -9580,7 +9615,8 @@ "entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true }, "error-ex": { "version": "1.3.2", @@ -10038,7 +10074,8 @@ "estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true }, "esutils": { "version": "2.0.3", @@ -11223,8 +11260,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "28.0.2", @@ -11641,6 +11677,7 @@ "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, "requires": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -11734,7 +11771,8 @@ "nanoid": { "version": "3.3.9", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==" + "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "dev": true }, "natural-compare": { "version": "1.4.0", @@ -11928,7 +11966,8 @@ "picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true }, "picomatch": { "version": "2.3.1", @@ -11955,6 +11994,7 @@ "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, "requires": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -12236,7 +12276,8 @@ "source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true }, "source-map-support": { "version": "0.5.13", @@ -12572,7 +12613,7 @@ "version": "4.7.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", - "devOptional": true + "dev": true }, "unbox-primitive": { "version": "1.0.2", @@ -12622,6 +12663,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "dev": true, "requires": { "@vue/compiler-dom": "3.5.13", "@vue/compiler-sfc": "3.5.13", @@ -12634,7 +12676,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", - "devOptional": true, + "dev": true, "requires": { "@vue/devtools-api": "^6.6.4" } @@ -12768,8 +12810,7 @@ "version": "8.8.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", - "dev": true, - "requires": {} + "dev": true }, "xml-name-validator": { "version": "4.0.0", diff --git a/packages/vue-router/package.json b/packages/vue-router/package.json index a9b9926c9b4..3f9f3dce071 100644 --- a/packages/vue-router/package.json +++ b/packages/vue-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue-router", - "version": "8.5.1", + "version": "8.5.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.5.1" + "@ionic/vue": "^8.5.2" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index de4c273ca87..c12d4295ae7 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.5.2](https://github.com/ionic-team/ionic-framework/compare/v8.5.1...v8.5.2) (2025-03-26) + +**Note:** Version bump only for package @ionic/vue + + + + + ## [8.5.1](https://github.com/ionic-team/ionic-framework/compare/v8.5.0...v8.5.1) (2025-03-19) diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index d6b0221b66c..82aedbd17a1 100644 --- a/packages/vue/package-lock.json +++ b/packages/vue/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue", - "version": "8.5.1", + "version": "8.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue", - "version": "8.5.1", + "version": "8.5.2", "license": "MIT", "dependencies": { - "@ionic/core": "^8.5.1", + "@ionic/core": "^8.5.2", "@stencil/vue-output-target": "0.10.7", "ionicons": "^7.0.0" }, @@ -226,9 +226,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.1.tgz", - "integrity": "sha512-XsI1ImfgO87EdNucfmKESPN4djLyclNTwzU2AY7xSzSonKjTAft6qrK1/qU2ys829bmbM7/4+tHFb0UOnt3uHQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.2.tgz", + "integrity": "sha512-XTiZqyLv2gzPzU4l4EvegHc2nDv5TniVU102MAxT739Lw0tFywZV9R1bv590z7Ue7w43ndwGdnfLuOuBksSeRA==", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -4079,9 +4079,9 @@ "dev": true }, "@ionic/core": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.1.tgz", - "integrity": "sha512-XsI1ImfgO87EdNucfmKESPN4djLyclNTwzU2AY7xSzSonKjTAft6qrK1/qU2ys829bmbM7/4+tHFb0UOnt3uHQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.2.tgz", + "integrity": "sha512-XTiZqyLv2gzPzU4l4EvegHc2nDv5TniVU102MAxT739Lw0tFywZV9R1bv590z7Ue7w43ndwGdnfLuOuBksSeRA==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", diff --git a/packages/vue/package.json b/packages/vue/package.json index b31fa9c2815..4dd76298bec 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue", - "version": "8.5.1", + "version": "8.5.2", "description": "Vue specific wrapper for @ionic/core", "scripts": { "eslint": "eslint src", @@ -67,7 +67,7 @@ "vue-router": "^4.0.16" }, "dependencies": { - "@ionic/core": "^8.5.1", + "@ionic/core": "^8.5.2", "@stencil/vue-output-target": "0.10.7", "ionicons": "^7.0.0" },