From b587ccde56c72fa8291bd5a942d7e924ea429587 Mon Sep 17 00:00:00 2001 From: ionitron Date: Wed, 28 May 2025 18:16:34 +0000 Subject: [PATCH 1/5] chore(): update package lock files --- core/package-lock.json | 2 +- packages/angular-server/package-lock.json | 14 +++++------ packages/angular/package-lock.json | 14 +++++------ packages/docs/package-lock.json | 2 +- packages/react-router/package-lock.json | 30 +++++++++++------------ packages/react/package-lock.json | 14 +++++------ packages/vue-router/package-lock.json | 30 +++++++++++------------ packages/vue/package-lock.json | 14 +++++------ 8 files changed, 60 insertions(+), 60 deletions(-) diff --git a/core/package-lock.json b/core/package-lock.json index 982d35909ee..f724bbe3be6 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -18186,4 +18186,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/packages/angular-server/package-lock.json b/packages/angular-server/package-lock.json index 11679e87285..e953937dec6 100644 --- a/packages/angular-server/package-lock.json +++ b/packages/angular-server/package-lock.json @@ -1031,9 +1031,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.8.tgz", + "integrity": "sha512-RICgLpNOVw16AYeOswP68neu3w1zB90ApwDVSu+bchs3gxCNf34ic0O+fDLf3ZMqpfJ8qiJ6zNMgL5VqnWs30w==", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -7190,9 +7190,9 @@ "dev": true }, "@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.8.tgz", + "integrity": "sha512-RICgLpNOVw16AYeOswP68neu3w1zB90ApwDVSu+bchs3gxCNf34ic0O+fDLf3ZMqpfJ8qiJ6zNMgL5VqnWs30w==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -11112,4 +11112,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index 685b67051d1..0ae5ec51fd2 100644 --- a/packages/angular/package-lock.json +++ b/packages/angular/package-lock.json @@ -1398,9 +1398,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.8.tgz", + "integrity": "sha512-RICgLpNOVw16AYeOswP68neu3w1zB90ApwDVSu+bchs3gxCNf34ic0O+fDLf3ZMqpfJ8qiJ6zNMgL5VqnWs30w==", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -9821,9 +9821,9 @@ "dev": true }, "@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.8.tgz", + "integrity": "sha512-RICgLpNOVw16AYeOswP68neu3w1zB90ApwDVSu+bchs3gxCNf34ic0O+fDLf3ZMqpfJ8qiJ6zNMgL5VqnWs30w==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -15021,4 +15021,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index 8df32e21ce3..58de1d4db15 100644 --- a/packages/docs/package-lock.json +++ b/packages/docs/package-lock.json @@ -10,4 +10,4 @@ "license": "MIT" } } -} \ No newline at end of file +} diff --git a/packages/react-router/package-lock.json b/packages/react-router/package-lock.json index 8af1887227a..1a514ebad5c 100644 --- a/packages/react-router/package-lock.json +++ b/packages/react-router/package-lock.json @@ -238,9 +238,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.8.tgz", + "integrity": "sha512-RICgLpNOVw16AYeOswP68neu3w1zB90ApwDVSu+bchs3gxCNf34ic0O+fDLf3ZMqpfJ8qiJ6zNMgL5VqnWs30w==", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -415,12 +415,12 @@ } }, "node_modules/@ionic/react": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.5.7.tgz", - "integrity": "sha512-AgX4iu6SfuBhNgYr0H+K3oGsp7ESkCsnaqZdHRO2+GtKTmo4akMrFPihGj4LrZB/IaYwcvYQR/bPWHuZGJYsnw==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.5.8.tgz", + "integrity": "sha512-zb2WDIhH91QrO1v47kFVxblFJwdU2ukeAbSfV2ecM2BqluT5ro16Vz7GSkp4/e3+ULAgXJuPS5Zw8FdkI8+/UQ==", "license": "MIT", "dependencies": { - "@ionic/core": "8.5.7", + "@ionic/core": "8.5.8", "ionicons": "^7.0.0", "tslib": "*" }, @@ -4061,9 +4061,9 @@ "dev": true }, "@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.8.tgz", + "integrity": "sha512-RICgLpNOVw16AYeOswP68neu3w1zB90ApwDVSu+bchs3gxCNf34ic0O+fDLf3ZMqpfJ8qiJ6zNMgL5VqnWs30w==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -4167,11 +4167,11 @@ "requires": {} }, "@ionic/react": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.5.7.tgz", - "integrity": "sha512-AgX4iu6SfuBhNgYr0H+K3oGsp7ESkCsnaqZdHRO2+GtKTmo4akMrFPihGj4LrZB/IaYwcvYQR/bPWHuZGJYsnw==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.5.8.tgz", + "integrity": "sha512-zb2WDIhH91QrO1v47kFVxblFJwdU2ukeAbSfV2ecM2BqluT5ro16Vz7GSkp4/e3+ULAgXJuPS5Zw8FdkI8+/UQ==", "requires": { - "@ionic/core": "8.5.7", + "@ionic/core": "8.5.8", "ionicons": "^7.0.0", "tslib": "*" } @@ -6670,4 +6670,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index 6371cf31df2..d6322a1b922 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -736,9 +736,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.8.tgz", + "integrity": "sha512-RICgLpNOVw16AYeOswP68neu3w1zB90ApwDVSu+bchs3gxCNf34ic0O+fDLf3ZMqpfJ8qiJ6zNMgL5VqnWs30w==", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -12316,9 +12316,9 @@ "dev": true }, "@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.8.tgz", + "integrity": "sha512-RICgLpNOVw16AYeOswP68neu3w1zB90ApwDVSu+bchs3gxCNf34ic0O+fDLf3ZMqpfJ8qiJ6zNMgL5VqnWs30w==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -20499,4 +20499,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/packages/vue-router/package-lock.json b/packages/vue-router/package-lock.json index 0d3b81b49a1..bf5bd52e5e9 100644 --- a/packages/vue-router/package-lock.json +++ b/packages/vue-router/package-lock.json @@ -673,9 +673,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.8.tgz", + "integrity": "sha512-RICgLpNOVw16AYeOswP68neu3w1zB90ApwDVSu+bchs3gxCNf34ic0O+fDLf3ZMqpfJ8qiJ6zNMgL5VqnWs30w==", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -865,12 +865,12 @@ } }, "node_modules/@ionic/vue": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.5.7.tgz", - "integrity": "sha512-0eZ6CD65a1vrJdtn3MbXgU9c+LCsoAFPTawF1WZSgDaDjfeA/jhf8Hy+9hY8otjNOYSPJoy/n0ohUhi7kKK7cg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.5.8.tgz", + "integrity": "sha512-Ys3pXjHYjwlA9UnAFN+CmO+wzapuQH78EYomUor9T7Fb9ia7LRbp9mpnhWd2dfkz8H6DiM0Vy0aF9OMp4dgVvw==", "license": "MIT", "dependencies": { - "@ionic/core": "8.5.7", + "@ionic/core": "8.5.8", "@stencil/vue-output-target": "0.10.7", "ionicons": "^7.0.0" } @@ -7927,9 +7927,9 @@ "dev": true }, "@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.8.tgz", + "integrity": "sha512-RICgLpNOVw16AYeOswP68neu3w1zB90ApwDVSu+bchs3gxCNf34ic0O+fDLf3ZMqpfJ8qiJ6zNMgL5VqnWs30w==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -8042,11 +8042,11 @@ "requires": {} }, "@ionic/vue": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.5.7.tgz", - "integrity": "sha512-0eZ6CD65a1vrJdtn3MbXgU9c+LCsoAFPTawF1WZSgDaDjfeA/jhf8Hy+9hY8otjNOYSPJoy/n0ohUhi7kKK7cg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.5.8.tgz", + "integrity": "sha512-Ys3pXjHYjwlA9UnAFN+CmO+wzapuQH78EYomUor9T7Fb9ia7LRbp9mpnhWd2dfkz8H6DiM0Vy0aF9OMp4dgVvw==", "requires": { - "@ionic/core": "8.5.7", + "@ionic/core": "8.5.8", "@stencil/vue-output-target": "0.10.7", "ionicons": "^7.0.0" } @@ -12817,4 +12817,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index 2b389c892b9..1c143dd648a 100644 --- a/packages/vue/package-lock.json +++ b/packages/vue/package-lock.json @@ -222,9 +222,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.8.tgz", + "integrity": "sha512-RICgLpNOVw16AYeOswP68neu3w1zB90ApwDVSu+bchs3gxCNf34ic0O+fDLf3ZMqpfJ8qiJ6zNMgL5VqnWs30w==", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -4052,9 +4052,9 @@ "dev": true }, "@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.8.tgz", + "integrity": "sha512-RICgLpNOVw16AYeOswP68neu3w1zB90ApwDVSu+bchs3gxCNf34ic0O+fDLf3ZMqpfJ8qiJ6zNMgL5VqnWs30w==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -6644,4 +6644,4 @@ "dev": true } } -} \ No newline at end of file +} From 14f32f8feea7b3880367868ff0a2134b0c28cc07 Mon Sep 17 00:00:00 2001 From: Sean Perkins <13732623+sean-perkins@users.noreply.github.com> Date: Fri, 30 May 2025 14:11:26 -0400 Subject: [PATCH 2/5] fix(datetime): set working parts to last selected value (#29610) Issue number: resolves #29094 --------- ## What is the current behavior? When assigning multiple selected dates that span different months, the date time will not set the correct working parts and instead fallback to the default date: May 28, 2021. ## What is the new behavior? When opening the datetime with multiple dates selected, the calendar will animate to the last value in the array of selected dates. If the datetime is collapsed, body is not visible, is not a grid view or the user has made a selection of a new date, the calendar will not animate and instead will set the working parts to the current value selected (latest/last value). ## Does this introduce a breaking change? - [ ] Yes - [x] No ## Other information Internally we discussed setting the month view to the first value in the array. Upon further investigation I determined this is not the expected behavior. When a user interacts with multiple date selection, the most recent selection (their active view) is the **last** value in the array. Animating or updating the working parts to the first value in the array would result in the calendar month jumping after every selection. Using the last index of the array results in no odd jumps in the experience. If a developer wishes to configure this behavior, they can change the order of the values in the value assigned to the datetime (to cause a specific month/date to be the initial view). Dev build: `8.5.8-dev.11748388365.11ad9dfe` --------- Co-authored-by: Maria Hutt --- core/src/components/datetime/datetime.tsx | 75 +++++++------------ .../datetime/test/multiple/datetime.e2e.ts | 49 +++++++++--- 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/core/src/components/datetime/datetime.tsx b/core/src/components/datetime/datetime.tsx index b63590c66bb..ad9e9bc22ec 100644 --- a/core/src/components/datetime/datetime.tsx +++ b/core/src/components/datetime/datetime.tsx @@ -1263,21 +1263,20 @@ export class Datetime implements ComponentInterface { } /** - * If there are multiple values, pick an arbitrary one to clamp to. This way, - * if the values are across months, we always show at least one of them. Note - * that the values don't necessarily have to be in order. + * If there are multiple values, clamp to the last one. + * This is because the last value is the one that the user + * has most recently interacted with. */ - const singleValue = Array.isArray(valueToProcess) ? valueToProcess[0] : valueToProcess; + const singleValue = Array.isArray(valueToProcess) ? valueToProcess[valueToProcess.length - 1] : valueToProcess; const targetValue = clampDate(singleValue, minParts, maxParts); const { month, day, year, hour, minute } = targetValue; const ampm = parseAmPm(hour!); /** - * Since `activeParts` indicates a value that - * been explicitly selected either by the - * user or the app, only update `activeParts` - * if the `value` property is set. + * Since `activeParts` indicates a value that been explicitly selected + * either by the user or the app, only update `activeParts` if the + * `value` property is set. */ if (hasValue) { if (Array.isArray(valueToProcess)) { @@ -1301,53 +1300,29 @@ export class Datetime implements ComponentInterface { this.activeParts = []; } - /** - * Only animate if: - * 1. We're using grid style (wheel style pickers should just jump to new value) - * 2. The month and/or year actually changed, and both are defined (otherwise there's nothing to animate to) - * 3. The calendar body is visible (prevents animation when in collapsed datetime-button, for example) - * 4. The month/year picker is not open (since you wouldn't see the animation anyway) - */ const didChangeMonth = (month !== undefined && month !== workingParts.month) || (year !== undefined && year !== workingParts.year); const bodyIsVisible = el.classList.contains('datetime-ready'); const { isGridStyle, showMonthAndYear } = this; - let areAllSelectedDatesInSameMonth = true; - if (Array.isArray(valueToProcess)) { - const firstMonth = valueToProcess[0].month; - for (const date of valueToProcess) { - if (date.month !== firstMonth) { - areAllSelectedDatesInSameMonth = false; - break; - } - } - } - - /** - * If there is more than one date selected - * and the dates aren't all in the same month, - * then we should neither animate to the date - * nor update the working parts because we do - * not know which date the user wants to view. - */ - if (areAllSelectedDatesInSameMonth) { - if (isGridStyle && didChangeMonth && bodyIsVisible && !showMonthAndYear) { - this.animateToDate(targetValue); - } else { - /** - * We only need to do this if we didn't just animate to a new month, - * since that calls prevMonth/nextMonth which calls setWorkingParts for us. - */ - this.setWorkingParts({ - month, - day, - year, - hour, - minute, - ampm, - }); - } + if (isGridStyle && didChangeMonth && bodyIsVisible && !showMonthAndYear) { + /** + * Only animate if: + * 1. We're using grid style (wheel style pickers should just jump to new value) + * 2. The month and/or year actually changed, and both are defined (otherwise there's nothing to animate to) + * 3. The calendar body is visible (prevents animation when in collapsed datetime-button, for example) + * 4. The month/year picker is not open (since you wouldn't see the animation anyway) + */ + this.animateToDate(targetValue); + } else { + this.setWorkingParts({ + month, + day, + year, + hour, + minute, + ampm, + }); } }; diff --git a/core/src/components/datetime/test/multiple/datetime.e2e.ts b/core/src/components/datetime/test/multiple/datetime.e2e.ts index 0e2c0efb381..55a386f6f27 100644 --- a/core/src/components/datetime/test/multiple/datetime.e2e.ts +++ b/core/src/components/datetime/test/multiple/datetime.e2e.ts @@ -174,18 +174,6 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => { await expect(monthYear).toHaveText(/June 2022/); }); - test('should not scroll to new month when value is updated with dates in different months', async ({ page }) => { - const datetime = await datetimeFixture.goto(config, MULTIPLE_DATES); - await datetime.evaluate((el: HTMLIonDatetimeElement, dates: string[]) => { - el.value = dates; - }, MULTIPLE_DATES_SEPARATE_MONTHS); - - await page.waitForChanges(); - - const monthYear = datetime.locator('.calendar-month-year'); - await expect(monthYear).toHaveText(/June 2022/); - }); - test('with buttons, should only update value when confirm is called', async ({ page }) => { const datetime = await datetimeFixture.goto(config, SINGLE_DATE, { showDefaultButtons: true }); const june2Button = datetime.locator('[data-month="6"][data-day="2"]'); @@ -311,4 +299,41 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => { await expect(header).toHaveText('Mon, Oct 10'); }); }); + + test.describe('with selected days in different months', () => { + test(`set the active month view to the latest value's month`, async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/29094', + }); + + const datetime = await new DatetimeMultipleFixture(page).goto(config, MULTIPLE_DATES_SEPARATE_MONTHS); + const calendarMonthYear = datetime.locator('.calendar-month-year'); + + await expect(calendarMonthYear).toHaveText(/May 2022/); + }); + + test('does not change the active month view when selecting a day in a different month', async ({ + page, + }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/29094', + }); + + const datetime = await new DatetimeMultipleFixture(page).goto(config, MULTIPLE_DATES_SEPARATE_MONTHS); + const nextButton = page.locator('.calendar-next-prev ion-button:nth-child(2)'); + const calendarMonthYear = datetime.locator('.calendar-month-year'); + + await nextButton.click(); + + await expect(calendarMonthYear).toHaveText(/June 2022/); + + const june8Button = datetime.locator('[data-month="6"][data-day="8"]'); + + await june8Button.click(); + + await expect(calendarMonthYear).toHaveText(/June 2022/); + }); + }); }); From c62590a2d8c7df1923a900a23b5f8e24b6d87fca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20M=2E?= Date: Mon, 2 Jun 2025 19:49:00 +0100 Subject: [PATCH 3/5] chore(git): improve Ionitron to stop closing issues that have the 'needs: investigation' label (#30424) Issue number: internal --------- ## What is the current behavior? - Currently, `Ionitron` is closing issues when they have the `needs: investigation` label. - We might want to use the duplicate ticket as our source of truth since a community member has made a [suggestion](https://github.com/ionic-team/ionic-framework/issues/30380#issuecomment-2848626887) that could fix it. ## What is the new behavior? - The `ionic-issue-bot.yml` file was changed to stop closing issues that have the `needs: investigation` label - To prevent `Ionitron` from closing issues with the `needs: investigation` label, we've added this label to the `exemptLabels` list under the `stale`, `noReply`, and `noReproduction` sections. - This tells the bot not to close issues with that label, even if they meet the criteria for being stale or lacking a reply/reproduction. ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information - _N.A._ --------- Co-authored-by: Brandy Smith --- .github/ionic-issue-bot.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ionic-issue-bot.yml b/.github/ionic-issue-bot.yml index 8db735ce2d8..25fab64cb6e 100644 --- a/.github/ionic-issue-bot.yml +++ b/.github/ionic-issue-bot.yml @@ -93,6 +93,7 @@ stale: - "triage" - "type: bug" - "type: feature request" + - "needs: investigation" exemptAssigned: true exemptProjects: true exemptMilestones: true From 4cbbbb053ad36d176f1d79ad09777f94ca8076d2 Mon Sep 17 00:00:00 2001 From: Shane Date: Tue, 3 Jun 2025 08:47:11 -0700 Subject: [PATCH 4/5] fix(sheet): move sheet footers instead of cloning while dragging (#30433) Issue number: resolves several (listed at the bottom) + internal --------- ## What is the current behavior? Currently, when expand to scroll is disabled in a sheet modal, we duplicate the footer on drag and show a cloned version in the shadow DOM instead of the original. This causes many issues (described in the Other Information section), especially because often times the cloned version of the footer would stick around instead of the original version, which made any event listeners in the footer (and styling) broken by default instead of only while dragging. ## What is the new behavior? We are now following [method 2 of the design doc](https://github.com/ionic-team/ionic-framework-design-documents/blob/main/projects/ionic-framework/components/modal/0003-sheet-modal-scroll.md#approach-2-move-the-footer), with minor deviation. Now we try to eliminate the shaky behavior in the footer by setting the footer to be absolutely positioned on the page and adding padding to the bottom of the modal while dragging is happening to offset the missing footer content. We are additionally performing some extra logic to swap back when the modal is dragged below the height of the footer so that it collapses correctly visually. Note this is a minor variation in method two from the design doc because I moved the footer to the body instead of to the parent modal. This is because the parent modal will prevent anything not in its ion-page from displaying, but it seems to work fine. As a side-effect of this, I had to add an extra class and support for that class in a few areas so we could identify footers that belonged to modals while they were moving and apply applicable classes. Additionally with this change I was able to remove all of the extra code in the leave/enter animations because we no longer need to worry about managing a clone of an element there. This allows me to contain all code relating to behavior of the footer to `sheet.ts`. ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information This refactor in how the footer combats shakiness should resolve many issues caused by the previous implementation, including the following: - this change no longer has the footer being swapped out, effectively breaking event listeners, which fixes #30315 - this change no longer has the footer being duplicated at all, which fixes #30341 - this change no longer has the footer (sometimes) being moved to the shadow DOM, which fixes #30312 **Current dev build**: `8.5.8-dev.11748530383.18b4e301` --------- Co-authored-by: Israel de la Barrera Co-authored-by: Maria Hutt Co-authored-by: Brandy Smith --- .../components/modal/animations/ios.enter.ts | 45 +----- .../components/modal/animations/ios.leave.ts | 30 +--- .../components/modal/animations/md.enter.ts | 47 +----- .../components/modal/animations/md.leave.ts | 30 +--- core/src/components/modal/gestures/sheet.ts | 139 +++++++++++++----- core/src/components/modal/modal.ios.scss | 13 -- core/src/css/core.scss | 6 +- 7 files changed, 115 insertions(+), 195 deletions(-) diff --git a/core/src/components/modal/animations/ios.enter.ts b/core/src/components/modal/animations/ios.enter.ts index 3c8924f2889..34940062dd2 100644 --- a/core/src/components/modal/animations/ios.enter.ts +++ b/core/src/components/modal/animations/ios.enter.ts @@ -41,50 +41,7 @@ export const iosEnterAnimation = (baseEl: HTMLElement, opts: ModalAnimationOptio .addElement(baseEl) .easing('cubic-bezier(0.32,0.72,0,1)') .duration(500) - .addAnimation([wrapperAnimation]) - .beforeAddWrite(() => { - if (expandToScroll) { - // Scroll can only be done when the modal is fully expanded. - return; - } - - /** - * There are some browsers that causes flickering when - * dragging the content when scroll is enabled at every - * breakpoint. This is due to the wrapper element being - * transformed off the screen and having a snap animation. - * - * A workaround is to clone the footer element and append - * it outside of the wrapper element. This way, the footer - * is still visible and the drag can be done without - * flickering. The original footer is hidden until the modal - * is dismissed. This maintains the animation of the footer - * when the modal is dismissed. - * - * The workaround needs to be done before the animation starts - * so there are no flickering issues. - */ - const ionFooter = baseEl.querySelector('ion-footer'); - /** - * This check is needed to prevent more than one footer - * from being appended to the shadow root. - * Otherwise, iOS and MD enter animations would append - * the footer twice. - */ - const ionFooterAlreadyAppended = baseEl.shadowRoot!.querySelector('ion-footer'); - if (ionFooter && !ionFooterAlreadyAppended) { - const footerHeight = ionFooter.clientHeight; - const clonedFooter = ionFooter.cloneNode(true) as HTMLIonFooterElement; - - baseEl.shadowRoot!.appendChild(clonedFooter); - ionFooter.style.setProperty('display', 'none'); - ionFooter.setAttribute('aria-hidden', 'true'); - - // Padding is added to prevent some content from being hidden. - const page = baseEl.querySelector('.ion-page') as HTMLElement; - page.style.setProperty('padding-bottom', `${footerHeight}px`); - } - }); + .addAnimation([wrapperAnimation]); if (contentAnimation) { baseAnimation.addAnimation(contentAnimation); diff --git a/core/src/components/modal/animations/ios.leave.ts b/core/src/components/modal/animations/ios.leave.ts index 89ba3ce8427..914652878fa 100644 --- a/core/src/components/modal/animations/ios.leave.ts +++ b/core/src/components/modal/animations/ios.leave.ts @@ -19,7 +19,7 @@ const createLeaveAnimation = () => { * iOS Modal Leave Animation */ export const iosLeaveAnimation = (baseEl: HTMLElement, opts: ModalAnimationOptions, duration = 500): Animation => { - const { presentingEl, currentBreakpoint, expandToScroll } = opts; + const { presentingEl, currentBreakpoint } = opts; const root = getElementRoot(baseEl); const { wrapperAnimation, backdropAnimation } = currentBreakpoint !== undefined ? createSheetLeaveAnimation(opts) : createLeaveAnimation(); @@ -32,33 +32,7 @@ export const iosLeaveAnimation = (baseEl: HTMLElement, opts: ModalAnimationOptio .addElement(baseEl) .easing('cubic-bezier(0.32,0.72,0,1)') .duration(duration) - .addAnimation(wrapperAnimation) - .beforeAddWrite(() => { - if (expandToScroll) { - // Scroll can only be done when the modal is fully expanded. - return; - } - - /** - * If expandToScroll is disabled, we need to swap - * the visibility to the original, so the footer - * dismisses with the modal and doesn't stay - * until the modal is removed from the DOM. - */ - const ionFooter = baseEl.querySelector('ion-footer'); - if (ionFooter) { - const clonedFooter = baseEl.shadowRoot!.querySelector('ion-footer')!; - - ionFooter.style.removeProperty('display'); - ionFooter.removeAttribute('aria-hidden'); - - clonedFooter.style.setProperty('display', 'none'); - clonedFooter.setAttribute('aria-hidden', 'true'); - - const page = baseEl.querySelector('.ion-page') as HTMLElement; - page.style.removeProperty('padding-bottom'); - } - }); + .addAnimation(wrapperAnimation); if (presentingEl) { const isMobile = window.innerWidth < 768; diff --git a/core/src/components/modal/animations/md.enter.ts b/core/src/components/modal/animations/md.enter.ts index fee0efc4f64..97dc0a4b200 100644 --- a/core/src/components/modal/animations/md.enter.ts +++ b/core/src/components/modal/animations/md.enter.ts @@ -37,56 +37,13 @@ export const mdEnterAnimation = (baseEl: HTMLElement, opts: ModalAnimationOption // The content animation is only added if scrolling is enabled for // all the breakpoints. - expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page')!); + !expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page')!); const baseAnimation = createAnimation() .addElement(baseEl) .easing('cubic-bezier(0.36,0.66,0.04,1)') .duration(280) - .addAnimation([backdropAnimation, wrapperAnimation]) - .beforeAddWrite(() => { - if (expandToScroll) { - // Scroll can only be done when the modal is fully expanded. - return; - } - - /** - * There are some browsers that causes flickering when - * dragging the content when scroll is enabled at every - * breakpoint. This is due to the wrapper element being - * transformed off the screen and having a snap animation. - * - * A workaround is to clone the footer element and append - * it outside of the wrapper element. This way, the footer - * is still visible and the drag can be done without - * flickering. The original footer is hidden until the modal - * is dismissed. This maintains the animation of the footer - * when the modal is dismissed. - * - * The workaround needs to be done before the animation starts - * so there are no flickering issues. - */ - const ionFooter = baseEl.querySelector('ion-footer'); - /** - * This check is needed to prevent more than one footer - * from being appended to the shadow root. - * Otherwise, iOS and MD enter animations would append - * the footer twice. - */ - const ionFooterAlreadyAppended = baseEl.shadowRoot!.querySelector('ion-footer'); - if (ionFooter && !ionFooterAlreadyAppended) { - const footerHeight = ionFooter.clientHeight; - const clonedFooter = ionFooter.cloneNode(true) as HTMLIonFooterElement; - - baseEl.shadowRoot!.appendChild(clonedFooter); - ionFooter.style.setProperty('display', 'none'); - ionFooter.setAttribute('aria-hidden', 'true'); - - // Padding is added to prevent some content from being hidden. - const page = baseEl.querySelector('.ion-page') as HTMLElement; - page.style.setProperty('padding-bottom', `${footerHeight}px`); - } - }); + .addAnimation([backdropAnimation, wrapperAnimation]); if (contentAnimation) { baseAnimation.addAnimation(contentAnimation); diff --git a/core/src/components/modal/animations/md.leave.ts b/core/src/components/modal/animations/md.leave.ts index e453e9339cd..0caa73e0e84 100644 --- a/core/src/components/modal/animations/md.leave.ts +++ b/core/src/components/modal/animations/md.leave.ts @@ -21,7 +21,7 @@ const createLeaveAnimation = () => { * Md Modal Leave Animation */ export const mdLeaveAnimation = (baseEl: HTMLElement, opts: ModalAnimationOptions): Animation => { - const { currentBreakpoint, expandToScroll } = opts; + const { currentBreakpoint } = opts; const root = getElementRoot(baseEl); const { wrapperAnimation, backdropAnimation } = currentBreakpoint !== undefined ? createSheetLeaveAnimation(opts) : createLeaveAnimation(); @@ -32,33 +32,7 @@ export const mdLeaveAnimation = (baseEl: HTMLElement, opts: ModalAnimationOption const baseAnimation = createAnimation() .easing('cubic-bezier(0.47,0,0.745,0.715)') .duration(200) - .addAnimation([backdropAnimation, wrapperAnimation]) - .beforeAddWrite(() => { - if (expandToScroll) { - // Scroll can only be done when the modal is fully expanded. - return; - } - - /** - * If expandToScroll is disabled, we need to swap - * the visibility to the original, so the footer - * dismisses with the modal and doesn't stay - * until the modal is removed from the DOM. - */ - const ionFooter = baseEl.querySelector('ion-footer'); - if (ionFooter) { - const clonedFooter = baseEl.shadowRoot!.querySelector('ion-footer')!; - - ionFooter.style.removeProperty('display'); - ionFooter.removeAttribute('aria-hidden'); - - clonedFooter.style.setProperty('display', 'none'); - clonedFooter.setAttribute('aria-hidden', 'true'); - - const page = baseEl.querySelector('.ion-page') as HTMLElement; - page.style.removeProperty('padding-bottom'); - } - }); + .addAnimation([backdropAnimation, wrapperAnimation]); return baseAnimation; }; diff --git a/core/src/components/modal/gestures/sheet.ts b/core/src/components/modal/gestures/sheet.ts index 68df1a2ecaf..a3f548879f8 100644 --- a/core/src/components/modal/gestures/sheet.ts +++ b/core/src/components/modal/gestures/sheet.ts @@ -84,6 +84,9 @@ export const createSheetGesture = ( let offset = 0; let canDismissBlocksGesture = false; let cachedScrollEl: HTMLElement | null = null; + let cachedFooterEl: HTMLIonFooterElement | null = null; + let cachedFooterYPosition: number | null = null; + let currentFooterState: 'moving' | 'stationary' | null = null; const canDismissMaxStep = 0.95; const maxBreakpoint = breakpoints[breakpoints.length - 1]; const minBreakpoint = breakpoints[0]; @@ -118,33 +121,74 @@ export const createSheetGesture = ( }; /** - * Toggles the visible modal footer when `expandToScroll` is disabled. - * @param footer The footer to show. + * Toggles the footer to an absolute position while moving to prevent + * it from shaking while the sheet is being dragged. + * @param newPosition Whether the footer is in a moving or stationary position. */ - const swapFooterVisibility = (footer: 'original' | 'cloned') => { - const originalFooter = baseEl.querySelector('ion-footer') as HTMLIonFooterElement | null; - - if (!originalFooter) { - return; + const swapFooterPosition = (newPosition: 'moving' | 'stationary') => { + if (!cachedFooterEl) { + cachedFooterEl = baseEl.querySelector('ion-footer') as HTMLIonFooterElement | null; + if (!cachedFooterEl) { + return; + } } - const clonedFooter = wrapperEl.nextElementSibling as HTMLIonFooterElement; - const footerToHide = footer === 'original' ? clonedFooter : originalFooter; - const footerToShow = footer === 'original' ? originalFooter : clonedFooter; - - footerToShow.style.removeProperty('display'); - footerToShow.removeAttribute('aria-hidden'); - - const page = baseEl.querySelector('.ion-page') as HTMLElement; - if (footer === 'original') { - page.style.removeProperty('padding-bottom'); + const page = baseEl.querySelector('.ion-page') as HTMLElement | null; + + currentFooterState = newPosition; + if (newPosition === 'stationary') { + // Reset positioning styles to allow normal document flow + cachedFooterEl.classList.remove('modal-footer-moving'); + cachedFooterEl.style.removeProperty('position'); + cachedFooterEl.style.removeProperty('width'); + cachedFooterEl.style.removeProperty('height'); + cachedFooterEl.style.removeProperty('top'); + cachedFooterEl.style.removeProperty('left'); + page?.style.removeProperty('padding-bottom'); + + // Move to page + page?.appendChild(cachedFooterEl); } else { - const pagePadding = footerToShow.clientHeight; - page.style.setProperty('padding-bottom', `${pagePadding}px`); - } + // Get both the footer and document body positions + const cachedFooterElRect = cachedFooterEl.getBoundingClientRect(); + const bodyRect = document.body.getBoundingClientRect(); + + // Add padding to the parent element to prevent content from being hidden + // when the footer is positioned absolutely. This has to be done before we + // make the footer absolutely positioned or we may accidentally cause the + // sheet to scroll. + const footerHeight = cachedFooterEl.clientHeight; + page?.style.setProperty('padding-bottom', `${footerHeight}px`); + + // Apply positioning styles to keep footer at bottom + cachedFooterEl.classList.add('modal-footer-moving'); + + // Calculate absolute position relative to body + // We need to subtract the body's offsetTop to get true position within document.body + const absoluteTop = cachedFooterElRect.top - bodyRect.top; + const absoluteLeft = cachedFooterElRect.left - bodyRect.left; + + // Capture the footer's current dimensions and hard code them during the drag + cachedFooterEl.style.setProperty('position', 'absolute'); + cachedFooterEl.style.setProperty('width', `${cachedFooterEl.clientWidth}px`); + cachedFooterEl.style.setProperty('height', `${cachedFooterEl.clientHeight}px`); + cachedFooterEl.style.setProperty('top', `${absoluteTop}px`); + cachedFooterEl.style.setProperty('left', `${absoluteLeft}px`); + + // Also cache the footer Y position, which we use to determine if the + // sheet has been moved below the footer. When that happens, we need to swap + // the position back so it will collapse correctly. + cachedFooterYPosition = absoluteTop; + // If there's a toolbar, we need to combine the toolbar height with the footer position + // because the toolbar moves with the drag handle, so when it starts overlapping the footer, + // we need to account for that. + const toolbar = baseEl.querySelector('ion-toolbar') as HTMLIonToolbarElement | null; + if (toolbar) { + cachedFooterYPosition -= toolbar.clientHeight; + } - footerToHide.style.setProperty('display', 'none'); - footerToHide.setAttribute('aria-hidden', 'true'); + document.body.appendChild(cachedFooterEl); + } }; /** @@ -247,12 +291,11 @@ export const createSheetGesture = ( /** * If expandToScroll is disabled, we need to swap - * the footer visibility to the original, so if the modal - * is dismissed, the footer dismisses with the modal - * and doesn't stay on the screen after the modal is gone. + * the footer position to moving so that it doesn't shake + * while the sheet is being dragged. */ if (!expandToScroll) { - swapFooterVisibility('original'); + swapFooterPosition('moving'); } /** @@ -275,6 +318,21 @@ export const createSheetGesture = ( }; const onMove = (detail: GestureDetail) => { + /** + * If `expandToScroll` is disabled, we need to see if we're currently below + * the footer element and the footer is in a stationary position. If so, + * we need to make the stationary the original position so that the footer + * collapses with the sheet. + */ + if (!expandToScroll && cachedFooterYPosition !== null && currentFooterState !== null) { + // Check if we need to swap the footer position + if (detail.currentY >= cachedFooterYPosition && currentFooterState === 'moving') { + swapFooterPosition('stationary'); + } else if (detail.currentY < cachedFooterYPosition && currentFooterState === 'stationary') { + swapFooterPosition('moving'); + } + } + /** * If `expandToScroll` is disabled, and an upwards swipe gesture is done within * the scrollable content, we should not allow the swipe gesture to continue. @@ -431,15 +489,6 @@ export const createSheetGesture = ( */ gesture.enable(false); - /** - * If expandToScroll is disabled, we need to swap - * the footer visibility to the cloned one so the footer - * doesn't flicker when the sheet's height is animated. - */ - if (!expandToScroll && shouldRemainOpen) { - swapFooterVisibility('cloned'); - } - if (shouldPreventDismiss) { handleCanDismiss(baseEl, animation); } else if (!shouldRemainOpen) { @@ -457,11 +506,31 @@ export const createSheetGesture = ( contentEl.scrollY = true; } + /** + * If expandToScroll is disabled and we're animating + * to close the sheet, we need to swap + * the footer position to stationary so that it + * will collapse correctly. We cannot just always swap + * here or it'll be jittery while animating movement. + */ + if (!expandToScroll && snapToBreakpoint === 0) { + swapFooterPosition('stationary'); + } + return new Promise((resolve) => { animation .onFinish( () => { if (shouldRemainOpen) { + /** + * If expandToScroll is disabled, we need to swap + * the footer position to stationary so that it + * will act as it would by default. + */ + if (!expandToScroll) { + swapFooterPosition('stationary'); + } + /** * Once the snapping animation completes, * we need to reset the animation to go diff --git a/core/src/components/modal/modal.ios.scss b/core/src/components/modal/modal.ios.scss index dffb778e020..fc5e25e3d19 100644 --- a/core/src/components/modal/modal.ios.scss +++ b/core/src/components/modal/modal.ios.scss @@ -87,16 +87,3 @@ :host(.modal-sheet) .modal-wrapper { @include border-radius(var(--border-radius), var(--border-radius), 0, 0); } - -// iOS Sheet Modal - Scroll at all breakpoints -// -------------------------------------------------- - -/** - * Sheet modals require an additional padding as mentioned in the - * `core.scss` file. However, there's a workaround that requires - * a cloned footer to be added to the modal. This is only necessary - * because the core styles are not being applied to the cloned footer. - */ -:host(.modal-sheet.modal-no-expand-scroll) ion-footer ion-toolbar:first-of-type { - padding-top: $modal-sheet-padding-top; -} diff --git a/core/src/css/core.scss b/core/src/css/core.scss index 1cf0e8bfb7d..cf7560bd348 100644 --- a/core/src/css/core.scss +++ b/core/src/css/core.scss @@ -55,7 +55,8 @@ body.backdrop-no-scroll { */ html.ios ion-modal.modal-card ion-header ion-toolbar:first-of-type, html.ios ion-modal.modal-sheet ion-header ion-toolbar:first-of-type, -html.ios ion-modal ion-footer ion-toolbar:first-of-type { +html.ios ion-modal ion-footer ion-toolbar:first-of-type, +html.ios ion-footer.modal-footer-moving ion-toolbar:first-of-type { padding-top: $modal-sheet-padding-top; } @@ -74,7 +75,8 @@ html.ios ion-modal.modal-sheet ion-header ion-toolbar:last-of-type { * of toolbars while accounting for * safe area values when in landscape. */ -html.ios ion-modal ion-toolbar { +html.ios ion-modal ion-toolbar, +html.ios .modal-footer-moving ion-toolbar { padding-right: calc(var(--ion-safe-area-right) + 8px); padding-left: calc(var(--ion-safe-area-left) + 8px); } From 3b1a0eb00b5d5495da1a0040dfc244bd928cd420 Mon Sep 17 00:00:00 2001 From: ionitron Date: Wed, 4 Jun 2025 13:45:35 +0000 Subject: [PATCH 5/5] v8.5.9 --- CHANGELOG.md | 12 ++++++++++++ core/CHANGELOG.md | 12 ++++++++++++ core/package-lock.json | 6 +++--- core/package.json | 2 +- lerna.json | 2 +- packages/angular-server/CHANGELOG.md | 8 ++++++++ packages/angular-server/package-lock.json | 8 ++++---- packages/angular-server/package.json | 4 ++-- packages/angular/CHANGELOG.md | 8 ++++++++ packages/angular/package-lock.json | 8 ++++---- packages/angular/package.json | 4 ++-- packages/docs/CHANGELOG.md | 8 ++++++++ packages/docs/package-lock.json | 6 +++--- packages/docs/package.json | 2 +- packages/react-router/CHANGELOG.md | 8 ++++++++ packages/react-router/package-lock.json | 8 ++++---- packages/react-router/package.json | 4 ++-- packages/react/CHANGELOG.md | 8 ++++++++ packages/react/package-lock.json | 8 ++++---- packages/react/package.json | 4 ++-- packages/vue-router/CHANGELOG.md | 8 ++++++++ packages/vue-router/package-lock.json | 8 ++++---- packages/vue-router/package.json | 4 ++-- packages/vue/CHANGELOG.md | 8 ++++++++ packages/vue/package-lock.json | 8 ++++---- packages/vue/package.json | 4 ++-- 26 files changed, 125 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed14fc5c4c2..f39cc8bb901 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.5.9](https://github.com/ionic-team/ionic-framework/compare/v8.5.8...v8.5.9) (2025-06-04) + + +### Bug Fixes + +* **datetime:** set working parts to last selected value ([#29610](https://github.com/ionic-team/ionic-framework/issues/29610)) ([14f32f8](https://github.com/ionic-team/ionic-framework/commit/14f32f8feea7b3880367868ff0a2134b0c28cc07)), closes [#29094](https://github.com/ionic-team/ionic-framework/issues/29094) +* **sheet:** move sheet footers instead of cloning while dragging ([#30433](https://github.com/ionic-team/ionic-framework/issues/30433)) ([4cbbbb0](https://github.com/ionic-team/ionic-framework/commit/4cbbbb053ad36d176f1d79ad09777f94ca8076d2)) + + + + + ## [8.5.8](https://github.com/ionic-team/ionic-framework/compare/v8.5.7...v8.5.8) (2025-05-28) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index e650c07f599..b30e430e29f 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.5.9](https://github.com/ionic-team/ionic-framework/compare/v8.5.8...v8.5.9) (2025-06-04) + + +### Bug Fixes + +* **datetime:** set working parts to last selected value ([#29610](https://github.com/ionic-team/ionic-framework/issues/29610)) ([14f32f8](https://github.com/ionic-team/ionic-framework/commit/14f32f8feea7b3880367868ff0a2134b0c28cc07)), closes [#29094](https://github.com/ionic-team/ionic-framework/issues/29094) +* **sheet:** move sheet footers instead of cloning while dragging ([#30433](https://github.com/ionic-team/ionic-framework/issues/30433)) ([4cbbbb0](https://github.com/ionic-team/ionic-framework/commit/4cbbbb053ad36d176f1d79ad09777f94ca8076d2)) + + + + + ## [8.5.8](https://github.com/ionic-team/ionic-framework/compare/v8.5.7...v8.5.8) (2025-05-28) diff --git a/core/package-lock.json b/core/package-lock.json index f724bbe3be6..9eef72fe9f7 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/core", - "version": "8.5.8", + "version": "8.5.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/core", - "version": "8.5.8", + "version": "8.5.9", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -18186,4 +18186,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/core/package.json b/core/package.json index 8a748fe42bf..c208f540f80 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/core", - "version": "8.5.8", + "version": "8.5.9", "description": "Base components for Ionic", "keywords": [ "ionic", diff --git a/lerna.json b/lerna.json index 4321de60ceb..bfc2dd334cc 100644 --- a/lerna.json +++ b/lerna.json @@ -3,5 +3,5 @@ "core", "packages/*" ], - "version": "8.5.8" + "version": "8.5.9" } \ No newline at end of file diff --git a/packages/angular-server/CHANGELOG.md b/packages/angular-server/CHANGELOG.md index 5fd6bb48d4b..8c7960a28d4 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.9](https://github.com/ionic-team/ionic-framework/compare/v8.5.8...v8.5.9) (2025-06-04) + +**Note:** Version bump only for package @ionic/angular-server + + + + + ## [8.5.8](https://github.com/ionic-team/ionic-framework/compare/v8.5.7...v8.5.8) (2025-05-28) **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 e953937dec6..bff2daf637b 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.8", + "version": "8.5.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular-server", - "version": "8.5.8", + "version": "8.5.9", "license": "MIT", "dependencies": { - "@ionic/core": "^8.5.8" + "@ionic/core": "^8.5.9" }, "devDependencies": { "@angular-eslint/eslint-plugin": "^16.0.0", @@ -11112,4 +11112,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/angular-server/package.json b/packages/angular-server/package.json index 8865d88ef52..54962f715af 100644 --- a/packages/angular-server/package.json +++ b/packages/angular-server/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular-server", - "version": "8.5.8", + "version": "8.5.9", "description": "Angular SSR Module for Ionic", "keywords": [ "ionic", @@ -62,6 +62,6 @@ }, "prettier": "@ionic/prettier-config", "dependencies": { - "@ionic/core": "^8.5.8" + "@ionic/core": "^8.5.9" } } diff --git a/packages/angular/CHANGELOG.md b/packages/angular/CHANGELOG.md index aaf7d4fae50..6f5c61303d8 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.9](https://github.com/ionic-team/ionic-framework/compare/v8.5.8...v8.5.9) (2025-06-04) + +**Note:** Version bump only for package @ionic/angular + + + + + ## [8.5.8](https://github.com/ionic-team/ionic-framework/compare/v8.5.7...v8.5.8) (2025-05-28) **Note:** Version bump only for package @ionic/angular diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index 0ae5ec51fd2..be8fbf52817 100644 --- a/packages/angular/package-lock.json +++ b/packages/angular/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/angular", - "version": "8.5.8", + "version": "8.5.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular", - "version": "8.5.8", + "version": "8.5.9", "license": "MIT", "dependencies": { - "@ionic/core": "^8.5.8", + "@ionic/core": "^8.5.9", "ionicons": "^7.0.0", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" @@ -15021,4 +15021,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/angular/package.json b/packages/angular/package.json index 7e9fb6e3acb..26b46facdf4 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular", - "version": "8.5.8", + "version": "8.5.9", "description": "Angular specific wrappers for @ionic/core", "keywords": [ "ionic", @@ -47,7 +47,7 @@ } }, "dependencies": { - "@ionic/core": "^8.5.8", + "@ionic/core": "^8.5.9", "ionicons": "^7.0.0", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" diff --git a/packages/docs/CHANGELOG.md b/packages/docs/CHANGELOG.md index e267849cbf2..eb4a6e2bce2 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.9](https://github.com/ionic-team/ionic-framework/compare/v8.5.8...v8.5.9) (2025-06-04) + +**Note:** Version bump only for package @ionic/docs + + + + + ## [8.5.8](https://github.com/ionic-team/ionic-framework/compare/v8.5.7...v8.5.8) (2025-05-28) **Note:** Version bump only for package @ionic/docs diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index 58de1d4db15..fe3c71f9feb 100644 --- a/packages/docs/package-lock.json +++ b/packages/docs/package-lock.json @@ -1,13 +1,13 @@ { "name": "@ionic/docs", - "version": "8.5.8", + "version": "8.5.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/docs", - "version": "8.5.8", + "version": "8.5.9", "license": "MIT" } } -} +} \ No newline at end of file diff --git a/packages/docs/package.json b/packages/docs/package.json index e91697178d7..87d73382076 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/docs", - "version": "8.5.8", + "version": "8.5.9", "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 a45a58beac5..a838400170b 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.9](https://github.com/ionic-team/ionic-framework/compare/v8.5.8...v8.5.9) (2025-06-04) + +**Note:** Version bump only for package @ionic/react-router + + + + + ## [8.5.8](https://github.com/ionic-team/ionic-framework/compare/v8.5.7...v8.5.8) (2025-05-28) **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 1a514ebad5c..729050f868f 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.8", + "version": "8.5.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react-router", - "version": "8.5.8", + "version": "8.5.9", "license": "MIT", "dependencies": { - "@ionic/react": "^8.5.8", + "@ionic/react": "^8.5.9", "tslib": "*" }, "devDependencies": { @@ -6670,4 +6670,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 9d49091255a..b7490926c00 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react-router", - "version": "8.5.8", + "version": "8.5.9", "description": "React Router wrapper for @ionic/react", "keywords": [ "ionic", @@ -36,7 +36,7 @@ "dist/" ], "dependencies": { - "@ionic/react": "^8.5.8", + "@ionic/react": "^8.5.9", "tslib": "*" }, "peerDependencies": { diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 24451d8eb8b..4bcf3ed0046 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.9](https://github.com/ionic-team/ionic-framework/compare/v8.5.8...v8.5.9) (2025-06-04) + +**Note:** Version bump only for package @ionic/react + + + + + ## [8.5.8](https://github.com/ionic-team/ionic-framework/compare/v8.5.7...v8.5.8) (2025-05-28) **Note:** Version bump only for package @ionic/react diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index d6322a1b922..e1b70032260 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react", - "version": "8.5.8", + "version": "8.5.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react", - "version": "8.5.8", + "version": "8.5.9", "license": "MIT", "dependencies": { - "@ionic/core": "^8.5.8", + "@ionic/core": "^8.5.9", "ionicons": "^7.0.0", "tslib": "*" }, @@ -20499,4 +20499,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/react/package.json b/packages/react/package.json index a7d7823f066..b23fc63f934 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react", - "version": "8.5.8", + "version": "8.5.9", "description": "React specific wrapper for @ionic/core", "keywords": [ "ionic", @@ -39,7 +39,7 @@ "css/" ], "dependencies": { - "@ionic/core": "^8.5.8", + "@ionic/core": "^8.5.9", "ionicons": "^7.0.0", "tslib": "*" }, diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md index 72dcdd59e84..7004ba69ba2 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.9](https://github.com/ionic-team/ionic-framework/compare/v8.5.8...v8.5.9) (2025-06-04) + +**Note:** Version bump only for package @ionic/vue-router + + + + + ## [8.5.8](https://github.com/ionic-team/ionic-framework/compare/v8.5.7...v8.5.8) (2025-05-28) **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 bf5bd52e5e9..dba34f2bd59 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.8", + "version": "8.5.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue-router", - "version": "8.5.8", + "version": "8.5.9", "license": "MIT", "dependencies": { - "@ionic/vue": "^8.5.8" + "@ionic/vue": "^8.5.9" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", @@ -12817,4 +12817,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/vue-router/package.json b/packages/vue-router/package.json index a3d8dd6b7a4..c4bf6050e94 100644 --- a/packages/vue-router/package.json +++ b/packages/vue-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue-router", - "version": "8.5.8", + "version": "8.5.9", "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.8" + "@ionic/vue": "^8.5.9" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 11b4a01c3ac..1e7c11cc1ff 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.9](https://github.com/ionic-team/ionic-framework/compare/v8.5.8...v8.5.9) (2025-06-04) + +**Note:** Version bump only for package @ionic/vue + + + + + ## [8.5.8](https://github.com/ionic-team/ionic-framework/compare/v8.5.7...v8.5.8) (2025-05-28) **Note:** Version bump only for package @ionic/vue diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index 1c143dd648a..cecc29e001e 100644 --- a/packages/vue/package-lock.json +++ b/packages/vue/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue", - "version": "8.5.8", + "version": "8.5.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue", - "version": "8.5.8", + "version": "8.5.9", "license": "MIT", "dependencies": { - "@ionic/core": "^8.5.8", + "@ionic/core": "^8.5.9", "@stencil/vue-output-target": "0.10.7", "ionicons": "^7.0.0" }, @@ -6644,4 +6644,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/vue/package.json b/packages/vue/package.json index c9847a50430..918f77300a5 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue", - "version": "8.5.8", + "version": "8.5.9", "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.8", + "@ionic/core": "^8.5.9", "@stencil/vue-output-target": "0.10.7", "ionicons": "^7.0.0" },