From e5634d45ee5fd32715f6e6b75e0448f74ee1f8f2 Mon Sep 17 00:00:00 2001 From: Shane Date: Tue, 30 Dec 2025 10:33:41 -0800 Subject: [PATCH 01/55] fix(modal): prevent card modal animation on viewport resize when modal is closed (#30894) Issue number: resolves #30679 --------- ## What is the current behavior? When a page contains a card modal with a `presentingElement`, resizing the viewport (e.g., rotating from portrait to landscape) triggers the card modal's "lean back" animation on the presenting element, even when the modal has never been opened. ## What is the new behavior? Viewport resize events no longer trigger the presenting element animation when the modal is not presented. The animation only runs when the modal is actually open. ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information Current dev build: ``` 8.7.16-dev.11767028735.16932cea ``` --- core/src/components/modal/modal.tsx | 5 + .../test/card-viewport-resize/modal.e2e.ts | 176 ++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 core/src/components/modal/test/card-viewport-resize/modal.e2e.ts diff --git a/core/src/components/modal/modal.tsx b/core/src/components/modal/modal.tsx index 174ac2f9d8a..a96d59c8e9f 100644 --- a/core/src/components/modal/modal.tsx +++ b/core/src/components/modal/modal.tsx @@ -1116,6 +1116,11 @@ export class Modal implements ComponentInterface, OverlayInterface { } private handleViewTransition() { + // Only run view transitions when the modal is presented + if (!this.presented) { + return; + } + const isPortrait = window.innerWidth < 768; // Only transition if view state actually changed diff --git a/core/src/components/modal/test/card-viewport-resize/modal.e2e.ts b/core/src/components/modal/test/card-viewport-resize/modal.e2e.ts new file mode 100644 index 00000000000..3d7adc849c7 --- /dev/null +++ b/core/src/components/modal/test/card-viewport-resize/modal.e2e.ts @@ -0,0 +1,176 @@ +import { expect } from '@playwright/test'; +import { configs, test } from '@utils/test/playwright'; + +configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => { + test.describe(title('card modal: viewport resize'), () => { + test.beforeEach(async ({ page }) => { + // Start in portrait mode (mobile) + await page.setViewportSize({ width: 375, height: 667 }); + + await page.setContent( + ` + +
+ + + Card Viewport Resize Test + + + +

This page tests that viewport resize does not trigger card modal animation when modal is closed.

+ Open Card Modal + + + + Card Modal + + Close + + + + +

Modal content

+
+
+
+
+
+ + + `, + config + ); + }); + + test('should not animate presenting element when viewport resizes and modal is closed', async ({ + page, + }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30679', + }); + + const mainPage = page.locator('#main-page'); + + // Verify the presenting element has no transform initially + const initialTransform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + expect(initialTransform).toBe('none'); + + // Resize from portrait to landscape (crossing the 768px threshold) + await page.setViewportSize({ width: 900, height: 375 }); + + // Wait for the debounced resize handler (50ms) plus some buffer + await page.waitForTimeout(150); + + // The presenting element should still have no transform + // If the bug exists, it would have scale(0.93) or similar applied + const afterResizeTransform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + expect(afterResizeTransform).toBe('none'); + }); + + test('should not animate presenting element when resizing multiple times with modal closed', async ({ page }) => { + const mainPage = page.locator('#main-page'); + + // Multiple resize cycles should not trigger the animation + for (let i = 0; i < 3; i++) { + // Portrait to landscape + await page.setViewportSize({ width: 900, height: 375 }); + await page.waitForTimeout(150); + + let transform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + expect(transform).toBe('none'); + + // Landscape to portrait + await page.setViewportSize({ width: 375, height: 667 }); + await page.waitForTimeout(150); + + transform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + expect(transform).toBe('none'); + } + }); + + test('should still animate presenting element correctly when modal is open and viewport resizes', async ({ + page, + }) => { + const mainPage = page.locator('#main-page'); + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + // Open the modal + await page.click('#open-modal'); + await ionModalDidPresent.next(); + + // When modal is open in portrait, presenting element should be transformed + let transform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + // The presenting element should have a scale transform when modal is open + expect(transform).not.toBe('none'); + + // Resize to landscape while modal is open + await page.setViewportSize({ width: 900, height: 375 }); + await page.waitForTimeout(150); + + // The modal transitions correctly - in landscape mode the presenting element + // should have different (or no) transform than portrait + transform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + + // Note: The exact transform depends on the landscape handling + // The main point is that when modal IS open, the transition should work + // This test just ensures we don't break existing functionality + }); + + test('presenting element should return to normal after modal is dismissed', async ({ page }) => { + const mainPage = page.locator('#main-page'); + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + const ionModalDidDismiss = await page.spyOnEvent('ionModalDidDismiss'); + + // Open the modal + await page.click('#open-modal'); + await ionModalDidPresent.next(); + + // Close the modal + await page.click('#close-modal'); + await ionModalDidDismiss.next(); + + // Wait for animations to complete + await page.waitForTimeout(500); + + // The presenting element should be back to normal + const transform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + expect(transform).toBe('none'); + + // Now resize the viewport - should not trigger animation + await page.setViewportSize({ width: 900, height: 375 }); + await page.waitForTimeout(150); + + const afterResizeTransform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + expect(afterResizeTransform).toBe('none'); + }); + }); +}); From 36f4b4d600a8d9e53959a24ba51087a0eb587030 Mon Sep 17 00:00:00 2001 From: Shane Date: Tue, 30 Dec 2025 10:33:41 -0800 Subject: [PATCH 02/55] fix(modal): prevent card modal animation on viewport resize when modal is closed (#30894) Issue number: resolves #30679 --------- ## What is the current behavior? When a page contains a card modal with a `presentingElement`, resizing the viewport (e.g., rotating from portrait to landscape) triggers the card modal's "lean back" animation on the presenting element, even when the modal has never been opened. ## What is the new behavior? Viewport resize events no longer trigger the presenting element animation when the modal is not presented. The animation only runs when the modal is actually open. ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information Current dev build: ``` 8.7.16-dev.11767028735.16932cea ``` --- core/src/components/modal/modal.tsx | 5 + .../test/card-viewport-resize/modal.e2e.ts | 176 ++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 core/src/components/modal/test/card-viewport-resize/modal.e2e.ts diff --git a/core/src/components/modal/modal.tsx b/core/src/components/modal/modal.tsx index 174ac2f9d8a..a96d59c8e9f 100644 --- a/core/src/components/modal/modal.tsx +++ b/core/src/components/modal/modal.tsx @@ -1116,6 +1116,11 @@ export class Modal implements ComponentInterface, OverlayInterface { } private handleViewTransition() { + // Only run view transitions when the modal is presented + if (!this.presented) { + return; + } + const isPortrait = window.innerWidth < 768; // Only transition if view state actually changed diff --git a/core/src/components/modal/test/card-viewport-resize/modal.e2e.ts b/core/src/components/modal/test/card-viewport-resize/modal.e2e.ts new file mode 100644 index 00000000000..3d7adc849c7 --- /dev/null +++ b/core/src/components/modal/test/card-viewport-resize/modal.e2e.ts @@ -0,0 +1,176 @@ +import { expect } from '@playwright/test'; +import { configs, test } from '@utils/test/playwright'; + +configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => { + test.describe(title('card modal: viewport resize'), () => { + test.beforeEach(async ({ page }) => { + // Start in portrait mode (mobile) + await page.setViewportSize({ width: 375, height: 667 }); + + await page.setContent( + ` + +
+ + + Card Viewport Resize Test + + + +

This page tests that viewport resize does not trigger card modal animation when modal is closed.

+ Open Card Modal + + + + Card Modal + + Close + + + + +

Modal content

+
+
+
+
+
+ + + `, + config + ); + }); + + test('should not animate presenting element when viewport resizes and modal is closed', async ({ + page, + }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30679', + }); + + const mainPage = page.locator('#main-page'); + + // Verify the presenting element has no transform initially + const initialTransform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + expect(initialTransform).toBe('none'); + + // Resize from portrait to landscape (crossing the 768px threshold) + await page.setViewportSize({ width: 900, height: 375 }); + + // Wait for the debounced resize handler (50ms) plus some buffer + await page.waitForTimeout(150); + + // The presenting element should still have no transform + // If the bug exists, it would have scale(0.93) or similar applied + const afterResizeTransform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + expect(afterResizeTransform).toBe('none'); + }); + + test('should not animate presenting element when resizing multiple times with modal closed', async ({ page }) => { + const mainPage = page.locator('#main-page'); + + // Multiple resize cycles should not trigger the animation + for (let i = 0; i < 3; i++) { + // Portrait to landscape + await page.setViewportSize({ width: 900, height: 375 }); + await page.waitForTimeout(150); + + let transform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + expect(transform).toBe('none'); + + // Landscape to portrait + await page.setViewportSize({ width: 375, height: 667 }); + await page.waitForTimeout(150); + + transform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + expect(transform).toBe('none'); + } + }); + + test('should still animate presenting element correctly when modal is open and viewport resizes', async ({ + page, + }) => { + const mainPage = page.locator('#main-page'); + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + // Open the modal + await page.click('#open-modal'); + await ionModalDidPresent.next(); + + // When modal is open in portrait, presenting element should be transformed + let transform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + // The presenting element should have a scale transform when modal is open + expect(transform).not.toBe('none'); + + // Resize to landscape while modal is open + await page.setViewportSize({ width: 900, height: 375 }); + await page.waitForTimeout(150); + + // The modal transitions correctly - in landscape mode the presenting element + // should have different (or no) transform than portrait + transform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + + // Note: The exact transform depends on the landscape handling + // The main point is that when modal IS open, the transition should work + // This test just ensures we don't break existing functionality + }); + + test('presenting element should return to normal after modal is dismissed', async ({ page }) => { + const mainPage = page.locator('#main-page'); + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + const ionModalDidDismiss = await page.spyOnEvent('ionModalDidDismiss'); + + // Open the modal + await page.click('#open-modal'); + await ionModalDidPresent.next(); + + // Close the modal + await page.click('#close-modal'); + await ionModalDidDismiss.next(); + + // Wait for animations to complete + await page.waitForTimeout(500); + + // The presenting element should be back to normal + const transform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + expect(transform).toBe('none'); + + // Now resize the viewport - should not trigger animation + await page.setViewportSize({ width: 900, height: 375 }); + await page.waitForTimeout(150); + + const afterResizeTransform = await mainPage.evaluate((el) => { + return window.getComputedStyle(el).transform; + }); + expect(afterResizeTransform).toBe('none'); + }); + }); +}); From f71f4bf4545c64056f9103d678b28920ac1837a9 Mon Sep 17 00:00:00 2001 From: ionitron Date: Wed, 31 Dec 2025 21:05:35 +0000 Subject: [PATCH 03/55] v8.7.16 --- CHANGELOG.md | 11 +++++++++++ core/CHANGELOG.md | 11 +++++++++++ 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, 123 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf58db4c907..b22b24f59e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) + + +### Bug Fixes + +* **modal:** prevent card modal animation on viewport resize when modal is closed ([#30894](https://github.com/ionic-team/ionic-framework/issues/30894)) ([e5634d4](https://github.com/ionic-team/ionic-framework/commit/e5634d45ee5fd32715f6e6b75e0448f74ee1f8f2)), closes [#30679](https://github.com/ionic-team/ionic-framework/issues/30679) + + + + + ## [8.7.15](https://github.com/ionic-team/ionic-framework/compare/v8.7.14...v8.7.15) (2025-12-23) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index b0bbcba688b..69de5593699 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) + + +### Bug Fixes + +* **modal:** prevent card modal animation on viewport resize when modal is closed ([#30894](https://github.com/ionic-team/ionic-framework/issues/30894)) ([e5634d4](https://github.com/ionic-team/ionic-framework/commit/e5634d45ee5fd32715f6e6b75e0448f74ee1f8f2)), closes [#30679](https://github.com/ionic-team/ionic-framework/issues/30679) + + + + + ## [8.7.15](https://github.com/ionic-team/ionic-framework/compare/v8.7.14...v8.7.15) (2025-12-23) diff --git a/core/package-lock.json b/core/package-lock.json index 31216f28eef..6211e1cb255 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/core", - "version": "8.7.15", + "version": "8.7.16", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/core", - "version": "8.7.15", + "version": "8.7.16", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -9839,4 +9839,4 @@ } } } -} +} \ No newline at end of file diff --git a/core/package.json b/core/package.json index c105165c099..dc92468f9c1 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/core", - "version": "8.7.15", + "version": "8.7.16", "description": "Base components for Ionic", "engines": { "node": ">= 16" diff --git a/lerna.json b/lerna.json index cec6780d8e0..0ce1bce2214 100644 --- a/lerna.json +++ b/lerna.json @@ -3,5 +3,5 @@ "core", "packages/*" ], - "version": "8.7.15" + "version": "8.7.16" } \ No newline at end of file diff --git a/packages/angular-server/CHANGELOG.md b/packages/angular-server/CHANGELOG.md index 6e2c47e231f..df8a394101b 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.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) + +**Note:** Version bump only for package @ionic/angular-server + + + + + ## [8.7.15](https://github.com/ionic-team/ionic-framework/compare/v8.7.14...v8.7.15) (2025-12-23) **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 400af1cf1ea..1f90f90b9d2 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.7.15", + "version": "8.7.16", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular-server", - "version": "8.7.15", + "version": "8.7.16", "license": "MIT", "dependencies": { - "@ionic/core": "^8.7.15" + "@ionic/core": "^8.7.16" }, "devDependencies": { "@angular-eslint/eslint-plugin": "^16.0.0", @@ -11289,4 +11289,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/angular-server/package.json b/packages/angular-server/package.json index 34f4f41b9f5..9e25f51bfe4 100644 --- a/packages/angular-server/package.json +++ b/packages/angular-server/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular-server", - "version": "8.7.15", + "version": "8.7.16", "description": "Angular SSR Module for Ionic", "keywords": [ "ionic", @@ -62,6 +62,6 @@ }, "prettier": "@ionic/prettier-config", "dependencies": { - "@ionic/core": "^8.7.15" + "@ionic/core": "^8.7.16" } } diff --git a/packages/angular/CHANGELOG.md b/packages/angular/CHANGELOG.md index 8c81042f2f5..462ee3b5c47 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.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) + +**Note:** Version bump only for package @ionic/angular + + + + + ## [8.7.15](https://github.com/ionic-team/ionic-framework/compare/v8.7.14...v8.7.15) (2025-12-23) **Note:** Version bump only for package @ionic/angular diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index 2b5f26d0449..a428beb8bfa 100644 --- a/packages/angular/package-lock.json +++ b/packages/angular/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/angular", - "version": "8.7.15", + "version": "8.7.16", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/angular", - "version": "8.7.15", + "version": "8.7.16", "license": "MIT", "dependencies": { - "@ionic/core": "^8.7.15", + "@ionic/core": "^8.7.16", "ionicons": "^8.0.13", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" @@ -9095,4 +9095,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/angular/package.json b/packages/angular/package.json index 3e681522ec3..ba942d4bec5 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular", - "version": "8.7.15", + "version": "8.7.16", "description": "Angular specific wrappers for @ionic/core", "keywords": [ "ionic", @@ -48,7 +48,7 @@ } }, "dependencies": { - "@ionic/core": "^8.7.15", + "@ionic/core": "^8.7.16", "ionicons": "^8.0.13", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" diff --git a/packages/docs/CHANGELOG.md b/packages/docs/CHANGELOG.md index 632712133a7..ad478b96ec9 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.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) + +**Note:** Version bump only for package @ionic/docs + + + + + ## [8.7.15](https://github.com/ionic-team/ionic-framework/compare/v8.7.14...v8.7.15) (2025-12-23) **Note:** Version bump only for package @ionic/docs diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index 98e0630e216..b792684746a 100644 --- a/packages/docs/package-lock.json +++ b/packages/docs/package-lock.json @@ -1,13 +1,13 @@ { "name": "@ionic/docs", - "version": "8.7.15", + "version": "8.7.16", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/docs", - "version": "8.7.15", + "version": "8.7.16", "license": "MIT" } } -} +} \ No newline at end of file diff --git a/packages/docs/package.json b/packages/docs/package.json index e7a085be4bf..8c649547ed2 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/docs", - "version": "8.7.15", + "version": "8.7.16", "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 55ae3dde0c1..2f31ae84c48 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.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) + +**Note:** Version bump only for package @ionic/react-router + + + + + ## [8.7.15](https://github.com/ionic-team/ionic-framework/compare/v8.7.14...v8.7.15) (2025-12-23) **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 a0a96db917f..ed95a1f5170 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.7.15", + "version": "8.7.16", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react-router", - "version": "8.7.15", + "version": "8.7.16", "license": "MIT", "dependencies": { - "@ionic/react": "^8.7.15", + "@ionic/react": "^8.7.16", "tslib": "*" }, "devDependencies": { @@ -6847,4 +6847,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/react-router/package.json b/packages/react-router/package.json index d3c93c20a76..8bcc2e3b004 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react-router", - "version": "8.7.15", + "version": "8.7.16", "description": "React Router wrapper for @ionic/react", "keywords": [ "ionic", @@ -36,7 +36,7 @@ "dist/" ], "dependencies": { - "@ionic/react": "^8.7.15", + "@ionic/react": "^8.7.16", "tslib": "*" }, "peerDependencies": { diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index d198346bb0b..c7dc3da95d4 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.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) + +**Note:** Version bump only for package @ionic/react + + + + + ## [8.7.15](https://github.com/ionic-team/ionic-framework/compare/v8.7.14...v8.7.15) (2025-12-23) **Note:** Version bump only for package @ionic/react diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index f10c3cf0873..de4fdc5a048 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react", - "version": "8.7.15", + "version": "8.7.16", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/react", - "version": "8.7.15", + "version": "8.7.16", "license": "MIT", "dependencies": { - "@ionic/core": "^8.7.15", + "@ionic/core": "^8.7.16", "ionicons": "^8.0.13", "tslib": "*" }, @@ -11916,4 +11916,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/react/package.json b/packages/react/package.json index 68819b74b8a..f6b5f984087 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react", - "version": "8.7.15", + "version": "8.7.16", "description": "React specific wrapper for @ionic/core", "keywords": [ "ionic", @@ -40,7 +40,7 @@ "css/" ], "dependencies": { - "@ionic/core": "^8.7.15", + "@ionic/core": "^8.7.16", "ionicons": "^8.0.13", "tslib": "*" }, diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md index f56cb248703..0591d860da6 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.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) + +**Note:** Version bump only for package @ionic/vue-router + + + + + ## [8.7.15](https://github.com/ionic-team/ionic-framework/compare/v8.7.14...v8.7.15) (2025-12-23) **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 bfd04a619b7..8215cb25b4a 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.7.15", + "version": "8.7.16", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue-router", - "version": "8.7.15", + "version": "8.7.16", "license": "MIT", "dependencies": { - "@ionic/vue": "^8.7.15" + "@ionic/vue": "^8.7.16" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", @@ -12994,4 +12994,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/vue-router/package.json b/packages/vue-router/package.json index 6b55532cb9b..fc32e9c1651 100644 --- a/packages/vue-router/package.json +++ b/packages/vue-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue-router", - "version": "8.7.15", + "version": "8.7.16", "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.7.15" + "@ionic/vue": "^8.7.16" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 436bae11c08..c2f258ad818 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.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) + +**Note:** Version bump only for package @ionic/vue + + + + + ## [8.7.15](https://github.com/ionic-team/ionic-framework/compare/v8.7.14...v8.7.15) (2025-12-23) **Note:** Version bump only for package @ionic/vue diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index f19fe970e0b..124ae44fdc1 100644 --- a/packages/vue/package-lock.json +++ b/packages/vue/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue", - "version": "8.7.15", + "version": "8.7.16", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/vue", - "version": "8.7.15", + "version": "8.7.16", "license": "MIT", "dependencies": { - "@ionic/core": "^8.7.15", + "@ionic/core": "^8.7.16", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" }, @@ -4022,4 +4022,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/vue/package.json b/packages/vue/package.json index 04bd5518ab0..a40bdb24cd2 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue", - "version": "8.7.15", + "version": "8.7.16", "description": "Vue specific wrapper for @ionic/core", "scripts": { "eslint": "eslint src", @@ -68,7 +68,7 @@ "vue-router": "^4.0.16" }, "dependencies": { - "@ionic/core": "^8.7.15", + "@ionic/core": "^8.7.16", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" }, From 37f87b39c495d68246f1be89b7653c292f09c561 Mon Sep 17 00:00:00 2001 From: ionitron Date: Wed, 31 Dec 2025 21:06:17 +0000 Subject: [PATCH 04/55] chore(): update package lock files --- core/package-lock.json | 2 +- packages/angular-server/package-lock.json | 14 +++++------ packages/angular/package-lock.json | 8 +++--- packages/docs/package-lock.json | 2 +- packages/react-router/package-lock.json | 30 +++++++++++------------ packages/react/package-lock.json | 8 +++--- packages/vue-router/package-lock.json | 30 +++++++++++------------ packages/vue/package-lock.json | 8 +++--- 8 files changed, 51 insertions(+), 51 deletions(-) diff --git a/core/package-lock.json b/core/package-lock.json index 6211e1cb255..0bd942fdde6 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -9839,4 +9839,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/angular-server/package-lock.json b/packages/angular-server/package-lock.json index 1f90f90b9d2..333343c52c9 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.7.15", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.15.tgz", - "integrity": "sha512-u1w9c6dx2iuatXIW5X1JY0ighDhQPjBwOHZsrOcnpm891pktuEjJDdyhDulWFa6kKVkXw1q7khwxXBEurvKc2g==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", + "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -7309,9 +7309,9 @@ "dev": true }, "@ionic/core": { - "version": "8.7.15", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.15.tgz", - "integrity": "sha512-u1w9c6dx2iuatXIW5X1JY0ighDhQPjBwOHZsrOcnpm891pktuEjJDdyhDulWFa6kKVkXw1q7khwxXBEurvKc2g==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", + "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", "requires": { "@stencil/core": "4.38.0", "ionicons": "^8.0.13", @@ -11289,4 +11289,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index a428beb8bfa..b5b91dcd0c2 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.7.15", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.15.tgz", - "integrity": "sha512-u1w9c6dx2iuatXIW5X1JY0ighDhQPjBwOHZsrOcnpm891pktuEjJDdyhDulWFa6kKVkXw1q7khwxXBEurvKc2g==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", + "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -9095,4 +9095,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index b792684746a..193cb5e4651 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 ed95a1f5170..4e1bfdf78f5 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.7.15", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.15.tgz", - "integrity": "sha512-u1w9c6dx2iuatXIW5X1JY0ighDhQPjBwOHZsrOcnpm891pktuEjJDdyhDulWFa6kKVkXw1q7khwxXBEurvKc2g==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", + "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -418,12 +418,12 @@ } }, "node_modules/@ionic/react": { - "version": "8.7.15", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.15.tgz", - "integrity": "sha512-3W5DAN3OMe2w32AGlW8zvKZHNY/dLCWhVLL9485VKtsYvgUc9nkG8dYDvQGc6c17PEDVrMy+IAl4H9hLgJhYnQ==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.16.tgz", + "integrity": "sha512-36y+VmtssJ4vfrCJxUEaOo5tFQRP1m87kxVVC6Cc2ctjLQRDEMszG9v3ctzxD+8EszFLMHEmsSTvGGCelDJlvQ==", "license": "MIT", "dependencies": { - "@ionic/core": "8.7.15", + "@ionic/core": "8.7.16", "ionicons": "^8.0.13", "tslib": "*" }, @@ -4178,9 +4178,9 @@ "dev": true }, "@ionic/core": { - "version": "8.7.15", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.15.tgz", - "integrity": "sha512-u1w9c6dx2iuatXIW5X1JY0ighDhQPjBwOHZsrOcnpm891pktuEjJDdyhDulWFa6kKVkXw1q7khwxXBEurvKc2g==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", + "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", "requires": { "@stencil/core": "4.38.0", "ionicons": "^8.0.13", @@ -4284,11 +4284,11 @@ "requires": {} }, "@ionic/react": { - "version": "8.7.15", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.15.tgz", - "integrity": "sha512-3W5DAN3OMe2w32AGlW8zvKZHNY/dLCWhVLL9485VKtsYvgUc9nkG8dYDvQGc6c17PEDVrMy+IAl4H9hLgJhYnQ==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.16.tgz", + "integrity": "sha512-36y+VmtssJ4vfrCJxUEaOo5tFQRP1m87kxVVC6Cc2ctjLQRDEMszG9v3ctzxD+8EszFLMHEmsSTvGGCelDJlvQ==", "requires": { - "@ionic/core": "8.7.15", + "@ionic/core": "8.7.16", "ionicons": "^8.0.13", "tslib": "*" } @@ -6847,4 +6847,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index de4fdc5a048..88b3f757591 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.7.15", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.15.tgz", - "integrity": "sha512-u1w9c6dx2iuatXIW5X1JY0ighDhQPjBwOHZsrOcnpm891pktuEjJDdyhDulWFa6kKVkXw1q7khwxXBEurvKc2g==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", + "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -11916,4 +11916,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/vue-router/package-lock.json b/packages/vue-router/package-lock.json index 8215cb25b4a..e62f0e245c1 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.7.15", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.15.tgz", - "integrity": "sha512-u1w9c6dx2iuatXIW5X1JY0ighDhQPjBwOHZsrOcnpm891pktuEjJDdyhDulWFa6kKVkXw1q7khwxXBEurvKc2g==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", + "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -868,12 +868,12 @@ } }, "node_modules/@ionic/vue": { - "version": "8.7.15", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.15.tgz", - "integrity": "sha512-F94GoGBsLoFFkJLe+W401SynIfUzEL1Z+Y4YUQ2EGpulnFpY4tXKzDhRNrisPnM0k3BWQRh8AA8fwTtMqEiISw==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.16.tgz", + "integrity": "sha512-7ZKKUj+PgzV/SiSbSPFE/anQzT3kHLrb7JGrw394QZB1E3aehljgt/hDaQzityRtgqgUaaJZx22MGrg5r9kePQ==", "license": "MIT", "dependencies": { - "@ionic/core": "8.7.15", + "@ionic/core": "8.7.16", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" } @@ -8044,9 +8044,9 @@ "dev": true }, "@ionic/core": { - "version": "8.7.15", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.15.tgz", - "integrity": "sha512-u1w9c6dx2iuatXIW5X1JY0ighDhQPjBwOHZsrOcnpm891pktuEjJDdyhDulWFa6kKVkXw1q7khwxXBEurvKc2g==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", + "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", "requires": { "@stencil/core": "4.38.0", "ionicons": "^8.0.13", @@ -8159,11 +8159,11 @@ "requires": {} }, "@ionic/vue": { - "version": "8.7.15", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.15.tgz", - "integrity": "sha512-F94GoGBsLoFFkJLe+W401SynIfUzEL1Z+Y4YUQ2EGpulnFpY4tXKzDhRNrisPnM0k3BWQRh8AA8fwTtMqEiISw==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.16.tgz", + "integrity": "sha512-7ZKKUj+PgzV/SiSbSPFE/anQzT3kHLrb7JGrw394QZB1E3aehljgt/hDaQzityRtgqgUaaJZx22MGrg5r9kePQ==", "requires": { - "@ionic/core": "8.7.15", + "@ionic/core": "8.7.16", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" } @@ -12994,4 +12994,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index 124ae44fdc1..6ec90dca9e4 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.7.15", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.15.tgz", - "integrity": "sha512-u1w9c6dx2iuatXIW5X1JY0ighDhQPjBwOHZsrOcnpm891pktuEjJDdyhDulWFa6kKVkXw1q7khwxXBEurvKc2g==", + "version": "8.7.16", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", + "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -4022,4 +4022,4 @@ "dev": true } } -} \ No newline at end of file +} From 3b3318da513b199128f3822bd8226797cd118b0f Mon Sep 17 00:00:00 2001 From: Shane Date: Tue, 13 Jan 2026 10:42:50 -0800 Subject: [PATCH 05/55] fix(input): prevent placeholder from overlapping start slot during scroll assist (#30896) Issue number: resolves internal --------- ## What is the current behavior? On iOS, when focusing an `ion-input` or `ion-textarea` that requires scrolling into view (scroll assist), the placeholder text shifts to the left and overlaps any content in the start slot (e.g., icons). This occurs because the cloned input used during scroll assist is positioned at the container's left edge rather than at the native input's actual position. Additionally, when quickly switching between inputs before scroll assist completes, focus jumps back to the original input. ## What is the new behavior? The cloned input is now positioned at the same offset as the native input, preventing the placeholder from shifting or overlapping start slot content during scroll assist. This works correctly for both LTR and RTL layouts. Also, scroll assist no longer steals focus back if the user has moved focus to another element while scrolling was in progress. ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information Current dev build: ``` 8.7.16-dev.11767042721.11309185 ``` --- core/src/components/input/input.scss | 8 ++++++-- core/src/components/textarea/textarea.scss | 8 ++++++-- core/src/utils/input-shims/hacks/common.ts | 19 +++++++++++++++++-- .../utils/input-shims/hacks/scroll-assist.ts | 10 ++++++++-- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/core/src/components/input/input.scss b/core/src/components/input/input.scss index 2161cc3dfb5..476cb012bee 100644 --- a/core/src/components/input/input.scss +++ b/core/src/components/input/input.scss @@ -165,9 +165,13 @@ // otherwise the .input-cover will not be rendered at all // The input cover is not clickable when the input is disabled .cloned-input { - @include position(0, null, 0, 0); - position: absolute; + top: 0; + bottom: 0; + + // Reset height since absolute positioning with top/bottom handles sizing + height: auto; + max-height: none; pointer-events: none; } diff --git a/core/src/components/textarea/textarea.scss b/core/src/components/textarea/textarea.scss index a23893b8b40..58c00824f65 100644 --- a/core/src/components/textarea/textarea.scss +++ b/core/src/components/textarea/textarea.scss @@ -205,9 +205,13 @@ // otherwise the .input-cover will not be rendered at all // The input cover is not clickable when the input is disabled .cloned-input { - @include position(0, null, 0, 0); - position: absolute; + top: 0; + bottom: 0; + + // Reset height since absolute positioning with top/bottom handles sizing + height: auto; + max-height: none; pointer-events: none; } diff --git a/core/src/utils/input-shims/hacks/common.ts b/core/src/utils/input-shims/hacks/common.ts index 2f42749c2ed..7553c07e103 100644 --- a/core/src/utils/input-shims/hacks/common.ts +++ b/core/src/utils/input-shims/hacks/common.ts @@ -68,11 +68,26 @@ const addClone = ( if (disabledClonedInput) { clonedEl.disabled = true; } + + /** + * Position the clone at the same horizontal offset as the native input + * to prevent the placeholder from overlapping start slot content (e.g., icons). + */ + const doc = componentEl.ownerDocument!; + const isRTL = doc.dir === 'rtl'; + + if (isRTL) { + const parentWidth = (parentEl as HTMLElement).offsetWidth; + const startOffset = parentWidth - inputEl.offsetLeft - inputEl.offsetWidth; + clonedEl.style.insetInlineStart = `${startOffset}px`; + } else { + clonedEl.style.insetInlineStart = `${inputEl.offsetLeft}px`; + } + parentEl.appendChild(clonedEl); cloneMap.set(componentEl, clonedEl); - const doc = componentEl.ownerDocument!; - const tx = doc.dir === 'rtl' ? 9999 : -9999; + const tx = isRTL ? 9999 : -9999; componentEl.style.pointerEvents = 'none'; inputEl.style.transform = `translate3d(${tx}px,${inputRelativeY}px,0) scale(0)`; }; diff --git a/core/src/utils/input-shims/hacks/scroll-assist.ts b/core/src/utils/input-shims/hacks/scroll-assist.ts index fb2b1900202..9d4685cb8da 100644 --- a/core/src/utils/input-shims/hacks/scroll-assist.ts +++ b/core/src/utils/input-shims/hacks/scroll-assist.ts @@ -291,8 +291,14 @@ const jsSetFocus = async ( // give the native text input focus relocateInput(componentEl, inputEl, false, scrollData.inputSafeY); - // ensure this is the focused input - setManualFocus(inputEl); + /** + * If focus has moved to another element while scroll assist was running, + * don't steal focus back. This prevents focus jumping when users + * quickly switch between inputs or tap other elements. + */ + if (document.activeElement === inputEl) { + setManualFocus(inputEl); + } /** * When the input is about to be blurred From f99d0007a8ffc9c7d3d2636e912c37c12112b21d Mon Sep 17 00:00:00 2001 From: Shane Date: Wed, 14 Jan 2026 07:59:14 -0800 Subject: [PATCH 06/55] fix(tab-bar): prevent keyboard controller memory leak on rapid mount/unmount (#30906) Issue number: resolves internal --------- ## What is the current behavior? When `ion-tab-bar` is rapidly mounted and unmounted, a race condition in connectedCallback can cause the keyboard controller to be created after the component has been disconnected. This results in orphaned event listeners (`keyboardWillShow`, `keyboardWillHide`) on the window object that are never cleaned up, causing a memory leak. ## What is the new behavior? The keyboard controller is now properly destroyed in all scenarios: - If the component is disconnected while createKeyboardController is pending, the promise is tracked and destroyed when it resolves - If a new connectedCallback runs before the previous async completes, the stale controller is destroyed The promise tracking pattern ensures only the most recent async operation assigns its result ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information Current dev build: ``` 8.7.17-dev.11767895575.16ea7cef ``` I was unable to find a way to create tests that accurately identified if this problem was occurring. Memory leaks are notoriously difficult to created automated tests for. I ultimately removed my previous attempts because I didn't want to give a false sense of security. --- core/src/components/footer/footer.tsx | 24 +++++++++++++++++++++++- core/src/components/tab-bar/tab-bar.tsx | 24 +++++++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/core/src/components/footer/footer.tsx b/core/src/components/footer/footer.tsx index e857f9afda1..23d7e5d48ad 100644 --- a/core/src/components/footer/footer.tsx +++ b/core/src/components/footer/footer.tsx @@ -22,6 +22,7 @@ export class Footer implements ComponentInterface { private scrollEl?: HTMLElement; private contentScrollCallback?: () => void; private keyboardCtrl: KeyboardController | null = null; + private keyboardCtrlPromise: Promise | null = null; @State() private keyboardVisible = false; @@ -52,7 +53,7 @@ export class Footer implements ComponentInterface { } async connectedCallback() { - this.keyboardCtrl = await createKeyboardController(async (keyboardOpen, waitForResize) => { + const promise = createKeyboardController(async (keyboardOpen, waitForResize) => { /** * If the keyboard is hiding, then we need to wait * for the webview to resize. Otherwise, the footer @@ -64,11 +65,32 @@ export class Footer implements ComponentInterface { this.keyboardVisible = keyboardOpen; // trigger re-render by updating state }); + this.keyboardCtrlPromise = promise; + + const keyboardCtrl = await promise; + + /** + * Only assign if this is still the current promise. + * Otherwise, a new connectedCallback has started or + * disconnectedCallback was called, so destroy this instance. + */ + if (this.keyboardCtrlPromise === promise) { + this.keyboardCtrl = keyboardCtrl; + this.keyboardCtrlPromise = null; + } else { + keyboardCtrl.destroy(); + } } disconnectedCallback() { + if (this.keyboardCtrlPromise) { + this.keyboardCtrlPromise.then((ctrl) => ctrl.destroy()); + this.keyboardCtrlPromise = null; + } + if (this.keyboardCtrl) { this.keyboardCtrl.destroy(); + this.keyboardCtrl = null; } } diff --git a/core/src/components/tab-bar/tab-bar.tsx b/core/src/components/tab-bar/tab-bar.tsx index d17bb0ba145..d8a03cdb71c 100644 --- a/core/src/components/tab-bar/tab-bar.tsx +++ b/core/src/components/tab-bar/tab-bar.tsx @@ -22,6 +22,7 @@ import type { TabBarChangedEventDetail } from './tab-bar-interface'; }) export class TabBar implements ComponentInterface { private keyboardCtrl: KeyboardController | null = null; + private keyboardCtrlPromise: Promise | null = null; private didLoad = false; @Element() el!: HTMLElement; @@ -88,7 +89,7 @@ export class TabBar implements ComponentInterface { } async connectedCallback() { - this.keyboardCtrl = await createKeyboardController(async (keyboardOpen, waitForResize) => { + const promise = createKeyboardController(async (keyboardOpen, waitForResize) => { /** * If the keyboard is hiding, then we need to wait * for the webview to resize. Otherwise, the tab bar @@ -100,11 +101,32 @@ export class TabBar implements ComponentInterface { this.keyboardVisible = keyboardOpen; // trigger re-render by updating state }); + this.keyboardCtrlPromise = promise; + + const keyboardCtrl = await promise; + + /** + * Only assign if this is still the current promise. + * Otherwise, a new connectedCallback has started or + * disconnectedCallback was called, so destroy this instance. + */ + if (this.keyboardCtrlPromise === promise) { + this.keyboardCtrl = keyboardCtrl; + this.keyboardCtrlPromise = null; + } else { + keyboardCtrl.destroy(); + } } disconnectedCallback() { + if (this.keyboardCtrlPromise) { + this.keyboardCtrlPromise.then((ctrl) => ctrl.destroy()); + this.keyboardCtrlPromise = null; + } + if (this.keyboardCtrl) { this.keyboardCtrl.destroy(); + this.keyboardCtrl = null; } } From ab733b71dd355d9486757f219fe09acaefeeefcc Mon Sep 17 00:00:00 2001 From: Shane Date: Wed, 14 Jan 2026 08:17:33 -0800 Subject: [PATCH 07/55] fix(input): prevent Android TalkBack from focusing label separately (#30895) Issue number: resolves internal --------- ## What is the current behavior? When using `ion-input` with a label on Android, TalkBack treats the visual label text as a separate focusable element. This causes the initial focus to land on the label instead of the input field, creating a confusing experience for screen reader users. ## What is the new behavior? The label text wrapper is now hidden from the accessibility tree via `aria-hidden="true"`, while the native input maintains proper labeling through `aria-labelledby`. This ensures Android TalkBack focuses directly on the input field while still announcing the label correctly. ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information Current dev build: ``` 8.7.16-dev.11767032989.1ae720d0 ``` --- core/src/components/input/input.tsx | 49 +++++++++- .../components/input/test/a11y/input.e2e.ts | 98 +++++++++++++++++++ 2 files changed, 144 insertions(+), 3 deletions(-) diff --git a/core/src/components/input/input.tsx b/core/src/components/input/input.tsx index 19c5a9d406f..575a14df9d6 100644 --- a/core/src/components/input/input.tsx +++ b/core/src/components/input/input.tsx @@ -48,6 +48,7 @@ export class Input implements ComponentInterface { private inputId = `ion-input-${inputIds++}`; private helperTextId = `${this.inputId}-helper-text`; private errorTextId = `${this.inputId}-error-text`; + private labelTextId = `${this.inputId}-label`; private inheritedAttributes: Attributes = {}; private isComposing = false; private slotMutationController?: SlotMutationController; @@ -406,7 +407,12 @@ export class Input implements ComponentInterface { connectedCallback() { const { el } = this; - this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => forceUpdate(this)); + this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => { + this.setSlottedLabelId(); + forceUpdate(this); + }); + + this.setSlottedLabelId(); this.notchController = createNotchController( el, () => this.notchSpacerEl, @@ -721,7 +727,7 @@ export class Input implements ComponentInterface { } private renderLabel() { - const { label } = this; + const { label, labelTextId } = this; return (
- {label === undefined ? :
{label}
} + {label === undefined ? ( + + ) : ( +
+ {label} +
+ )}
); } @@ -743,6 +758,33 @@ export class Input implements ComponentInterface { return this.el.querySelector('[slot="label"]'); } + /** + * Ensures the slotted label element has an ID for aria-labelledby. + * If no ID exists, we assign one using our generated labelTextId. + */ + private setSlottedLabelId() { + const slottedLabel = this.labelSlot; + if (slottedLabel && !slottedLabel.id) { + slottedLabel.id = this.labelTextId; + } + } + + /** + * Returns the ID to use for aria-labelledby on the native input, + * or undefined if aria-label is explicitly set (to avoid conflicts). + */ + private getLabelledById(): string | undefined { + if (this.inheritedAttributes['aria-label']) { + return undefined; + } + + if (this.label !== undefined) { + return this.labelTextId; + } + + return this.labelSlot?.id || undefined; + } + /** * Returns `true` if label content is provided * either by a prop or a content. If you want @@ -898,6 +940,7 @@ export class Input implements ComponentInterface { onCompositionend={this.onCompositionEnd} aria-describedby={this.getHintTextID()} aria-invalid={this.isInvalid ? 'true' : undefined} + aria-labelledby={this.getLabelledById()} {...this.inheritedAttributes} /> {this.clearInput && !readonly && !disabled && ( diff --git a/core/src/components/input/test/a11y/input.e2e.ts b/core/src/components/input/test/a11y/input.e2e.ts index 6a40385c925..21ce46c52b2 100644 --- a/core/src/components/input/test/a11y/input.e2e.ts +++ b/core/src/components/input/test/a11y/input.e2e.ts @@ -57,6 +57,104 @@ configs({ directions: ['ltr'], palettes: ['light', 'dark'] }).forEach(({ title, }); }); +configs({ directions: ['ltr'], modes: ['md'] }).forEach(({ title, config }) => { + test.describe(title('input: label a11y for Android TalkBack'), () => { + /** + * Android TalkBack treats visible text elements as separate focusable items. + * These tests verify that the label is hidden from a11y tree (aria-hidden) + * while remaining associated with the input via aria-labelledby. + */ + test('label text wrapper should be hidden from accessibility tree when using label prop', async ({ page }) => { + await page.setContent( + ` + + `, + config + ); + + const labelTextWrapper = page.locator('ion-input .label-text-wrapper'); + await expect(labelTextWrapper).toHaveAttribute('aria-hidden', 'true'); + }); + + test('label text wrapper should be hidden from accessibility tree when using label slot', async ({ page }) => { + await page.setContent( + ` + +
Email
+
+ `, + config + ); + + const labelTextWrapper = page.locator('ion-input .label-text-wrapper'); + await expect(labelTextWrapper).toHaveAttribute('aria-hidden', 'true'); + }); + + test('native input should have aria-labelledby pointing to label text when using label prop', async ({ page }) => { + await page.setContent( + ` + + `, + config + ); + + const nativeInput = page.locator('ion-input input'); + const labelText = page.locator('ion-input .label-text'); + + const labelTextId = await labelText.getAttribute('id'); + expect(labelTextId).not.toBeNull(); + await expect(nativeInput).toHaveAttribute('aria-labelledby', labelTextId!); + }); + + test('native input should have aria-labelledby pointing to slotted label when using label slot', async ({ + page, + }) => { + await page.setContent( + ` + +
Email
+
+ `, + config + ); + + const nativeInput = page.locator('ion-input input'); + const slottedLabel = page.locator('ion-input [slot="label"]'); + + const slottedLabelId = await slottedLabel.getAttribute('id'); + expect(slottedLabelId).not.toBeNull(); + await expect(nativeInput).toHaveAttribute('aria-labelledby', slottedLabelId!); + }); + + test('should not add aria-labelledby when aria-label is provided on host', async ({ page }) => { + await page.setContent( + ` + + `, + config + ); + + const nativeInput = page.locator('ion-input input'); + + await expect(nativeInput).toHaveAttribute('aria-label', 'Custom Label'); + await expect(nativeInput).not.toHaveAttribute('aria-labelledby'); + }); + + test('should not add aria-hidden to label wrapper when no label is present', async ({ page }) => { + await page.setContent( + ` + + `, + config + ); + + const labelTextWrapper = page.locator('ion-input .label-text-wrapper'); + + await expect(labelTextWrapper).not.toHaveAttribute('aria-hidden', 'true'); + }); + }); +}); + configs({ directions: ['ltr'] }).forEach(({ title, config, screenshot }) => { test.describe(title('input: font scaling'), () => { test('should scale text on larger font sizes', async ({ page }) => { From 95b87020d6f4ef9bf8053bacda4c17c151b83219 Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Wed, 14 Jan 2026 11:18:00 -0500 Subject: [PATCH 08/55] chore(github): do not close issues as stale when they are external bugs (#30915) Ionitron keeps closing issues with `bug: external` as stale: https://github.com/ionic-team/ionic-framework/issues/27052#event-21879561018 This PRs adds `bug: external` as an exempt label when closing issues as stale. Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- .github/ionic-issue-bot.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/ionic-issue-bot.yml b/.github/ionic-issue-bot.yml index c1e02a5f068..d98b2a53205 100644 --- a/.github/ionic-issue-bot.yml +++ b/.github/ionic-issue-bot.yml @@ -40,7 +40,7 @@ comment: If the requested feature is something you would find useful for your applications, please react to the original post with 👍 (`+1`). If you would like to provide an additional use case for the feature, please post a comment. - + The team will review this feedback and make a final decision. Any decision will be posted on this thread, but please note that we may ultimately decide not to pursue this feature. @@ -83,6 +83,7 @@ stale: exemptLabels: - "good first issue" - "triage" + - "bug: external" - "type: bug" - "type: feature request" - "needs: investigation" From d7b4d0690b8627919f7b2bdd998ce06c5f5c37fc Mon Sep 17 00:00:00 2001 From: ionitron Date: Wed, 14 Jan 2026 18:58:56 +0000 Subject: [PATCH 09/55] v8.7.17 --- CHANGELOG.md | 15 +++++++++++++++ core/CHANGELOG.md | 14 ++++++++++++++ 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, 130 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b22b24f59e5..a1475417352 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,21 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.7.17](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.17) (2026-01-14) + + +### Bug Fixes + +* **input:** prevent Android TalkBack from focusing label separately ([#30895](https://github.com/ionic-team/ionic-framework/issues/30895)) ([ab733b7](https://github.com/ionic-team/ionic-framework/commit/ab733b71dd355d9486757f219fe09acaefeeefcc)) +* **input:** prevent placeholder from overlapping start slot during scroll assist ([#30896](https://github.com/ionic-team/ionic-framework/issues/30896)) ([3b3318d](https://github.com/ionic-team/ionic-framework/commit/3b3318da513b199128f3822bd8226797cd118b0f)) +* **modal:** prevent card modal animation on viewport resize when modal is closed ([#30894](https://github.com/ionic-team/ionic-framework/issues/30894)) ([36f4b4d](https://github.com/ionic-team/ionic-framework/commit/36f4b4d600a8d9e53959a24ba51087a0eb587030)), closes [#30679](https://github.com/ionic-team/ionic-framework/issues/30679) +* **modal:** prevent card modal animation on viewport resize when modal is closed ([#30894](https://github.com/ionic-team/ionic-framework/issues/30894)) ([e5634d4](https://github.com/ionic-team/ionic-framework/commit/e5634d45ee5fd32715f6e6b75e0448f74ee1f8f2)), closes [#30679](https://github.com/ionic-team/ionic-framework/issues/30679) +* **tab-bar:** prevent keyboard controller memory leak on rapid mount/unmount ([#30906](https://github.com/ionic-team/ionic-framework/issues/30906)) ([f99d000](https://github.com/ionic-team/ionic-framework/commit/f99d0007a8ffc9c7d3d2636e912c37c12112b21d)) + + + + + ## [8.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 69de5593699..517297e0d4b 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,20 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.7.17](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.17) (2026-01-14) + + +### Bug Fixes + +* **input:** prevent Android TalkBack from focusing label separately ([#30895](https://github.com/ionic-team/ionic-framework/issues/30895)) ([ab733b7](https://github.com/ionic-team/ionic-framework/commit/ab733b71dd355d9486757f219fe09acaefeeefcc)) +* **input:** prevent placeholder from overlapping start slot during scroll assist ([#30896](https://github.com/ionic-team/ionic-framework/issues/30896)) ([3b3318d](https://github.com/ionic-team/ionic-framework/commit/3b3318da513b199128f3822bd8226797cd118b0f)) +* **modal:** prevent card modal animation on viewport resize when modal is closed ([#30894](https://github.com/ionic-team/ionic-framework/issues/30894)) ([36f4b4d](https://github.com/ionic-team/ionic-framework/commit/36f4b4d600a8d9e53959a24ba51087a0eb587030)), closes [#30679](https://github.com/ionic-team/ionic-framework/issues/30679) +* **tab-bar:** prevent keyboard controller memory leak on rapid mount/unmount ([#30906](https://github.com/ionic-team/ionic-framework/issues/30906)) ([f99d000](https://github.com/ionic-team/ionic-framework/commit/f99d0007a8ffc9c7d3d2636e912c37c12112b21d)) + + + + + ## [8.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) diff --git a/core/package-lock.json b/core/package-lock.json index 0bd942fdde6..911c6deec35 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/core", - "version": "8.7.16", + "version": "8.7.17", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/core", - "version": "8.7.16", + "version": "8.7.17", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -9839,4 +9839,4 @@ } } } -} +} \ No newline at end of file diff --git a/core/package.json b/core/package.json index dc92468f9c1..ceb84b5c68c 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/core", - "version": "8.7.16", + "version": "8.7.17", "description": "Base components for Ionic", "engines": { "node": ">= 16" diff --git a/lerna.json b/lerna.json index 0ce1bce2214..6008776b4a0 100644 --- a/lerna.json +++ b/lerna.json @@ -3,5 +3,5 @@ "core", "packages/*" ], - "version": "8.7.16" + "version": "8.7.17" } \ No newline at end of file diff --git a/packages/angular-server/CHANGELOG.md b/packages/angular-server/CHANGELOG.md index df8a394101b..b74f0e8681f 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.7.17](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.17) (2026-01-14) + +**Note:** Version bump only for package @ionic/angular-server + + + + + ## [8.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) **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 333343c52c9..64b461620d0 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.7.16", + "version": "8.7.17", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular-server", - "version": "8.7.16", + "version": "8.7.17", "license": "MIT", "dependencies": { - "@ionic/core": "^8.7.16" + "@ionic/core": "^8.7.17" }, "devDependencies": { "@angular-eslint/eslint-plugin": "^16.0.0", @@ -11289,4 +11289,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/angular-server/package.json b/packages/angular-server/package.json index 9e25f51bfe4..d5c14dfc2da 100644 --- a/packages/angular-server/package.json +++ b/packages/angular-server/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular-server", - "version": "8.7.16", + "version": "8.7.17", "description": "Angular SSR Module for Ionic", "keywords": [ "ionic", @@ -62,6 +62,6 @@ }, "prettier": "@ionic/prettier-config", "dependencies": { - "@ionic/core": "^8.7.16" + "@ionic/core": "^8.7.17" } } diff --git a/packages/angular/CHANGELOG.md b/packages/angular/CHANGELOG.md index 462ee3b5c47..1dea6651368 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.7.17](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.17) (2026-01-14) + +**Note:** Version bump only for package @ionic/angular + + + + + ## [8.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) **Note:** Version bump only for package @ionic/angular diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index b5b91dcd0c2..05723dc93e7 100644 --- a/packages/angular/package-lock.json +++ b/packages/angular/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/angular", - "version": "8.7.16", + "version": "8.7.17", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/angular", - "version": "8.7.16", + "version": "8.7.17", "license": "MIT", "dependencies": { - "@ionic/core": "^8.7.16", + "@ionic/core": "^8.7.17", "ionicons": "^8.0.13", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" @@ -9095,4 +9095,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/angular/package.json b/packages/angular/package.json index ba942d4bec5..4c004676f59 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular", - "version": "8.7.16", + "version": "8.7.17", "description": "Angular specific wrappers for @ionic/core", "keywords": [ "ionic", @@ -48,7 +48,7 @@ } }, "dependencies": { - "@ionic/core": "^8.7.16", + "@ionic/core": "^8.7.17", "ionicons": "^8.0.13", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" diff --git a/packages/docs/CHANGELOG.md b/packages/docs/CHANGELOG.md index ad478b96ec9..50534022bdf 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.7.17](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.17) (2026-01-14) + +**Note:** Version bump only for package @ionic/docs + + + + + ## [8.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) **Note:** Version bump only for package @ionic/docs diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index 193cb5e4651..f483e3948d7 100644 --- a/packages/docs/package-lock.json +++ b/packages/docs/package-lock.json @@ -1,13 +1,13 @@ { "name": "@ionic/docs", - "version": "8.7.16", + "version": "8.7.17", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/docs", - "version": "8.7.16", + "version": "8.7.17", "license": "MIT" } } -} +} \ No newline at end of file diff --git a/packages/docs/package.json b/packages/docs/package.json index 8c649547ed2..2040a6431db 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/docs", - "version": "8.7.16", + "version": "8.7.17", "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 2f31ae84c48..33130cc8d03 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.7.17](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.17) (2026-01-14) + +**Note:** Version bump only for package @ionic/react-router + + + + + ## [8.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) **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 4e1bfdf78f5..2ad12efa400 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.7.16", + "version": "8.7.17", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react-router", - "version": "8.7.16", + "version": "8.7.17", "license": "MIT", "dependencies": { - "@ionic/react": "^8.7.16", + "@ionic/react": "^8.7.17", "tslib": "*" }, "devDependencies": { @@ -6847,4 +6847,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 8bcc2e3b004..6b023a553ff 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react-router", - "version": "8.7.16", + "version": "8.7.17", "description": "React Router wrapper for @ionic/react", "keywords": [ "ionic", @@ -36,7 +36,7 @@ "dist/" ], "dependencies": { - "@ionic/react": "^8.7.16", + "@ionic/react": "^8.7.17", "tslib": "*" }, "peerDependencies": { diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index c7dc3da95d4..61251f96c5a 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.7.17](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.17) (2026-01-14) + +**Note:** Version bump only for package @ionic/react + + + + + ## [8.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) **Note:** Version bump only for package @ionic/react diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index 88b3f757591..2ea0ddf28c0 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react", - "version": "8.7.16", + "version": "8.7.17", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/react", - "version": "8.7.16", + "version": "8.7.17", "license": "MIT", "dependencies": { - "@ionic/core": "^8.7.16", + "@ionic/core": "^8.7.17", "ionicons": "^8.0.13", "tslib": "*" }, @@ -11916,4 +11916,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/react/package.json b/packages/react/package.json index f6b5f984087..20669aba176 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react", - "version": "8.7.16", + "version": "8.7.17", "description": "React specific wrapper for @ionic/core", "keywords": [ "ionic", @@ -40,7 +40,7 @@ "css/" ], "dependencies": { - "@ionic/core": "^8.7.16", + "@ionic/core": "^8.7.17", "ionicons": "^8.0.13", "tslib": "*" }, diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md index 0591d860da6..cd7f99de308 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.7.17](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.17) (2026-01-14) + +**Note:** Version bump only for package @ionic/vue-router + + + + + ## [8.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) **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 e62f0e245c1..1b686e39de7 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.7.16", + "version": "8.7.17", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue-router", - "version": "8.7.16", + "version": "8.7.17", "license": "MIT", "dependencies": { - "@ionic/vue": "^8.7.16" + "@ionic/vue": "^8.7.17" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", @@ -12994,4 +12994,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/vue-router/package.json b/packages/vue-router/package.json index fc32e9c1651..a240af99924 100644 --- a/packages/vue-router/package.json +++ b/packages/vue-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue-router", - "version": "8.7.16", + "version": "8.7.17", "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.7.16" + "@ionic/vue": "^8.7.17" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index c2f258ad818..65fbd1d0044 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.7.17](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.17) (2026-01-14) + +**Note:** Version bump only for package @ionic/vue + + + + + ## [8.7.16](https://github.com/ionic-team/ionic-framework/compare/v8.7.15...v8.7.16) (2025-12-31) **Note:** Version bump only for package @ionic/vue diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index 6ec90dca9e4..a46195c7d2e 100644 --- a/packages/vue/package-lock.json +++ b/packages/vue/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue", - "version": "8.7.16", + "version": "8.7.17", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ionic/vue", - "version": "8.7.16", + "version": "8.7.17", "license": "MIT", "dependencies": { - "@ionic/core": "^8.7.16", + "@ionic/core": "^8.7.17", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" }, @@ -4022,4 +4022,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/vue/package.json b/packages/vue/package.json index a40bdb24cd2..85a621fb185 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue", - "version": "8.7.16", + "version": "8.7.17", "description": "Vue specific wrapper for @ionic/core", "scripts": { "eslint": "eslint src", @@ -68,7 +68,7 @@ "vue-router": "^4.0.16" }, "dependencies": { - "@ionic/core": "^8.7.16", + "@ionic/core": "^8.7.17", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" }, From dd1c1e8fa30c56be1764db1939d72abad26b1d8d Mon Sep 17 00:00:00 2001 From: ionitron Date: Wed, 14 Jan 2026 18:59:30 +0000 Subject: [PATCH 10/55] chore(): update package lock files --- core/package-lock.json | 2 +- packages/angular-server/package-lock.json | 14 +++++------ packages/angular/package-lock.json | 8 +++--- packages/docs/package-lock.json | 2 +- packages/react-router/package-lock.json | 30 +++++++++++------------ packages/react/package-lock.json | 8 +++--- packages/vue-router/package-lock.json | 30 +++++++++++------------ packages/vue/package-lock.json | 8 +++--- 8 files changed, 51 insertions(+), 51 deletions(-) diff --git a/core/package-lock.json b/core/package-lock.json index 911c6deec35..17ad6bf9595 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -9839,4 +9839,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/angular-server/package-lock.json b/packages/angular-server/package-lock.json index 64b461620d0..8f1369ea6e4 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.7.16", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", - "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.17.tgz", + "integrity": "sha512-gp7PIEJX27NX/FkjiUlpjQUtJiFFE5W1lofRC5CfORQ8p4PrLh9wJO9EJH0YryCr2qZS0k47sYgRQP5FwiXlpg==", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -7309,9 +7309,9 @@ "dev": true }, "@ionic/core": { - "version": "8.7.16", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", - "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.17.tgz", + "integrity": "sha512-gp7PIEJX27NX/FkjiUlpjQUtJiFFE5W1lofRC5CfORQ8p4PrLh9wJO9EJH0YryCr2qZS0k47sYgRQP5FwiXlpg==", "requires": { "@stencil/core": "4.38.0", "ionicons": "^8.0.13", @@ -11289,4 +11289,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index 05723dc93e7..17f31587612 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.7.16", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", - "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.17.tgz", + "integrity": "sha512-gp7PIEJX27NX/FkjiUlpjQUtJiFFE5W1lofRC5CfORQ8p4PrLh9wJO9EJH0YryCr2qZS0k47sYgRQP5FwiXlpg==", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -9095,4 +9095,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index f483e3948d7..74a2705a8a4 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 2ad12efa400..ab02547a079 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.7.16", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", - "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.17.tgz", + "integrity": "sha512-gp7PIEJX27NX/FkjiUlpjQUtJiFFE5W1lofRC5CfORQ8p4PrLh9wJO9EJH0YryCr2qZS0k47sYgRQP5FwiXlpg==", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -418,12 +418,12 @@ } }, "node_modules/@ionic/react": { - "version": "8.7.16", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.16.tgz", - "integrity": "sha512-36y+VmtssJ4vfrCJxUEaOo5tFQRP1m87kxVVC6Cc2ctjLQRDEMszG9v3ctzxD+8EszFLMHEmsSTvGGCelDJlvQ==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.17.tgz", + "integrity": "sha512-t/ApHBEigSTvovM/hKtNAMrddoOQ5l2GlyjOzASUq7sJLvDS4ewDMk5pRahjGqmFSYSN8TIBlF9QAHswp6XTRg==", "license": "MIT", "dependencies": { - "@ionic/core": "8.7.16", + "@ionic/core": "8.7.17", "ionicons": "^8.0.13", "tslib": "*" }, @@ -4178,9 +4178,9 @@ "dev": true }, "@ionic/core": { - "version": "8.7.16", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", - "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.17.tgz", + "integrity": "sha512-gp7PIEJX27NX/FkjiUlpjQUtJiFFE5W1lofRC5CfORQ8p4PrLh9wJO9EJH0YryCr2qZS0k47sYgRQP5FwiXlpg==", "requires": { "@stencil/core": "4.38.0", "ionicons": "^8.0.13", @@ -4284,11 +4284,11 @@ "requires": {} }, "@ionic/react": { - "version": "8.7.16", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.16.tgz", - "integrity": "sha512-36y+VmtssJ4vfrCJxUEaOo5tFQRP1m87kxVVC6Cc2ctjLQRDEMszG9v3ctzxD+8EszFLMHEmsSTvGGCelDJlvQ==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.17.tgz", + "integrity": "sha512-t/ApHBEigSTvovM/hKtNAMrddoOQ5l2GlyjOzASUq7sJLvDS4ewDMk5pRahjGqmFSYSN8TIBlF9QAHswp6XTRg==", "requires": { - "@ionic/core": "8.7.16", + "@ionic/core": "8.7.17", "ionicons": "^8.0.13", "tslib": "*" } @@ -6847,4 +6847,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index 2ea0ddf28c0..bbe1c7efb1c 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.7.16", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", - "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.17.tgz", + "integrity": "sha512-gp7PIEJX27NX/FkjiUlpjQUtJiFFE5W1lofRC5CfORQ8p4PrLh9wJO9EJH0YryCr2qZS0k47sYgRQP5FwiXlpg==", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -11916,4 +11916,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/vue-router/package-lock.json b/packages/vue-router/package-lock.json index 1b686e39de7..c3c0e300ba4 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.7.16", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", - "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.17.tgz", + "integrity": "sha512-gp7PIEJX27NX/FkjiUlpjQUtJiFFE5W1lofRC5CfORQ8p4PrLh9wJO9EJH0YryCr2qZS0k47sYgRQP5FwiXlpg==", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -868,12 +868,12 @@ } }, "node_modules/@ionic/vue": { - "version": "8.7.16", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.16.tgz", - "integrity": "sha512-7ZKKUj+PgzV/SiSbSPFE/anQzT3kHLrb7JGrw394QZB1E3aehljgt/hDaQzityRtgqgUaaJZx22MGrg5r9kePQ==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.17.tgz", + "integrity": "sha512-S/UQc/ytauWxcAtM6cLz1mbpqwv8xuSdTzF8aslPi8zGELdXJSg48QBP6ehhFj+uv8qsblrRd4TjCQYyskyMCQ==", "license": "MIT", "dependencies": { - "@ionic/core": "8.7.16", + "@ionic/core": "8.7.17", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" } @@ -8044,9 +8044,9 @@ "dev": true }, "@ionic/core": { - "version": "8.7.16", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", - "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.17.tgz", + "integrity": "sha512-gp7PIEJX27NX/FkjiUlpjQUtJiFFE5W1lofRC5CfORQ8p4PrLh9wJO9EJH0YryCr2qZS0k47sYgRQP5FwiXlpg==", "requires": { "@stencil/core": "4.38.0", "ionicons": "^8.0.13", @@ -8159,11 +8159,11 @@ "requires": {} }, "@ionic/vue": { - "version": "8.7.16", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.16.tgz", - "integrity": "sha512-7ZKKUj+PgzV/SiSbSPFE/anQzT3kHLrb7JGrw394QZB1E3aehljgt/hDaQzityRtgqgUaaJZx22MGrg5r9kePQ==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.17.tgz", + "integrity": "sha512-S/UQc/ytauWxcAtM6cLz1mbpqwv8xuSdTzF8aslPi8zGELdXJSg48QBP6ehhFj+uv8qsblrRd4TjCQYyskyMCQ==", "requires": { - "@ionic/core": "8.7.16", + "@ionic/core": "8.7.17", "@stencil/vue-output-target": "0.10.7", "ionicons": "^8.0.13" } @@ -12994,4 +12994,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index a46195c7d2e..ab7d45d1f10 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.7.16", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.16.tgz", - "integrity": "sha512-+vdv/o2Z/2YfoZJIDBLnoh11eJmOOZqQdfwC0zl2MemAVRSofjGuIQlUTZqiUUNht56Rnk9oo53TvmgjNCtmDA==", + "version": "8.7.17", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.17.tgz", + "integrity": "sha512-gp7PIEJX27NX/FkjiUlpjQUtJiFFE5W1lofRC5CfORQ8p4PrLh9wJO9EJH0YryCr2qZS0k47sYgRQP5FwiXlpg==", "license": "MIT", "dependencies": { "@stencil/core": "4.38.0", @@ -4022,4 +4022,4 @@ "dev": true } } -} \ No newline at end of file +} From 1bccf76d35937f117ca67b992df3b2c59e325a07 Mon Sep 17 00:00:00 2001 From: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> Date: Wed, 14 Jan 2026 14:22:32 -0500 Subject: [PATCH 11/55] chore(changelog): remove duplicate fixes in wrong version --- CHANGELOG.md | 2 -- core/CHANGELOG.md | 1 - 2 files changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1475417352..9e79dca4b11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,6 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline * **input:** prevent Android TalkBack from focusing label separately ([#30895](https://github.com/ionic-team/ionic-framework/issues/30895)) ([ab733b7](https://github.com/ionic-team/ionic-framework/commit/ab733b71dd355d9486757f219fe09acaefeeefcc)) * **input:** prevent placeholder from overlapping start slot during scroll assist ([#30896](https://github.com/ionic-team/ionic-framework/issues/30896)) ([3b3318d](https://github.com/ionic-team/ionic-framework/commit/3b3318da513b199128f3822bd8226797cd118b0f)) -* **modal:** prevent card modal animation on viewport resize when modal is closed ([#30894](https://github.com/ionic-team/ionic-framework/issues/30894)) ([36f4b4d](https://github.com/ionic-team/ionic-framework/commit/36f4b4d600a8d9e53959a24ba51087a0eb587030)), closes [#30679](https://github.com/ionic-team/ionic-framework/issues/30679) -* **modal:** prevent card modal animation on viewport resize when modal is closed ([#30894](https://github.com/ionic-team/ionic-framework/issues/30894)) ([e5634d4](https://github.com/ionic-team/ionic-framework/commit/e5634d45ee5fd32715f6e6b75e0448f74ee1f8f2)), closes [#30679](https://github.com/ionic-team/ionic-framework/issues/30679) * **tab-bar:** prevent keyboard controller memory leak on rapid mount/unmount ([#30906](https://github.com/ionic-team/ionic-framework/issues/30906)) ([f99d000](https://github.com/ionic-team/ionic-framework/commit/f99d0007a8ffc9c7d3d2636e912c37c12112b21d)) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 517297e0d4b..a806dfc653b 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -10,7 +10,6 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline * **input:** prevent Android TalkBack from focusing label separately ([#30895](https://github.com/ionic-team/ionic-framework/issues/30895)) ([ab733b7](https://github.com/ionic-team/ionic-framework/commit/ab733b71dd355d9486757f219fe09acaefeeefcc)) * **input:** prevent placeholder from overlapping start slot during scroll assist ([#30896](https://github.com/ionic-team/ionic-framework/issues/30896)) ([3b3318d](https://github.com/ionic-team/ionic-framework/commit/3b3318da513b199128f3822bd8226797cd118b0f)) -* **modal:** prevent card modal animation on viewport resize when modal is closed ([#30894](https://github.com/ionic-team/ionic-framework/issues/30894)) ([36f4b4d](https://github.com/ionic-team/ionic-framework/commit/36f4b4d600a8d9e53959a24ba51087a0eb587030)), closes [#30679](https://github.com/ionic-team/ionic-framework/issues/30679) * **tab-bar:** prevent keyboard controller memory leak on rapid mount/unmount ([#30906](https://github.com/ionic-team/ionic-framework/issues/30906)) ([f99d000](https://github.com/ionic-team/ionic-framework/commit/f99d0007a8ffc9c7d3d2636e912c37c12112b21d)) From 4eca8d39d881f1167877993636838d3f845cf2d8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:54:52 -0500 Subject: [PATCH 12/55] chore(deps): update actions/setup-node action to v6.2.0 (#30918) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [actions/setup-node](https://redirect.github.com/actions/setup-node) | action | minor | `v6.1.0` → `v6.2.0` | --- ### Release Notes
actions/setup-node (actions/setup-node) ### [`v6.2.0`](https://redirect.github.com/actions/setup-node/compare/v6.1.0...v6.2.0) [Compare Source](https://redirect.github.com/actions/setup-node/compare/v6.1.0...v6.2.0)
--- ### Configuration 📅 **Schedule**: Branch creation - "every weekday before 11am" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Never, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/ionic-team/ionic-framework). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/actions/publish-npm/action.yml | 2 +- .github/workflows/actions/build-angular-server/action.yml | 2 +- .../workflows/actions/build-core-stencil-prerelease/action.yml | 2 +- .github/workflows/actions/build-core/action.yml | 2 +- .github/workflows/actions/build-react-router/action.yml | 2 +- .github/workflows/actions/build-react/action.yml | 2 +- .github/workflows/actions/build-vue-router/action.yml | 2 +- .github/workflows/actions/build-vue/action.yml | 2 +- .github/workflows/actions/test-angular-e2e/action.yml | 2 +- .github/workflows/actions/test-core-clean-build/action.yml | 2 +- .github/workflows/actions/test-core-lint/action.yml | 2 +- .github/workflows/actions/test-core-screenshot/action.yml | 2 +- .github/workflows/actions/test-core-spec/action.yml | 2 +- .github/workflows/actions/test-react-e2e/action.yml | 2 +- .github/workflows/actions/test-react-router-e2e/action.yml | 2 +- .github/workflows/actions/test-vue-e2e/action.yml | 2 +- .../workflows/actions/update-reference-screenshots/action.yml | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/actions/publish-npm/action.yml b/.github/actions/publish-npm/action.yml index 0b5e9924719..dc77edb66ae 100644 --- a/.github/actions/publish-npm/action.yml +++ b/.github/actions/publish-npm/action.yml @@ -22,7 +22,7 @@ runs: using: 'composite' steps: - name: 🟢 Configure Node for Publish - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: ${{ inputs.node-version }} registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/actions/build-angular-server/action.yml b/.github/workflows/actions/build-angular-server/action.yml index a90da3676c1..cb2b667ffaf 100644 --- a/.github/workflows/actions/build-angular-server/action.yml +++ b/.github/workflows/actions/build-angular-server/action.yml @@ -3,7 +3,7 @@ description: 'Build Ionic Angular Server' runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - uses: ./.github/workflows/actions/download-archive diff --git a/.github/workflows/actions/build-core-stencil-prerelease/action.yml b/.github/workflows/actions/build-core-stencil-prerelease/action.yml index 7bfb3fdfcb5..d58299125e3 100644 --- a/.github/workflows/actions/build-core-stencil-prerelease/action.yml +++ b/.github/workflows/actions/build-core-stencil-prerelease/action.yml @@ -9,7 +9,7 @@ runs: using: 'composite' steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x diff --git a/.github/workflows/actions/build-core/action.yml b/.github/workflows/actions/build-core/action.yml index 71fc61f6991..19487732007 100644 --- a/.github/workflows/actions/build-core/action.yml +++ b/.github/workflows/actions/build-core/action.yml @@ -9,7 +9,7 @@ runs: using: 'composite' steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - name: 🕸️ Install Dependencies diff --git a/.github/workflows/actions/build-react-router/action.yml b/.github/workflows/actions/build-react-router/action.yml index a003fd83d6c..0c46ad895e1 100644 --- a/.github/workflows/actions/build-react-router/action.yml +++ b/.github/workflows/actions/build-react-router/action.yml @@ -3,7 +3,7 @@ description: 'Build Ionic React Router' runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - uses: ./.github/workflows/actions/download-archive diff --git a/.github/workflows/actions/build-react/action.yml b/.github/workflows/actions/build-react/action.yml index b65292f5dc7..04e3f2c8b3a 100644 --- a/.github/workflows/actions/build-react/action.yml +++ b/.github/workflows/actions/build-react/action.yml @@ -3,7 +3,7 @@ description: 'Build Ionic React' runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - uses: ./.github/workflows/actions/download-archive diff --git a/.github/workflows/actions/build-vue-router/action.yml b/.github/workflows/actions/build-vue-router/action.yml index b5bb65c6f89..897153c9fa4 100644 --- a/.github/workflows/actions/build-vue-router/action.yml +++ b/.github/workflows/actions/build-vue-router/action.yml @@ -3,7 +3,7 @@ description: 'Builds Ionic Vue Router' runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - uses: ./.github/workflows/actions/download-archive diff --git a/.github/workflows/actions/build-vue/action.yml b/.github/workflows/actions/build-vue/action.yml index e660c31bbbd..ddd96b7a690 100644 --- a/.github/workflows/actions/build-vue/action.yml +++ b/.github/workflows/actions/build-vue/action.yml @@ -3,7 +3,7 @@ description: 'Build Ionic Vue' runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - uses: ./.github/workflows/actions/download-archive diff --git a/.github/workflows/actions/test-angular-e2e/action.yml b/.github/workflows/actions/test-angular-e2e/action.yml index 9c3ac716d53..1e5b49b3150 100644 --- a/.github/workflows/actions/test-angular-e2e/action.yml +++ b/.github/workflows/actions/test-angular-e2e/action.yml @@ -6,7 +6,7 @@ inputs: runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - uses: ./.github/workflows/actions/download-archive diff --git a/.github/workflows/actions/test-core-clean-build/action.yml b/.github/workflows/actions/test-core-clean-build/action.yml index b69a485b33f..ac5c345a235 100644 --- a/.github/workflows/actions/test-core-clean-build/action.yml +++ b/.github/workflows/actions/test-core-clean-build/action.yml @@ -3,7 +3,7 @@ description: 'Test Core Clean Build' runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x diff --git a/.github/workflows/actions/test-core-lint/action.yml b/.github/workflows/actions/test-core-lint/action.yml index 8e81bd6a635..a32355d33fa 100644 --- a/.github/workflows/actions/test-core-lint/action.yml +++ b/.github/workflows/actions/test-core-lint/action.yml @@ -3,7 +3,7 @@ description: 'Test Core Lint' runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - name: 🕸️ Install Dependencies diff --git a/.github/workflows/actions/test-core-screenshot/action.yml b/.github/workflows/actions/test-core-screenshot/action.yml index e3c7d8771d5..1ae7ac361e0 100644 --- a/.github/workflows/actions/test-core-screenshot/action.yml +++ b/.github/workflows/actions/test-core-screenshot/action.yml @@ -13,7 +13,7 @@ inputs: runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - uses: ./.github/workflows/actions/download-archive diff --git a/.github/workflows/actions/test-core-spec/action.yml b/.github/workflows/actions/test-core-spec/action.yml index ee54ae604cf..3cbfa7aefd1 100644 --- a/.github/workflows/actions/test-core-spec/action.yml +++ b/.github/workflows/actions/test-core-spec/action.yml @@ -6,7 +6,7 @@ inputs: runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - name: 🕸️ Install Dependencies diff --git a/.github/workflows/actions/test-react-e2e/action.yml b/.github/workflows/actions/test-react-e2e/action.yml index d27dd9f836e..18fb14c705e 100644 --- a/.github/workflows/actions/test-react-e2e/action.yml +++ b/.github/workflows/actions/test-react-e2e/action.yml @@ -6,7 +6,7 @@ inputs: runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - uses: ./.github/workflows/actions/download-archive diff --git a/.github/workflows/actions/test-react-router-e2e/action.yml b/.github/workflows/actions/test-react-router-e2e/action.yml index b4e627ee896..3af841bf83c 100644 --- a/.github/workflows/actions/test-react-router-e2e/action.yml +++ b/.github/workflows/actions/test-react-router-e2e/action.yml @@ -6,7 +6,7 @@ inputs: runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - uses: ./.github/workflows/actions/download-archive diff --git a/.github/workflows/actions/test-vue-e2e/action.yml b/.github/workflows/actions/test-vue-e2e/action.yml index c0adfd409b9..0c15dac0822 100644 --- a/.github/workflows/actions/test-vue-e2e/action.yml +++ b/.github/workflows/actions/test-vue-e2e/action.yml @@ -6,7 +6,7 @@ inputs: runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - uses: ./.github/workflows/actions/download-archive diff --git a/.github/workflows/actions/update-reference-screenshots/action.yml b/.github/workflows/actions/update-reference-screenshots/action.yml index ad41d5e724d..f104d227095 100644 --- a/.github/workflows/actions/update-reference-screenshots/action.yml +++ b/.github/workflows/actions/update-reference-screenshots/action.yml @@ -7,7 +7,7 @@ on: runs: using: 'composite' steps: - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x - uses: actions/download-artifact@v7 From 62d880d62052438ad04ff3f5d5d8ad9c942c1569 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:56:28 -0500 Subject: [PATCH 13/55] chore(deps): update dependency @capacitor/core to v8.0.1 (#30914) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@capacitor/core](https://capacitorjs.com) ([source](https://redirect.github.com/ionic-team/capacitor)) | [`8.0.0` → `8.0.1`](https://renovatebot.com/diffs/npm/@capacitor%2fcore/8.0.0/8.0.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@capacitor%2fcore/8.0.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@capacitor%2fcore/8.0.0/8.0.1?slim=true) | --- ### Release Notes
ionic-team/capacitor (@​capacitor/core) ### [`v8.0.1`](https://redirect.github.com/ionic-team/capacitor/blob/HEAD/CHANGELOG.md#801-2026-01-13) [Compare Source](https://redirect.github.com/ionic-team/capacitor/compare/8.0.0...8.0.1) ##### Bug Fixes - **android:** Remove calculated bottom inset if keyboard is visible ([#​8280](https://redirect.github.com/ionic-team/capacitor/issues/8280)) ([196b642](https://redirect.github.com/ionic-team/capacitor/commit/196b642236d293a5012e3c307fcd942766e56cce)) - **cli:** Support wireless iOS devices in `cap run` ([#​8301](https://redirect.github.com/ionic-team/capacitor/issues/8301)) ([dcb368c](https://redirect.github.com/ionic-team/capacitor/commit/dcb368c33555487f1b6f46a6d8e30736bdd78955)) - **cli:** use latest native-run ([#​8296](https://redirect.github.com/ionic-team/capacitor/issues/8296)) ([121d830](https://redirect.github.com/ionic-team/capacitor/commit/121d83013f39e25009121533a2c3ad86e428d6b2))
--- ### Configuration 📅 **Schedule**: Branch creation - "every weekday before 11am" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Never, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/ionic-team/ionic-framework). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- core/package-lock.json | 43 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/core/package-lock.json b/core/package-lock.json index 17ad6bf9595..25a81fd8f8a 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -94,6 +94,7 @@ "version": "7.16.12", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -628,11 +629,12 @@ "license": "MIT" }, "node_modules/@capacitor/core": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.0.0.tgz", - "integrity": "sha512-250HTVd/W/KdMygoqaedisvNbHbpbQTN2Hy/8ZYGm1nAqE0Fx7sGss4l0nDg33STxEdDhtVRoL2fIaaiukKseA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.0.1.tgz", + "integrity": "sha512-5UqSWxGMp/B8KhYu7rAijqNtYslhcLh+TrbfU48PfdMDsPfaU/VY48sMNzC22xL8BmoFoql/3SKyP+pavTOvOA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -870,6 +872,7 @@ "version": "4.33.0", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "4.33.0", "@typescript-eslint/types": "4.33.0", @@ -1807,6 +1810,7 @@ "node_modules/@stencil/core": { "version": "4.38.0", "license": "MIT", + "peer": true, "bin": { "stencil": "bin/stencil" }, @@ -2231,6 +2235,7 @@ "version": "6.7.2", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "6.7.2", "@typescript-eslint/types": "6.7.2", @@ -2456,7 +2461,6 @@ "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.25", @@ -2471,7 +2475,6 @@ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=0.12" }, @@ -2484,8 +2487,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@vue/compiler-dom": { "version": "3.5.25", @@ -2493,7 +2495,6 @@ "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-core": "3.5.25", "@vue/shared": "3.5.25" @@ -2505,7 +2506,6 @@ "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.25", @@ -2523,8 +2523,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@vue/compiler-sfc/node_modules/postcss": { "version": "8.5.6", @@ -2546,7 +2545,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -2562,7 +2560,6 @@ "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.25", "@vue/shared": "3.5.25" @@ -2574,7 +2571,6 @@ "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/shared": "3.5.25" } @@ -2585,7 +2581,6 @@ "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/reactivity": "3.5.25", "@vue/shared": "3.5.25" @@ -2597,7 +2592,6 @@ "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/reactivity": "3.5.25", "@vue/runtime-core": "3.5.25", @@ -2611,7 +2605,6 @@ "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-ssr": "3.5.25", "@vue/shared": "3.5.25" @@ -2625,8 +2618,7 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz", "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@zeit/schemas": { "version": "2.21.0", @@ -2649,6 +2641,7 @@ "version": "7.4.0", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3809,8 +3802,7 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/debug": { "version": "2.6.9", @@ -4104,6 +4096,7 @@ "version": "7.32.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -7299,7 +7292,6 @@ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -7621,7 +7613,6 @@ } ], "license": "MIT", - "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -7976,6 +7967,7 @@ "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "playwright-core": "cli.js" }, @@ -7987,6 +7979,7 @@ "version": "7.0.35", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -8092,6 +8085,7 @@ "version": "0.36.2", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "postcss": ">=5.0.0" } @@ -8140,6 +8134,7 @@ "version": "2.6.1", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -8497,6 +8492,7 @@ "version": "2.35.1", "dev": true, "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -8718,7 +8714,6 @@ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } From 442e3e983107a69cea4fb5587fb33da718eee8a3 Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Mon, 19 Jan 2026 16:48:13 -0500 Subject: [PATCH 14/55] fix(toast): keep icon on the same line as long message in stacked layout (#30923) Issue number: resolves #30908 --------- ## What is the current behavior? Toast with an icon and long message using a stacked layout will wrap the message below the icon. ## What is the new behavior? - Apply `flex: 1` to `.toast-content` regardless of layout, which makes sure the content does not get wrapped under the icon - Adds an e2e test for a stacked toast with a long message to `toast/test/layout` ## Does this introduce a breaking change? - [ ] Yes - [x] No ## Other information - Dev build: `8.7.18-dev.11768592717.14a59d2f` - Preview: [Layout](https://ionic-framework-git-fw-7035-ionic1.vercel.app/src/components/toast/test/layout/) --------- Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- .../components/toast/test/layout/index.html | 10 ++++++++++ .../components/toast/test/layout/toast.e2e.ts | 18 +++++++++++++++++- ...ng-message-ios-ltr-Mobile-Chrome-linux.png | Bin 0 -> 10932 bytes ...g-message-ios-ltr-Mobile-Firefox-linux.png | Bin 0 -> 16714 bytes ...ng-message-ios-ltr-Mobile-Safari-linux.png | Bin 0 -> 17530 bytes ...ng-message-ios-rtl-Mobile-Chrome-linux.png | Bin 0 -> 10901 bytes ...g-message-ios-rtl-Mobile-Firefox-linux.png | Bin 0 -> 16602 bytes ...ng-message-ios-rtl-Mobile-Safari-linux.png | Bin 0 -> 16984 bytes ...ong-message-md-ltr-Mobile-Chrome-linux.png | Bin 0 -> 10842 bytes ...ng-message-md-ltr-Mobile-Firefox-linux.png | Bin 0 -> 15910 bytes ...ong-message-md-ltr-Mobile-Safari-linux.png | Bin 0 -> 16889 bytes ...ong-message-md-rtl-Mobile-Chrome-linux.png | Bin 0 -> 10792 bytes ...ng-message-md-rtl-Mobile-Firefox-linux.png | Bin 0 -> 16075 bytes ...ong-message-md-rtl-Mobile-Safari-linux.png | Bin 0 -> 16845 bytes core/src/components/toast/toast.scss | 3 ++- 15 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-ios-ltr-Mobile-Chrome-linux.png create mode 100644 core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-ios-ltr-Mobile-Firefox-linux.png create mode 100644 core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-ios-ltr-Mobile-Safari-linux.png create mode 100644 core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-ios-rtl-Mobile-Chrome-linux.png create mode 100644 core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-ios-rtl-Mobile-Firefox-linux.png create mode 100644 core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-ios-rtl-Mobile-Safari-linux.png create mode 100644 core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-md-ltr-Mobile-Chrome-linux.png create mode 100644 core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-md-ltr-Mobile-Firefox-linux.png create mode 100644 core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-md-ltr-Mobile-Safari-linux.png create mode 100644 core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-md-rtl-Mobile-Chrome-linux.png create mode 100644 core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-md-rtl-Mobile-Firefox-linux.png create mode 100644 core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-md-rtl-Mobile-Safari-linux.png diff --git a/core/src/components/toast/test/layout/index.html b/core/src/components/toast/test/layout/index.html index 81a2760bdb1..227539c7369 100644 --- a/core/src/components/toast/test/layout/index.html +++ b/core/src/components/toast/test/layout/index.html @@ -29,6 +29,9 @@ + diff --git a/core/src/components/toast/test/layout/toast.e2e.ts b/core/src/components/toast/test/layout/toast.e2e.ts index f4fb2667fa6..4153df86e2e 100644 --- a/core/src/components/toast/test/layout/toast.e2e.ts +++ b/core/src/components/toast/test/layout/toast.e2e.ts @@ -3,7 +3,7 @@ import { configs, test } from '@utils/test/playwright'; configs().forEach(({ title, screenshot, config }) => { test.describe(title('toast: stacked layout'), () => { - test('should render stacked buttons', async ({ page }) => { + test('should render stacked toast', async ({ page }) => { await page.goto('/src/components/toast/test/layout', config); const ionToastDidPresent = await page.spyOnEvent('ionToastDidPresent'); @@ -13,5 +13,21 @@ configs().forEach(({ title, screenshot, config }) => { const toastWrapper = page.locator('ion-toast .toast-wrapper'); await expect(toastWrapper).toHaveScreenshot(screenshot(`toast-stacked`)); }); + + test('should render stacked toast with long message', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30908', + }); + + await page.goto('/src/components/toast/test/layout', config); + const ionToastDidPresent = await page.spyOnEvent('ionToastDidPresent'); + + await page.click('#stacked-long-message'); + await ionToastDidPresent.next(); + + const toastWrapper = page.locator('ion-toast .toast-wrapper'); + await expect(toastWrapper).toHaveScreenshot(screenshot(`toast-stacked-long-message`)); + }); }); }); diff --git a/core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-ios-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..ead92eb7b8abf10c60d39c779c3f2d760af39d94 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-ios-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..f89674be14fb8ef6d9b3c6c9763b2b73e994490e GIT binary patch literal 16714 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 iqLDSS@#et2D=rhvxL7(Yg8EHvXIJj5Nz z*$YSJ=z^(=K^=ZA9Px5y0#I5W3d)`{5nC?O(2w-bEXNG2lr9ZRmcOI&a1rrvEyB8t zxfA7i#O`3In8ZvNn8Y7(5i`jWc$IU*UO7Wq*Uc~WjD zEvy$*@Dq>c!+|dFH#TJ=i;%HBCm!IsG=ep^>SiD<>bvi?znXUgCl<;@dIS}%1)N$2 zj<(;~I&wi_46Af!gkEF*+ARwMSkmnC!nrrTM}7Tc7uA}J)_Hl`2Wj_@km;iyncd(5 z_*x9tgK74Uk}=LGDdoOj30iz6<`&D4eR&hDg^%wKvJSX;HUH9T9x?mRwcZc?9+`8n ztu)cataFu@Z>9{T%|fQfhz$`~44zp+N?$z}8|GdY4i;CnCVE|rut1(YPdeuhZZ`-$Ys;x~a6KW-N>Yip_E? zx@F1Tckkrmb44q+KEplmkW5ou!LVVSU%rSzv#4k!#ha6)!2HXBEleT|ihgYA#HO*gMb7gI zev=&5xGbl}+S7%#nRexqW(_GLgbE~%T%55RuHi5lMKjJYMekjda5L`el1dv?tOi?_ zB^i6)+Q~|riaF!;^T>P|NfL3KUe>yV$R4kKfA&9BRldz(R8#X8TGX|j`t@}X%_>zf7d3RkEURuOTE^p^^hf6cI}=rEFr4W$ndm$;+}4TP-_WDq}EY7$L^=! zcM3C41?lWqIozrj%D=MN*J-e_egY$Y#*}D5a)_$O9s4+X4^3$QEo=uX!9{v85T52^ zJ2dMK@(Bw)HPGkSdHYg#KxOL-`Sx70lOK^x;WNK?C~(qtiJqsPS7z@u-hQh_Gw|iN zDYjlrgFKhlgy3RdX+~p#9zrU(_s{IU`qA+>q^z7G}Qh&IA z;a_TCGI7a~Co)$r>Ue}Q{BBc!NzthIrY|JhD%5O?S|>(w& zmdcOJddnIq!4&rr&`O7yU+bE^t#gI{jvf#|GnhVhK18NP@u?T(rxm%_1>O5?=2{L7bpLLc+YTp>YJY)N??rAn6sb208jUp9tCrtT|YOzg;r&%}L0MjN>lHXuZb3%fk0$u48Gjrsgda z5pM0=aCNA(t3CEm4VUp+vt`wknCmvJxI9)hIN(KKtP>2>f5S31>Lbuj=z?)we+bh3 zv-bmgd#v$&o|XuNpDS4a-tpRCCdU8)Q8R70=ZtU}oE4rC7G&(LI`4f{jNSLywfRBG z3RGm=((?K6T;WGzstqSa(Yr1TF)A5#3M9^}BX1ocSCb%D{^Jv0YRWXbelQWn z%f*8&vjOZ&?5Q$Xlc640f6T@*5wk>cnfCsA4_>5cMOuE3wIS&pu`UZ< zlhp{%Lo54MqJ8|H(HnuPUgEa$Inxu5E1HYhal$@;=iG)gJqgr$;oEk-JU)Lx=I1>T z+p**ytKA5|nDQ}eBr*tUv@}lg)AE|_?5znlEeXD|cwdf$t0Fymf9_5}08J(EsodF* zivnQh_C}RffYh_JSd0|3vCMZQvWHLHwVo)}6tdOsd?S}#qU8JQ?^FFn^$dI{cyCSi zp(eqq1N(O7$#dZ(D7CbRY}FS{%(={j^7Q9k16KHUwDrWy+mAJT_l=+}U!Qb#EY|Z7 zkHqpN7Xi|5Qon5(c)hwl5@Xt`^VSrVftC-=JC?a(ncpwt;ROcVK3|^69ft_$5))_& z#^>Eoq;j~drVJck4r)~MwH=?zLs*BzFrIK=$oD1fj|KJdovMgP|DP|EKtx8bATOt~vT8ErKQ#T_PFeo$ zG+aX58B8iJNoCry8(9B-4nl8ozVP)K1{3Y|8N<+SQpU%_C!u2jd4o_TIHe6xp`#e% z0QPZ88lJL$e!-9Zh`2gLNS(7tdg;qAf1jTZ0G4DqfI z5{QxGR)6fbnX*_8z4@1XGy(?02iEdNI-5T}Pxq^B{=fjK!mc*N)OvrN3N_1@lWm*( zcmy|T@W>MK(>#iR8*hIlB*6Thw&D$R*oeKtA|fD>h8NpI-=<3v-+9))C^0Ig^hVML zIfV?FFH}Qto_W?qb2ufD8RAL2dXwI;K7TILy{qh@Ch%>tTWc@VYlw=DX4NQCueH*) zf2cI+xjtS>2Ft}Iz4>N7lBPGi>+lELgIT>md8$ZbV|{%%<*noK;vZqx~=d&J~&&5|$ng&x2McxnBM9iwDOMjhZWMrVd zc^{abB_tV>`K_V8mDUUVy^=S_OOU|?kX29^!pUBD7zNk+`C4lXEc{v=G9J^z*-F=w zWxWO$>w!3SJb~H$t@Et`UdXVB!zL;QGN~w)kkfa4N>Q(Rlb-N`P>;Qq=lgFD*GHMc zJ0s~QQ^oOomYGgPeh4Voq+F}T<<0FXY)ul^7o7 zd=}q>#Mn~5PULNkq|+>LhmvsWFV@)_9KJl9v?!&EKFvYWyRLx+qHX;73da`XIkG@O z^!4l4t^0T_?c;c&f|TKB8$A(}Z_fis^bPfMlli`?mg@X=OVecW?vG){6>M|x!E<@v#OB2OW(9NdIzgDsJ7$ArsdFO+Kc5x1=i zn;{y_XBv|3eci{Hu3o6R6(+E3Xawhqd>-JKCAqd4-$=-${Jz%7%?L&(@NHUNu+i)8 z+|CO=4c!0_L2+cg9hjuxH5lAw!AFjXY>%-{RY78iEuSVrrby7uXztFT-^i4JzuIup zoc!h+aS3(kUA%!0nFIj=LAE}6j5PV}cgEj#YZ6}d-VglGvf1q;A{Uq1!;fqmfT^9Dq!_UFRypXWYRf5>dJzdyx4{JNEH(dk zpF&CfaC#zWf=13Kl*B-@e&sfG$w+9jJqD7F4%>swOW~wHt@f13zFOn;1U}{Z6otZf zxdt;K^7bes@sWvo33jgUPZei>3~SG(24M!UXS^XDoJCQSgB77an54U|cx!5n|1dE+ zL|p(OlI~Y+u*8YeJ_N!P zxfBo}h(>y$-M|d=Md&n$!%{$$tvwr}2r{F(8;-8?HpZ&v${Iz}}bVo0ekD@+v3)xKKzCHq~F3Bk~ZYy;2&O zlT`OaJODp(lONb#|^694*vgd;&8t z02320RGSSjz;k&$%g>IQeWZE!2?Bt|7rp2UdQN!VI9?;Mt;Y{x(b*3)1_ai zu!DXfix(crujxmztJeuC=<=#CV06wf%4?`bbrOHmPg30qu%@5Z^;h9C}q_Kz#shMQUGs= z*|cy+Ad8lQqxto&%kC%}WIgNeNo!i3t`{~U#KK>NE^NhW>f^mOKV5CJ+fx3rNT8Ol zXgyz3*k$bgbT#vBstCL|3e&9tG7w--y$ZAx?gyA0x`0jZxZLQ@%*<@oAA@%(Rmhri zpHT04AeB7X3l;EeFJOEcw@EjUJikpAWKO!|ddk!)zX*M^O6teT zcFKi<-@Ya5Z#EwyzZ4VA5VfF^WcSJpj=H0d^)i!>+Ln7qp|v-jYySlm;xBK=M;_K4 zukV4D|JU=Ttp5WKGcy_qG6_OZo%I4S`tAI;^1eJtg6>%SdDe`mGx;V~;AN*%fBqWo zQ6w;zW37`E>e#Pe{ylLkXXtU&A1AWS{ z!BFAx&50?Ozh%k0i!w(*Fy`kn65vMS z*JVujjj9R@5B|TcW(M(n%8`rb*d-IWQwd0@QILzCD%X7Pm84yy&aAF4{U>Amu|Jj- zgXSj@EAj?BgTK{6?0%klfzndDRnq%}yMxtE=c9QdOH_Z0=f^u`;zboV(#diIUtlRu zCw1y2Xm%9Uw!rYn4G1{#uYDg^*sX4V=w$fKnA8r||T$J_?G!*%@e*>r>Uf zh6Wdikz;gFhEsTfB^R|%C4>KYd4s+J@2dRPRM+mj0JjG?5*=)`(cLjG1s`h$&F|ed zQ6Lfqam6p?5jWxrRz8<_!rW~bQ?7@a?0gNps#>7uYO z#})y$)NYl=3&B2=7rc;HYfL=q);p)1GQ;(T{3yDK5`V@z4Rl0A^ZqMi(h zxljBpJBHf{NXLK7v96tFB$Wfv{ofOYDTGX7(VGEWIZI!?L<{dekcktKr0iW<IHfIA*nNKqFM}X3%qG8}>c| zjAQWI{Ck56oZ61>(CA)h&?Q*cYg-vsg90)w5TUPm1<98T#$WMyD9xY(X!2~mJ-s}s zSD9M=Fd$3fI1PpyuQ4bEK$xNFow2gw;&)`IbQ6Bc;is>3{QtOv?)?STb#*D9(Fc-# zl5mEn2P~lzvytkovN`UB@X7p)>jY)@$`e_Nt)07S9^LJwyRj@XXydifon_9`W0GjbO#&VQ0t@0 zO0zd)I0bD2O(*)zw`s?n;kiaba%$|c+p`U$&L!Z*0Sq5hju%4hEuMe4)IfrF0>~)Y z39t82FSi>wh^^ksne{$TLN3FR^gYeq54gv&($ct}1sZSHLyT>IJ{bO3&mfT}(kRu@ z@LEHy&9!qFRKf@udKwAc!IxhFz^|2wNKVY>vHrBm01ydyQXc{V-tt5dn~+fNxTC1+ zkYaETU!%kt6%}RYxcJ8rWvA1|n4f?q&21e`8to&jfHNUj#OwAn0F5A~|J+v4%OSn0 z^BO(KP?!VJ+!2?JkYqcEaPNQyQ|>yLw3`fmx@hYSj%I*cV46MfS6i)=!z+kzrr z-S=`YpK7D+DGVupHYKH`gz6JfFnL04M&A*Y$n z2h*}LWNPsQiE%DRK8OBN7uE!I;TC= zK|1lSJcVS2H_jhuWe-W_FzH!jRK0#FtkONRB;O-i(j{+qK$uH?dGHqd>vxn{*WQ42 z$Ldym8dS1BifX7TX>9mk=YZ^LjW9Pr%r!`LY{yo)RVj-3z8zBo(3NJxHuzq!P$`hZ z?V3l0i1|VJ+h-@fg@rVQia*Q(AcM8m3$!%1e|?@j&fcKLE(*+7*9H8NlNKJ875|+X zMM__wWW-s8>|7x!p0h5g)q%kF^hxO*Yj3#V%h$W(82c!hcfsE<~rdjCj#2?$- zN3}$P5@$Yrc$qBLR4OdNb!cAQgsOcv0f_LyL^O!N!IJvrIsTcvP_cW+e*v?qy>W!4 zx6aL5!(qi@WEo%aoQnOul9Bmm0ItdBtIXtj%_KVmrGlQaVvHogGCy%-(R3vrCw!T< zh|k*onZHwI{AZu24}BDkBr&OWljjY!pdBrBmj#B6eQXtU=#K74rsiOKD47jEASLM& ze`1I$M0{B6cf<6I$KB?ObZ{esH-Y)kV0fig9RWiUpVT8spsL#Jy$^0t=~t zpsAq)=oG|fw7VgzcU8X}R+yY6S~rFFqAgA%Vt7IeUdx<`^ZSLsRPS+e`Dpf0f47@p zX#@_1;&B`tp(Gb|Gk)y_{F?i!poVu*sPp^jBVm*dYiw@Jg%tA?#(Q~^SB96H0RK`6 z0vr=<;rDCqG5WD!AtRS6oO&8u{kEs?%+f}3sDErtg~j(Idd-_;G$s9;3rtB>WTNP# z{?Ej(#7hmuF-f`LaOe-tXlb2Yr(<&ia%U{XJl!Pn0$dIu_otPA1XoO}~I9OCrI1pl}cJIOqLu!ghGD z9iEEpOD6YFP|VZAjfsawMW4~bYHi0R>akAVXqj|w5gN=&8?@==7mw)M2Fb9LF~&cW zWF#N^9qm8lojr;6Od|2_K*8htd5Z`Xk;5$p6c8G0bc=U7Vn5Lu`|J5c7cn#NGX07{ z7Lch3bS?>r(HwVE6tlBTPCLV?3C&$jQ=e$OUza_BQNvo#rA!%TU4_R}U4KD0Ihk@)S=v`JBMmNr2+81R8 zs8>LJbaj4e)t&+*6M%hh0g*#W%6&!h&fgwkOjcaACsKYKSROzNjBKN&k2Wb)v|04r8q z98XC;`$_f=vM^WkRV{-0U4|r3DFiBW&;@YgW~3;v#_foM>U7Dth)UH!B?XI=E5m#! z2`HXO0qmhzqnP+G(d>YL%NcfvZEtVS60G9X-@P6YXT?+XP{8PNR*o$CO`d4;L$BUi z#9`p6jF7*#UHaw8ib1c?B!EhUlNsU&b2XlOuad-ma=qe>WdbAmrAG9SQ)k-6oC*Z+ z4&eVg^#1=d?#xOH`Mes^9j=4sZ8o?sL}@xRN`LfyoIdCQ++NTkQJRLE15|KPH`e-? zvFI#Bs?lGm1>K%xq>)PHTd_S`^fAykEZ9-X!oi{Q{L>c@;qmlTocT`U7Y@iZknL4@ zjPEq4Giv+-Uwb^BPYMh|71>|w2&%K3vILgD!c8uQsSWyia}rcFXRY-sSmp9PbFzG^ zH&o#;D~*L|J@_lMNi_>MTW{Qh&MIg-f9HmxPYj*pN}g4;;5A|*K;&N|gAxEefk`E# zKFi1im8GJ~idkYP=ww>Ui0YL5Z?Mu9kD?41V;M#^a; zn*%~T@`z|+@S!O}&gk8bKuQ!0|L`4IjkF?K`xj!Ykfh|-pbY%%0DoD0f?O*eoolq( zXO==JU0MP|0qa(@lQ~cVZ-1$pEl{DK6-{7;l|&G0?>=>ZdS8JiUX%UK8HOV(oFjgn z_+3Wcw7Sn?k#Y8(H5dJ-v@tmoyt)#XfJCz@JPh1s8jXB1&X~j5Nzd@a$c;v0LHU?L z<8%AU93zE3?rX*^#~G7&FIr^eE-}d~H*Nw(#Xq}nW zT6u!$E-RVme+lNX5RW~FdvsDOF6BFDjh*{ZlL3>R_jJ@wJY-b9#$b44C zMem246WsW3-fh$yQ0ABSC$M-bH84%fnes!!Pr~(#Xd2oz@v6EUf>$~#R_DC?-}uBn zMH6>_M=}drVIyO$a+aS$X4KJ=}bdV=Si5YP8x%2Ie6H?GJn!Qs_p-QFXVB=SM|q z(u#8~vSwOjb)MtMC-#<+3q?L&)Tlkq$g1D;O*xogQn(MH9Vft}E}+Vv(|>8N-6|+n zf0<-lmMIjS6oO2A7@qv`LD6b(i9J_&WD@9g@E3BABjp%w56+zUVNzO}r>|m}9!3v*&@g zg{gxsjL8-KHvE=hva?i&2fwk4mrA=D_OvFHe+%M3iVWyCLd@Jdb&FzGy=o2X{_7c# z+u7-<;cvruFfYwsCOybgV&6hP1I$1=URcrG+UywWC){lI>`}O{a#J z)yzj`8;kxSmFIC)Q=xrlK;}4rn>*0K!^ie>VC-)4{YAQ>k$m{`TqGw-oks;(9BMOv znQ4KbpoX0IXB1(#WsOrbpCQALm(%NfEfE~4)*#ipJ0Y`1kC@bpC3s#)A-z&9%9Z;T zS@SvW!D;SwmpA*Xg>?j|im3e(57I3TImL#fou2t@xPe2<=c!hefcRe1fCA1pvghNs zHieHkqVa=07zp^CN!pbni-oK=X-C3}f}R3gX#QlIgZ(<10)vlBnYpwnkeQXT?({D& z<@tA84w1oThC*oDp;|Ov7B5hvd7+@VT4`~lZ(`Q7cDH^FGsj3B!p@=o#Pcc;qk#*s z`#1?*HQwE=P3YblJm%mQRn&}4H6aCED$bLRNE${_#vULm_^>jByLBGW#G)Km1MmQl>)V z9Mq?h#O9lGQwum)qpSk{As)3Q=8e(&qCRtugoCfriN3j(il<;*Rg%uderdiEr)5w& z#V}1{9acK9;vvswKK=7vjs>OEfv=0dVv&mXexNx0#AR6`|r1R1ARPe zE}oWA;PAE)OM{8oZFhRvKe6l7OFx00B$bY+JHc5Vi-%Ogn@xjMs7;rSRyp#=kYGGX zCxWbIE7AQJY>8;UVilItjLwYq%hO^4>-1)G`P!<;fy3eVa@$={{PJqBub{8kp;soM z!6*em;T7M@h0RXER`^c(`gMx^(DLpeqrD5zr~=DpTi#S*wW+IpV+S@{!wri%Yy<8SiF;(AY0#OKH12WD?LoM~ z&x9nutDPw6GQ{MTXJkfvDAYeG(SkU*S41Q!-(n8xCE1BYYx5H(li*KWEtMIJL0UQ3 z+}nWbK3e<{hH=rza)fsFzT!Il!s=vZR;!#6XTp3Cy(i1Mtt%Oo?!$-A9`&0&^0moR z>^(SNx9t~kYZL{K!dUF(-4@{RR><^*67KjZW~1GEJwQBoAHz2mZ9LvEIC%*0@fTV# z#RU;q7j%BRxxaXP!g*WmApEIQx8aB*Cgd`(m+cfj6g6V~45t%mX>R>(L_8s6ja*Pj?syBgh<^|gyd95>)2qQ=>7NKYt;;0G-X_0>CW4+O*;Q!qb&9MByp39q7b zyoYi5<2CT(DbO1EJc>|Bcnl4(c4hYgE#wI zC=KftNt^&wnLC#d_nwA5b;or>n98cc09hy`1cMEBEc`o%~-w4Ug%Hp8;3< zx)sY&1#0n-1Ryh0yb@+WA&4#VG_lff|K{6Q`tO*mC;-eJb8c91F=S{+1@`l2bwF6M zo&YF(;NajOxu;tbenN^YFGaYEib{98uwbBinyx|zvxuCXp4J~Wiu!MbZ&J@A~oYi(ly{dI=-?H;8zrR1NScz-Kw|efEEsKN8SION}&g7fv4( z)b`1`?uF`N^In&_x=_SX{t$dt~CP$rg$dTkXXR zdB)~KQ36j9fHPpZSfyMDszSCW@vLR;WLWeFN$JGr8^U@2e#!@iO)=kLP;aD`-bT_F zT>s;NKoi9ELn7em5qc=ueDpN1%V58`>&R|tZ45NIH3doBy=4-&Gq2vR=AQSRR*B4P zlqy=DVf5(8_#~a@;|N@Cs@8d`)x!$RSJOfrLJbT`xWn%#*vd5hU46LDt?ylRIAfN+ zx@bGf`1M>Xz&sPBR@nm8-CGV_%q%kUY4;NM56Rg*gXs*{uxs^5Jye;E$gy8B% zQw-NKvrAP3BqSJz2@W**Xb&5-WgMI?{;3uF%rUS0KG7v6Jwkns+k>ZNl~#>stqt1h zqwScv<6)Wki0gOO!8X6MfWB8F1H7Iu2EFy`vB{uZ&lO^Q3;ar+raWgzwojI*6|OrN zil6c7Zo5P}7oMWW$(A;1+ zd?zFH#ZkmMtgCKmBi)|wYO!{tjC{{0^ww1B_J+yX>!bvl<(mocU1|N+`vmP|`pkD@ zvVCHJI7{CT00?SmJya8ccTO@AG*;_(cT~*Q(`)oBQ{9kD}Hi-4a45aGj{GX>o&iCS9edKQv|5gMf)?`3O=eY7O1!zG=T7U zXP!&%YW@5@WR=1l0xyXjszgPb_g2ZvMpYU&7;--+j0XS>qw7t? znP+LV7>3iQW7+-C`8A?DUg>XM4`QW1`55R3fCy>ch?Y`kE$n~FFO%fa2s^_coCUTm zKk}r(o7|)4^~A03Pm}bGor>*aNCVHM=$t?u_sP&K7sLERTY*LN$0n5-UITAUuji5^ zAm4ed0zX2bfrgr*;R~;$esP} zpIeyu^6wG$Lgl)#S=xkOuCctx_@*NTveC~!NInZr>?OBrKTZi?+8iARxg22egY3ze zKOM|3_&)Z8ylm=FR$p!!GQY_O9IVCh4@L{ydii*kWpl8WnJ@t{wyt7 z*JLQE1dKwf8z%?atWvPTJI>R=Ix<*q<~hLSE6zvQUVlqHcU53wCisp8^b=PE1DWvo z?=71@m;<3ied}SC9!5nn*Gr9{yVt5y?D>{csetY`yyTbqFtE&5#&|yeMp)+32QbvX zuUwnw5MnLdZ|IV2>U~rCjwep|i^cv!RQxx(-|>(32AJaHpq&My&D42o?W*lx=)#|B zRP3Ewf^H_7ccvF3_qrZ4zHC=Oc!{K~o-j!D2#mZ(GV&+=(9JI$iqN7e1qA z^68Amy$fh}_wulSv7l^`ztt~o8K~uEUdViXV0_{@^O_w69brY5e*8@o?!Nq+1O-05 zW8zA~ZAn+~p8un_bdy7q%0<{f)zKg6jKi-5O_G%$5#?*cP*hEDyvKMQ-$2s0odE)!19f z8yxdgkK1}!zuOwc?`Uez6t0Axgd^;Tn>;GE!v1pK##@gKS1kKZ+9tIEqW~bUv=u#= zW85`HbZIeH@L)aawT!guvuz5(u}d2W-Hc6x@SE{p-`INa)k7Q=<3$oz2o*X4JUss> zDLHZ;C4P1!`SW%qeMdgHz#m@U$8NPOCu`X00V6&@QGV2}nXSB^E`zpb&7X>Sy4ILy z6iq=#k9YH*l?QAT`tdpXGM?9*mO@@A{U6&BU?o5XFe^g#0nCjy;;p~^dpBY2lt2g4 zNE_{)9xvzBaSi?BW>oh`oZeYsD5~1Vp!{gV8+l2iX%jo6JG`f`?F^N;U2k+wbzoW% zHB}kd^Qg7kZ!*|dm+<=hSE-&5U@kTAybZ zZUx$08$(TgA{-qK0YdJ6Z5Ibe=uDaR%R!36%(DAOX5TTQuT{Mk{=#VO#I#L1#Fp39 zx_)HiqVo?lZrDf9s+5$v9E+>D)J#r4o~ts0R{H+JDjGikk45-1a=j<~a{N{tQep*Y z1gsf6R@B}cnf+AbDoqs~?YQB6b`Mq4|086)^w$?M`Fz4lS-d-GGTZZAV57e2PWWoO z@_n+A*Qb)w^QiO>Gr|?>u_ufB=o#!VhNVkt11_h4`F4ne*!=>-_DYT3SBnp{W&gZ2 z9l~Nij}CC`P|ApUUcA}x*0p`itXfv2&~3vyDcEf1wJUAF4h>dWG+F+*^)=Dm?m9`D zOt06|zO>mb^yPBH5S7Z$cZy5IeSTbQE2Bz^%vZ7_+&8ll%8M3f4vpSRC~clXC#ju% z@B6)K;S_c2vKuSn$DtvYMsldbROGU;)4aBvmfMW#{p+?olRdgkH`7VLd+zBl_&h6( zL#zJj;L7x;C;KtcITEsEt83jIyvjmPSqR=)@% z-vmv(4P`DwU>JxNEwv0)e+1MLYOKf3F1*I8Hfjy1 zqiVKVR2!{{4iG#?%i%e;+_Q8|xUeMtfGsGF8TT84kv1x=o~uv?pZ68(BbXyJ$XSs^E20bK9r9J@bm?e z|MH6@IQZp%DS@WUzoj&7?B4&klqP7F`(L*7O$rO}9cm(z4MPOi|L!Oo_y12G_5bMy z1iHwtHmvw3#z{Wu2`st&b_xAnu%xnYC5cM%wLIw8AWJUCO2D(JmC2zpn8xwQ;CBN$9K%{W{HK?|L+eY_j#)eKaC}PkzKmI#RjKv_}Qr7N>XPq z#_+|sP27Z>5 zFPQ!HJ?kZRSq;P(qI7BnBqt{ajyG+k7;Y|ktRy3@IJckNEP0p;A2)7TRJ?{_u5==*%V=wxVrk00mo%@owv*N@&*wBP*% z=1LgfUG6b-Jl!4mrikcCU8||7RiE`y4!aC<&Ys@~JRX=ws z%zR@nXYCHh=lU?qaeB`R<2rpifz682#IVY8WyxbZcngumv#k;-QqO+VPvcYiutEC_ zN!Bq?&ha@GR=qZKs0#I?lM{Ddm%H~v6apODu4Z&Z0$JHUZR*t!SbwTImIwjwqbgT@i>s=LPyJz^`?G>fKJI$XTZyGvIRysP`B*$rat)s=xdWcgt z0pNvUan&+}(J_d#^BF=xmW0VB5m3zV^&DYC!*Y&lZ-ia9^@92gQDIvM+1B=`2Y#vw z!52Mzr@F2Bw#jnXFE2slCiv^)Rwo8+Z3&7J^*XKK=PYCX#x8&4T*-?OUd~(q=@~8A z{alp=r}XbwfNa>ndKA~&oh(=N;kt+81^bFR=yByM5w}lK(C(gJ(DMO?xVdR0=-5TW zyme**B^Sa_&K4|ucai#~v47I>+)fqnaHaz~^Dg?>NpE(#^a5Y(;~-&)U%FLFRrCEn z{Urm1?^gLw{+!H+e>*Wjj^O%0ig!{B2uiMl;d$tZbESYHLreSa<->3(nMIEq^LuyaZF1{o%4*$PR2kM%eMF=*EDGS8N(|2;8A8h*Wff;?tkT9gVdmUDklOXwY78f{N0p%S$QA&04eL6u2WN}Sla()|iTXb#}dnEr^OmrfMk z8!csOEX>DTZ#r0|dE<75{UKw|&{yyL%o^pWWcA0Y)p5yZU)B8q1-*lZu;%KYLMN>k zrOYP+DxG-MjGEWqcZgnpj-?fmiz>olJmGLX?nP$~*{w^UUe!|0KA4;U7%`Fw z*b2ktmL|_8Cni_oUFI;C5G*-jW_9_tNcoGWsN5l8y{#+koue!C31O@kvDV8PmaC^_ zKbyaYH<`bIrS{tA#e6_jc@cPb=Y7Dves%B8*-cF_Wtq=iER~?Qr#GP2_|$cy2Tx~A zGa{7h-!buQ`irwtaoWO_nwR0-bXi;f9#I!WoEN66>RoF` zD8kz(;UIka*3|C>b%al6#X(Ji59ejp#UuQ^=G%W>T~)(g6j9au&hf9(7WH{X;a{}V zM2GO}Z^g@wJ|LpTYAHnI!qKdckSQz5RuCd|AiU-aXHp`NDvbr|TYsxuaQvBMKQ@36 z!yg(uz#PaX3G}Ox_sf)xn>eaU4qP~P;41!2>;;tW<4|9xf z?-N+A*xnb;v4VTLcU3}Jy;Ql{+;o4sq|$@m9P|pQw4RO~zkEr!9+F6qXM{bNuPmw< zGEiI~-Vy12Qtp|Z(7eaLE-Q7{y2)PA>XI3~hx%v7)e?Cfc+rLfNn-1#pIlcelizl; zBw2q?5S{yq^!f25z){B?{aDA)kyOaK7=I8C;g`uX3qpS>;Bd88#+XX)z7OIj%pRk> z2uh>jYP(D*JHTcy{n+7QraE{hgQw&nuEX|2&12cihSH;Zi53?AkYd>kIGr3x=XK1o zdt&U$6|@cNSnolNOyK2t|1?6UO6{v`rSO1{A`$;-KDk(!8DOu2`w^KL)jiLXyN^CL zAvkfxYWQq#KO`ySN=eM+E@lOo?QD zK{#+zGcHl%GE!^%`>;AID;9!|oTU_mG@mG$K%OEr#VGe(%39CIzN{|gQBY3Cn9iLU z=U4+OW}<^4EQ9z0U2M0j<1zh)he&vsy#YO~2+K4y5YKSriFbg}hoa|9 z%S_nEmMDBHM-d$DNKc;t4H`G~Ttmxb+e@>Et(qRXHaQjd!*;gVJUy1437N1$XMWihuuh6Y3zq=xSeGoQ=tIH87x&t zY%sIsP<9u`K-j}oyD8`7roL57HYP+$NrOSBP?D}N86wM!vs5}zI1-(^lJ)>awtKi_l7r zfWlO`vL|rK>vl;_j>=(Q-r)$Lm+5?hiw?Y*n}J=7^7nKkl6_j6sSd&tO_Fkf+Q0!_ z>@{bAHX}(M!MO)!s=ql8?r{D*&28u-1G5b?*Mf*e-%HUoUX$J7O8<`>AH}{33bhFB z1LX*~0(d%`oew!anU{yRk(Zk)TZNxV|A=c^K}0<^&qt}Cu49TzN(mgwi|qLPB+}PE zz76(-to43F?Ix5Bo&KUIES)3{BmSG4HfhQ45lSA^8ErKXg*H!ExsqH-6%|WYX|9K? z>6z}u7AtZ0>E5aI3ud}{oXkE1rHR5AAS!ZJ1bB`4?IA&lQO}Jdvh4@38(oNtC=rcO zZjFfn3z;aPhGRfQ2Xo1R2RrmM#`q39cn_L`}m@vIKuvK}T| z|1g$(4H4-WP1#5kshU)k)O;5A#54)`$M9A)OU{neuqRxjYA zMc~Ts6TS5wU7J>JXUJ;M(?`w2>?@q z=2y{rTXfuK64iOuK~{gNTv&SPvIwlMlI_J2=XCP2GQ;@P7s;|IT)TItRnL;n#_L!` zFIHZ0-|gpbjXf#!*PBX#@6!4561*!++Bhbg*TQIM>j58S$gp%TmaLe`L(4;8Vh(nKi2Q<*N&eQJtQEtA>$Gv;SI^fEf z)`ta1R+)G1Q{g*oJ8joZj~LRJFuU25IAXer9nc!;iQEiJj(zZ+(YKku`DQbD(rR;9 z*NLHIG>~OvIsm$c#*zk2cUHqmEs3r5I40;o_`_9mgwR-1ejW%rgp^oKGe=P=z19k- z;&*phMMheJ|D-O>P&8_yCQb{A%lK!Efu*Wkuwbs4qm4MpJq)r|IY?zNJ z2_~sNsx7uYTVg>D8wLxJfnMymkrMS%+5tkQmWOBJMDp-1PX+8XNnNFz?F4hnVG9*W zIRMzh6f=98gqRZ@X@kx1SnH0|F&7KjHe4n^>Z`i-#;wT<=0jsw=&_)8SD$bB1`GC+ zQUipq#4?NORYhqZMa@QkT*Jwmo>;eD8ZvcaB`wdp(-xWJYC5pg3q2<@&3FoQeKZ`8 zku+}i$Pm(?C(P4be`zR9ibWNJQZ_j{NM;d{F;zI$gG(7M&E3zduqQhKHcHv!^WVD- z!;ymJc%@uSQ2kXe2|CdWS}t-G0@#IDJyjI7^nN2ReMu#oO18(M zqu@Qtx%rtB%hsv6OGJ3;_Jk~co#WR{<&k0Z*URicgVx8tb1}UW%vr3Y%-(i(hS!Ti#u1r^zVj1vED-m|~yVo*3 zyWevl#jg5Sv5w5NrB(u~oiQ=4DL0>)UeDm0L1Qg{&HV^Ctuzzk))#RUTJ(_?m%Q6$ z$jnSqd*8=-0=UO+x3ewHv0H2=oDd3wum?DuK{)3mY40m1mI4Lv;>?Tl~lP} z`vlFz(Av0?>Vw?Z1dEp>l0p!pBpv&LX6h;Zh_ z{CSxIwV}$sR=mO2Su}kOoJx_qU9<=!cKmCFKZRQ;rQamHX;2`1_fEtt>b1Fa&h$Q2 zPN6=mD+~cYidw|q=?nuujXfsYLp0m)D38$el-t?{!0RV^)n-;MpA=NR7`|FZ<%+vx zrL0RK$@C>+;ZjqeRa;BqdFU{{!nTaL49!xK*6CWJ$fj1Maru{6mM!NvX@SPcr61e= zMc@1=5RtdP2!u*lIl$^m>&0J3dTz29%$&Z8qhb5V3E5Q&cHJ0>I?Pr6xfGj~LeSP1x~Dz819gAr3=v7I{3JgtHxJ!8uC$|l&1v4XG4r*?M(?tbT%MzOK{bT;nEV?oCQWn^N0(cfBeh}bbqf?vpM22>y( zVHJmDqSct?k4VDFaQ-;WzmWabnU7YjAi5(Wpb_~Pw8)(z7Fxr%dmhTFvM-!Bz!B}l zRz*2S(AoCVqp6s}$E8ie@CuXv>j@a}=etWtr%9|T83yNW0l@T+SV^2 zEOb-mKAg-A6grq(VXQ)AE@Ein6?1ou`HPfj7r@z5iR$@5X@;@pcVR-jQb>XiGgUoU zU;BOt@qzP#&pk@r)NyTGPDbj~5j4<;J#$fat>LNLySNa8woZXb2?tl{$Af0CV`W;T zNw(%g+rv7ez@44gzHX5*T}XwS8Fk?Yo#@ZT>Wf}D7{)?hWc5N=+qcsfD3X>27HR)V zZ?t{2H}HA9)ej@i2`uoiNs@^v0)ja$X~|LIVm~{zgXMHO{RmGO)nCY7W(B#Mp}aDb zqm-AlF>=L>TKSUEriqY(BI6@;%o-y+FmJ57$t1VTTd$w$X}6dl$85sW)U(vc{cb68 z{2DcX{ga^LnX$v?n+HM$g}L9JRMg`|sG+l0*NVD~S2D3hbPhO6{kNC29Y?#@+lG?< z_|C3E(SI}id|mZ#vEK&z_r$<-f8!#?`<@W#kjgUX=engzR( zx=T??E>xNIIiI9xez7QvZN1(`6X{=61^ptUA9$>`*St?~G=6a^CF)HcjV^Roec>>2 ziuPjG^7X)SUENPFQ-??C@m-S75S36c8!?A|KU7$L`T|vV!6m0pe)ZQxIkNqu?`aeJ z<%>rRbE1v{nv_76mD2ap8*ynjA&K8LPE+xQofowHfLX-HYDt>9ztVOK-j?Vl0YRvY zvh}O);yOBZ@sGE#Z!D<1Yrdhygv&r|>V4k%zf(93lFkWjNDdTgxhZYyK!DM5B3@FAGb(3(aP zM(l-u8){|kQ*-^53w12sF7?aeG_s53Z?;nPPpKSUk;O^@m91O;t(MaBF|ChlO4(2A z9-f?ExbAWeSpPD}p1%#@$t8@5d$LMiW4U5Ai@O*UA?16*ydAO>^1E|uAyjlAeHrte zD6Gh1eXK6dOTaAMSb!lX?o#SI4`VoMIy4R9$pw)AgWh)3>q#dND=5cz!ZQ^XHJ@WE zW{K^jsZ?$A95X@nDhBu^nuP)#r7A3S&K*H4& zP6aR%OcB43V06X~jR>qIF3TOPWKa^%Eq(6~DmvzP#L|-oOi)s~NDr2DpE3%lw)>6z z4fQm(Qxrh20%74&F(r~bD!cROx&Xk;!wwriAgCt5n>Rk7BHlE$s*y@~WmhD8U|8zG zX%oq*kc>Q!pAy!Rwo;yde{>Y0>EG|<$OpLDgc``3^aGJG%sQl6`>1`Fv|hXbSEuU3V(8eO z1T(U3gv)?kq#P|GhPbuN#-<0Kr2U9XhtMGM-P_gJARELMEQ6B2^^UY$>_|S(mq%wG z5~L`9Qwl3hT9Dm;U|#fOWu|{?X*`qxHy%Mt8PQuOK+?fYp@+t15@ys0zQC8;n1%#ce@q2rEw$I;L zDnWg@f*WM#gv5f0&ZJ4%PkEKNkJ5b?F91e?h7IteFL|Bc14Mp^+~RP=&)bkq{K)p*!`_ zGn1vjUi$957A$xCAnlAW(LHK{+Sm(+0fZ5#sBvos7DE@s*}TEJ zJ;(Pw*0$`v)+vV^t?NM8<+oPeL;0`oeRz~_m9ssNZ4;i{PFPCpmS?|<6+fM60_BVb znv?ipqN<^gRE~;C0b#yhIJk(pJ_4RW=DF{du!!~>L;$^rOWSG|Wb&p|)=ka#r!d(_ z-GGRk)rARdO4V+b>sXcIHyBPc4?6}kT}s7+C^;y6;uA(@sRRAF%)8ru>?sJtDh-WIB~05W z8Cyo0_lIz${Y~Gj3fWsh^dOc$cP;x~jOv(R(qC1+6vIh?ch*k$QNb%993`BaG=lDn ziONG7`>naJBuYcl`F2g0DXvlIz+z6-G2xXQpistzu~uFEL=hh>|_CIZYzUMo?r{B&5qm>7A$Y88tEbU$Z8R_{J6GKYI*k2LVjdFWz>)PqYcc465mW8Dv}t1b6Z-? z0{&$=0dQQ^N`OgKnsJvt+8*XTgzZ=j>ut98o8$ZV*9Qj5<4t;Nl$-IJJ%(rdzx*eo zrsYy`BaE@oFFQjzETvKdsaT|fNIpEt|LX99ftJ)N!ZG2dWhos$QPBQ3G^NtmI?Bwo#n)&^y*>X$E(?E z0-|)6tO^n2N8!K*M4hdEkY}S>gs>HxEr=WfDb8AF(81|oz-t>83Lf|WQ8RU#=c2K% z;y~^Md_}kMm9+mnvbgcTZX{dN%o4t25hoVbVfB^VAWyQRo^ZnUDY+TzF0FZ;k1q0Z zsg73pju$+!QLaY}(1fZbY#a%)NllJ;-?7@SY*B#-e|ll!7Qdt3|EPX#HRQ7OZe83g zfq4XDP1L+fkK7{ga2nCiHD6NRltZWIdiP8i61}QR^@hHV`UM#-JQQav#TdQ%V74MR zCQC6IpJ(forHYRZ98k$q4j#mtSOf&nYY^RsH1a{ji{4}9eb_DKBfvg$bDuK{Pa*jV zPsECq;h>52BPNX}C*z_2{8GBXNa1HO_y!+KDM;49at@&5qn84!1fbm#GDh!a0=s&y z07n%1iu3+WCV!!C@)c+yny!inD`}gnAw;k1e6fJZEqIj5s#TW|)U` zW*WkWsy-oo*w8Ko=$aGo3yAw&i) z?;@Q*9U=3Pp;TKYTV~>z7hRZ3T-g(V$CKF-R1j1Up&eFt0L`o{6#>!=NWNX7N#U3w z4(#eu%C^}_NJcjg9Edc1;q1v<`FqBBqYrD4!)Wc+cg%9f(r zqL$gw(8av#MU_`K(oz0b8O%vLlY`3jIfr6GL!Lq_>5d%0%-`rIIhGpNX@Jp(C7Uw) zO|fcRI*9SFChH~?hJ}IqHR}6A)5hXbGrw8Vc3sd3cH1V50UE2l%~LD8zdO&d!=^{y zxGapQpS|sNqS`a7THRVx(L+Ixi1%(}9BEuTbCF}ZGOC`UyCO*RpMomaw>cOPK_WE= zmAD2pAU_&D#&8d!q8SY9+^|A(IEO#XL4rn20aNLp*GdnL!oe2icJ437sR7#jL_=htGf47>Qhy;5JyHl z9S0`sOCVO&IsdW%QbUx=Z3D~S$t%d?Zss@{!yXHVi}JAJ5|f`3{|K2JwI%k!g!pT+ zDS#BQrCz({(A1)#SQqrOC771vJeogt80s_?F);=s$&&?$ z0KfMNfqIbVAUg1=)rLq!Yb6{enIi0^0b^mOI^Rf$`9>P{AHAY1!l*n{C7ARsQ|?gy zRy%|awJXjlCiZ836FK+k%VxN$Ab(J=;3-=Y(Qc$L3nAx&I8^ov=1LX{(Y_&-FyN7z zdD%sVA+eJ|S&TH7kn2Bnz)Kzw?bU-cO;qe?BoJZvH%LUSoa|Rz^HMja%TJzGEh@_5 z0WYuc{>MGzBHXk5Z&Cxo|MA_3S+W2B=Krfqh}y>6s~y;cvFY11rE#=t0^hv(R%rJh z|92S?O>$AJ-B@qn8z#=p$6qB_!pAer7sa&>b>5*ywE-~>O&L5sie?oz+Nj?M5xsWv z!{i9C_xe#%v=0FA50Qc4q{C*x%s2R0!Ls;pm%;FJGo*c*@T54E4bfcxZxRsaW);@J zKWJRR2vrng_Q?6b5FYCY390(ihK6N51!;6>OfWb!ZY-(W|0ZRLpoc+L+lajV+8K1+ zT&VRES2ylnHOA<#ri{e%VE^vL&xh2b5=(fzT^YG9zMUgUV661_VaQ#QEt}W%a{|xq zxQhDjuA%YNN9Bj|#FDM^0OqYWu3)Tev)?wMX{}$h%06egkBCA&5c|RYH`lxQ9;<2J zSzu?IE6OcuuqfXiXKK~(DH#%Y!#6mx*lg9hLYZ4=c|wTm*dC|b5A_&NqpC43plUPL zZrSH?^j7iDW~g>PsV7n>9ACVGQ2BpYVXZ#g1G_xi^1DnEWBpi~A0jLHFu+URlMHwL zrH2?!ZGMB|m3SAyl3}@{Y{4256*M%4 zdTwfnMZm&7H+D^z-~TKwO&(3$Bfw2kYlN(?VB?K-i@pe#-wf_sh^EXL+*TdsU$VnP;o0e2>oehvK8qLu0YulzYLY&86b^irV>RA;zqiP085oMiSo|I?V|X`kPEA+Pci7e?D? zTM#YOT8Nvj=F7z-d+d~?;jc7Yt=hBsw_ST`iNGT5VVwhvXd}ctI(jTsg$v4@5{d>w%3@tuUM~{b@%Y+L5;bBYFkizRh zRhi<}Ez$SM!oVBeXL&Gf;c`UCU!7$ehX8#{4@X*Woen$1FS4*$-ksR$&nw9@-0KeG z**B=GJej5OCBh43_qP)FwrjOgsw-h9vNrI6*$(K|Dktws#btO?y(S?mEviTi+{uR< zu=85Yx0{r`w7zYK)BYt3#s>F+Z(O6CS*DA? z)Bu6(%GQ2AF1KGnfg<_kL%xxpUL92xn766zyd&w*864bd7vZ_IWvKl4G)v_2(8zqd z-u!v{gY^ZtlxX>ZgQ+1$lcCN!m&{T8_s*aDyGSfvHvYjuQQg5DN}Zv&u+nhJ8Ajf1 z=+@C%oqP57Qg5BMbk-4t!cOS3fc8I_nk=pIfM7@A5wr_7@jc-k@kj#83>G^CXjNuH z>T=;c?Gh8;|LZ8mtXa!IqN1+8HtU}bIkkdDlwLY2e<}jA$26$$>dWry{lb44G5qFe%po8>xqgNVEiV)m04SOiWPW)@QF6_0;cUIg3WhGX*o1Oeejrnd8${xvp6@6O zop1$!%SYw?(~Wae_%Q?qq_^J@kTtMNKBT08$4gR?6;|56bXWuFu1pkY(%rOL<#W7- zJ#R0mXXx->XSrXkZc;-b-s6e;A(D@1Jd!?fDhR|Ic1^WyZOF0*0*$iCvBb)`LvFli zB7sQ~4c9;bjo$c%ZQb=Hk2xlZfS$MS4D>B?3b03lPwW#gR+NTV^6f(Bm{fC(SZt0= zn8^Pck#qT1Dl14PM#$}lJ89dBo3Oe@t3P(mIwTdooYx+Pc!j*428}1fo!kC&Le6`n zo#)M`>qYzTV-Qo~qZSGm9?;kazE)HA+wq^Osuk}KtZL8LC1?JoVvrs?uNI?wJ#{#$ zU3CLn;#PjBj0sYzP08XQZIR~}m9osLJ3r_$8kD{e>}#rBa^AF+Z0d{scP@9rL3x;Lio;~bSA z8EaC%-mi&Xw0^3D$1T+V>~*ne&$)8AbxUPixCAU#rRiM=ay^DH-Pguz$eK zuo}-tUl|?4W|=4Nw8<02+N-enT91*#7d=+JUL|DIXa8D4cbFukuooUHKd$7y)cgFcm>?MQra3yzj-Qn+4%PT7rSX80`IKDFiEHn0~hEwdspb@dKO z=eKkWHh*jcG>c;PX8QQKcQ4ZWR7@VTyj|yDD&=CeVDr0P;G2UiT^n()x01!T7sb%0 z$LQJzKTy}e`_Y6cnWbKp45txaIQyNPVEo;m1vTVU=|?5xrHrNi#_vx3T4o2c1A z$H+Rj@XEk@1WJv~=NbkXq%GXUa+TVvez8j)?;6c<(Rh1vasf@ZiP`RG3ftmrAvd8k zLP#tc9{k;4#391pN9Wubci^7wTc(y0;nT|&)}322yrwsbtt?I3=?q0ZeQCS z-8nM0YLziyq4~oSM?3pzfZGv|Ir3}>mgFDy?mouRL3W=v8e{awHZR|Oa&*#~dW!X3 zR&wtv*&d)m)+ej-#Q{0x*0s6U`WERkJBmzK3f(&mY08l?x={MklYsVQNKLe$))dg& z3Gc|78J1M);~yN8`&1k6fv~b{Eyhc%?3v1|g&TI3iOKATa@SMg%IOmCLq;t*|0$t2 z=BC;{HP&E5pD88LbvP~SCa*r$X%-WCtnyLo?~?Rmd^VRh)B1r+;hVMPD2k?#X=%Wa zlY(_;@A+~7bSDMAKKIMk%4k+bq=w!LLiW=y*}MWb#q0_alnPNJtVEY>eYzu&XP=z|5G zlD5IkVDN}Umn$t_i{P?@4))_Vb-Tew+zE_-Q2_!O23`JfO7^rZC_c-$^T+@Yt#}W> z&zblAj(NUKa?DOEn0Pb&_;bWxj(7gq;qoE7+yPPnj0jD-wiz>Y0IbAl*8C8qi6sA!LunKg$vVh$XC9cLyk!A$d$3#{^V zI4FpTexj0!3JpPlu<$S1j8U|KsO9haQjIm@$O24laY+MXrRZn`ouNdLa^A;(ny8%v z+KT>bH-D32p`SoZ~Db1-7s5jaQw`Fz>>gEn3d8CZ7srEpHy&Q-A8?G+zZr~ zZ~jYhNCNYuzHZ9txTo)I{E^v*t6Qbz?J|^w{6|YX;V+qfkcaR)TtUR&14RD&Uw{H! z*ad*-<=vf_HuHJRmCXOO$e1kBFctNZ>aOD^xsx`X+eXJ{PLF?@_pgKA8;V4kS65ee zu@yR|v|oM)5!o!)@o@$h|A)pOB1SHC9iRe@f7nhm4SFk=5V(3v9N^A$drqafV24kItn7PV^!383T#z_FF}3jw*sEBxQMZxpJA0LH`RokWVJE-O5<&N3bUL=BxPc@37RI=iccy+frLKxRBqq;pMEk5u zU6}n!=xXU&2^^Zv*m&{sKoTSGV{bnHfP`tu;^Bt6cOvGqXTxa?50P_~f1le`X^V4r zR}59D&r)Ga>u{KP{x%^y-Q@k1$B~^*Wv?1zaEF-*BC|sfIsZ}1eeTlJ=37g^~mit36;5wQf}gd2SY zxJ%cT3(I7bOSMbwzayN@%%acqIN=K~E#<)axUnNQ&mZ6=VPY>MKHa zcX~$|R3gW?GR;R{U6sns7Nm}&ohstLVJ6fTr}HRKWIC^}97z(1_r$JFROt`G z(SpWqMUS(m~) zjCQ7ue*;RCXYDyt1j*NFEgjNx{x61#M?Dgkdlz3sJ0=Xtd8+q*^yHCH+HmkP5PYj; zH8Z2a>UWcnpu=siAn1sbiQcB|zHDc^!MeWEldYF~9WPm*ao?{VYjxvp@~#-nKDP7c z!OFWHzM7PGl6nf2cC{+u=IT_3Ja#H@RV|I`Mj)KQJuMG1mf z?QkDZN|jsWRB9g1m9ox-MSlw3clwo#VAx&>Ay+<)4BaZ+A36U_w~60MegC&%{SSpZ z3F|*+wI++2DCnvR+v~pKx_C{M)JPaC)LH#HinZQg_p~}4@6`4b(Xth?wq1OGSviE+o!l6lAYwQtQP8{g%3#NA7Jp-vd@&~I2%Tko>4`1*Df7gqK{-nPh zW~0)ZN$&LNsZ!<*$yTy}8;=`{B{-FmLUDtdC7Mg}$c=<$h@4!1=r!IFDqE+e zx8;8)t!s?O@VZi&NUZy+xz%er@Ip&Ix@OZaZxgU=e@d0CK9o|u=v}|KaLHpQb#u0l zKbl!L*%dK)Z=CU&>+U$Z@UTY=9)fKd zcyuts&1%OH8$uyv=kL|@mrRUcx=K>+p9wnuJ=|OMt3T*M)&oPrGTseJ6|8-h8(URnyI=gb0daw~fJ-hZl}%p$R$c>OCKn zcVgu*4uXa(%y_5W#iZ(5oRQ`FkBVIaD|^gJS3D|OV>>dpLtjAU+n?%>0Vf&ys7d#2 zdmG9$bxA@;LU>NzJY~bjcfHseNl(jGuI^NK7~ziK7{pXC(X+ zp~AGPe42``_hfxlfEN=J@99RKLA{yknY&!U%)wjN=xJdFyl};j(iiOg9`E9+&J;N@ z@fi44sP@OORj(%HvyRZ5Q>(w-`>dLp!^-?I@G~rkrP{3qyjoSq$269cB_)LxsL_H` zb_RR2sOZPaTiU9EB!%voW}!Z@DZ6ue_#XVfbozVy0?FeKy@FiWMLw!Oy1GY8f35>F z9wM15^h*Xe+LVK6W3it=h)(TTt0v*b)K-uvb+R#clSb=1h1B^ztKT|er}Rw6@xRpE7=tT8L+00?X7V1={T`puKBg@04aaYTKh)yR_4(l-mQ9WU-=PV8o!3*LvjJn z!3eQpavt_b=R-*b|6_dLx6C?hQa_bln)&)9mZm3*2g*hV6uQPEnqA*aHHrd3N2Z7J zau<#sJv#S74fw5_`dR)*m@Fn0T0^zeKx@3Zjr03AVS=Kt_)m-;O+EqD85f7P018t^ z=9Vo|LsH!=2c;K|{TV4A+k9U!qIu0Mh>+mj0+=QZLCQn!$E`>q`Txt?(r}50WGpSW zCK>-~P=S`DbF6&iMS`>aH;~|MJWuh+v6k~9?#-JwEjudq_x89Px1KYo7QG51k4?Py z@F67+PYmajQ*x{8^=Xgi%3v1W=6Go>!=md!ulQ(z0lJ5WN2$SSx3Fs|I*f{YLPEmZ zI4-$M*S&?d0DN{oO6eGscgbRb<0V@~MQoa$mmePz@qL#`D?E+P&ZZ9w3p1~Y3<)7I z?R5MEgKQn#Z(7V|HuUyVEv;WJPm@1u7)NyWV6|Vp!rs?(FtfM7Kx$%QV&J&2u<#xR z1_eKVe8tE0K6o_?-$7TG^zq}z#%%biCFYWW`0QmKmpm=O#CKCG?ouL=#j(zR-929JByCf_uVGjv;-j&-f+FJBf3m1i=dxf*ccDWsm z8g<5U2A`ZbahQ+PmD$WAZw95Ut?dD^K%7RU!(%+WmN;&^ldJRX!EIuGmmhM;Vm7l4 zx4YxG8$({a{_f{T%E}sUx7>Zh`s~0YSH1lGmaWIt>9X7Lq@#L`TQr3ff?4nHg9mp| zQPO1Mbz4JT#PNLeYi*Sf3nuDH^t{UO5TvI54)YlmHPzXdB9((kjEQMK*_}sD zTO^}~?%Ba=wnn9*yXW!NB)wWmfJ&j^<7dx&HS?H;k0zu<0@WYIO?*bZ`#m6F!H3wR zZgP@PRPN+#Jx`_5fx)Wglu|`SC4i9kiKnM03Vc-Keve?!zhAF+4-OWB1+TPM{{7-R zp0Go)-|>FR5fu@O-22!Bb`wxWTod9Q3-uETz+}%IytHe^xAZq^Q!- z(YbZ!PG;AgFmmL#9BofyzPda+biUYaDYsw6g4IM$NqI9QI{MzLN{7vnA`@(0$1U=g zFGGiN)cP|Ovff7srS;Fw&&w|)D!OLnK7H~;ESyprIeC11ajZt&?_dSXBnsppl3^yA z{{F>+3&h0k4CiW~&TNbp+OG{rV$7kyaww*4yt+KkP{?{RJ3IT;$H(q;&j6p(GJ8q^ z1uj}8#%mH90I*z5NlE#ys^H`2_YDpfm&4K3)jip1#LW1Rfdwm-1j<-8nE+EJ7StIRa8=I3OkW7ah+hBvypNeXtp{{HBgd^;%GtCxGL zX^DNg8oX-*8Lt%;5ohHA0S_`iWW3iWFgR7zU}Izq%Fk!cs{91cKfk$|bET2bf0ZZ# zuxM=yIMCGGtWu2#33(OEVG%;^%WgLGFHM$M)BRAPuCHUE_WCmKOhpB;dwkq7J)KxO z?GXzlR$$yqYS(@7=dg9X4sXGk| z@vHLG%e_X;6(f5y73iS$#bEi<7EN@&V#@(cMn^*+4IeRTF2F=>8;s zz$H(!`i-V0kxO;L$Mqo$pFR}7DfY-d3kvaY?qkyf7{qF_c&d|gGyXoUCmbh(~!BE zs#WWO{N{xPeH_sjfS9c&cnL!Ut-||SLH*W8B^KjiwH}u%la-v$o;`a&!13Tydj#G7 zUji#;mjmOP)1_G3h(e(+cRCaJW07_I^l7U7f&7{(F|8IJ&_3`%c2@egmDfO2# z{PX9J=^X)a%ZV}}d;0?m#$E;+8ykT2i9d(;8aC~)D1%jR4-%qH{sdCDPj1M*z)^~sZWXJ6( zjz}G|C4zi%^*&>^lhae1gB7`gf&w&5Oe$X9SRla>bwss_LwmvXdwF@^@89c;+4_=1 z(M^Z4?zVb&=Jmvcx=b9G zkk3QH0ZH;0b~D2Wj-jbt1?x#7BBCP8$%@t$DK!Jurw^L9uIIXQ<_sBa?E|LUo_XD$ zqM7jRO^G?4aJmgBg#dp3_?OeA|fLHGUTcB zRVV>2fO!g>_YKJMFqGHpHXwRMn~i{ za|6j$^c~qMh2MawdsC$FVi)7N?I^oq*c*q3BY*xRNlHpWvW8!h^+M}o#cbuzwY7pU z8BZVFnex1Lhe7!g9E@3ebw)=e6F1XFm3T{gp*7TgeMp+$nw5p+DVH@#UiA?^Pkio# z0R{$!!9coPS!Jc&<{10c$vh?t3(J6Zh#+rgUhUPJls6G*_wLOuCwivBy*N2Jg+xWQ z?#{P3pRK0dkP1tMdcamew6(X-#ah+WPflvYPpwZnPE!D+U!EV6NrrXJxWbI4zKs@! z+b?(6#J5}O{H50t^dV0(UOJW|G%890P{QrP(YNbEIsWu?+}zPHr=Y7o zx9RIP`{AlryF|cJL#&npc(Bd?4Q!m8j2{^IAaK6HO60a9ba8P36gfBYM-M5)%54om z*ohXK4*Ch^TaDGY^RgOt{!}eCMG6{tvY4aIartC144-pBcJ>IJ#&5r<{dna6r6qd2 z0h&pdPYY_CH#HrN2+{ zQy81{BR5^(%+ab%@F8;f4(vrB8TORV2~=3X3vzN1er5C?#=U-7LGHLvk+lAo&U^YO zZfFlNFO&Rrs z*W6AQBaw0o*asCcIyu^IGBoLOs7=H~5E2~Pr_6^`6`R(VR&r*qE zkJ>p5+Hqpfr>D#XVIr7zJ4H*5`ZuFqP*YHNKVvnto~gS5YXqkDVITn~CA>H@qkVNg zece}Lp>}n-?YX~_9IUufF)Lt3R!T)q{*{Q|CB0P0($W%)Ld%+t#_Xu*8x}H2k3fu{ zCjF_mZrw`%%zpi|yStlF?pdPq(z9Y3(J*qCgOy*Dt9eR!M4*}I)yv*lyrJeYdn@^) zI2&ZTh?v-36Si!69*CGuTBf3874!RVBqe7DGUQGF-Ex}we0OCaBV3^eF&Fb{Pob%k z^YnRF0V>6`CxFB<6bO`QR!b0lhlsd%cwC%%>Yk{$`2L7qaK`$Lj%KE7VWqxHtsUW^ ze4W?DM#0tdbhNa7K(U!!5}^M+iDQC6Ip)UMTz1-HjH(7iis#;;?4D_PH?(QxCfpYcI;$rh?q0wM1 zx{)beTL8H?X3XA%Dz3Vv$LZcaXJuJgzV)oI!}e4crr^aZz<)Ba0PUH&&lHx)bY?1r z1qIf2c67GA)FWRPji1DN!Hn9#3w<72^YePRT!ayMq=q$Zj^HyY3pZZ19cvjHQWntL z?aT;e4f|ja7_!R=n~cN=rTq-sy7n6XIcPd~yg{f1V(E8Eib~f7>JD<8qtP}ax)5P; zY6fz>thWsG^_g`VZUMtJNikK6Twh&A^Exsv_axq>Z>byB@&r7xK&sw*n3zVrNuo}! zuKQzVc?!zhA|$mSq7`8%n%8s|Q=}qy_V)|V<9WHs+5pP4uVf@7egeju*6kb~8tlx} zKOo|Z0zCir;F&N$h{;qHcW!R(!s24abWZElDtrdr95z?rb3k1{npXZuTkdb`>shZ`f zZBn9KVNVmuqy-l>G&ZV~T55#e(?qZ6XALu-u89Y%gASeK+qe2{VH5}3)5Q6F=5fqA zUOXr*|LNTg`bfjlV1|#LgUn!IVF4%la}^)0Qf?>G^8wtpb#^vsGw;CP!hihu?eVvl zp5ylE$qBP|9SVY8MHsXp^!PxfgoTH{hPivA&gjZIJu>zU+ywi!gHDj)C=CWNF|nq{ zsR3Ywn588n*Z_Xlqn#l&s|<@1DD5~d8?PTfa1LEz%od@*I3hQP2sDD&yk9BOXlDY|KU~i3JdtoA0r6 ztU*G|ZA;GYa*%&^7cna8a=g{`{V^FdTD6ZhM&0(>s1zsj?pMM9SMB~KcrM@;HC64( z3gbcKy7BTRD(a1nw!Tzp0!^pc+nR2>q7aibffULB%+oHn=(*l%4J8}&F~>FNjCu(T z%D!ZAOih^F{SN)+U+-9^ zy;XZ2@JEdRC#${5cL898lY5zUo6vq9oYykDwnTze0+nF^V)9^XG8ViGfLteCUe)`g z0-@f^?UjiFcDvq9fxqbIuza(xEc;V2&X2c^Knrxnu=__vJp}{Vay;$XQ{#Tl<$hMA zfZ+x+@jER|NkXNm3Co+>PuRi1A)|s~()XF9$HlHVRMTJZGv77yz{|v9S_FuZjgF2s zBPdu|<#SS|9|A{~RaA^w)Ru7iOY7YEawEA{In$@4WJqbElk+x>pI5JO(K+*f2+x4| z>A&^EW+E%NDo4?uToM`7fPPJ{PWKBB5C0;TT;JT>ymX#2dhN~4Q&Uh_2!gpecU*JS zeA82W8Icq1Z+ZMOK`R%y<&R#=!#dlR602ze;A4@uZy)$2<=Za4fvCm^QkMsHz!x@- zjz%z;Yqn3AG&>tH1=Y9qzH{selS|TmoPIAEmVIYw!m>G@T-*7TK^}eSISP|x9YfdE z;Hv%NmchHeLtIB2`t+pZ#NRS7hn|xt}UPoThZLJGdW+9C&YvXC!Eb5VG>J)H;uG`*>d#tG)&F#$oxwC8motO5uM zN$BYV4i4;bM1R4OgiPl#F79n*TJ5Q+sf)|wX==ZuqoYhT(hy!>KbHyyt~{9WsZCNe zPRX#ZiHXDnoR%MmU)7$iWo=AWMut<#CQ;wNapT5w9{cYA@;Cnd6hegnr3)ZtaPbG* zp%>ZlWTOmhBk+4?jS`ha4Vg;jmxMjnoPk^oH47Qjf%H%X-F$dTWsERd%*U-AFKB2a zH)GA1pPrm=*ZObPC@QO};)7IOWPB~kke1z@z@OzXTQzP#?gR49l%&+4x6gJk%ztF#G{?HmTdUZ%sMy0Q_?7@pfBe$#_d;EarZ(>`;^C?8uGVA zS|dr^?hMV)qpisfV$X{kIQ%8s_PGar32Kgh5TikmgAzb2n82t}F|)kfa(1}x3{sC9 zB3{Vj^uY1!8yY4Jnx4*l!Q9#1{UsSrS#`13fvfnWS4>j~5~$8xjmkH1PYPud1^9NG zuot)fD#~?apm}#74HM}0W++PKr0r7UUaxpwN7cy!FN(z#B-M&dB1AnNu7kBo>R%m* z+g>C*axaBsc(=r$pDump58;z1f8l=X0rafSD=c!ZHRrasdmt!95>+gx)e=bQ=JD~^ zvNEm%7k)@>Ape0S*aB&e7`S1-q@7WtMDC4QdHf_X%};Imq-<3s6b}?L7}u(@X`|XmHMuj9x$<`}Nzm zC*^?w!NEoVs-i<0*4(hMDcqueTtcxb(XmEWVHqDa@l;eLhm!1dTNORfUu*_1Th4P5RSJU_m7?;cY60b8aUw1d9`=73r%l^DHWVY}!TQ$ zBvFF{&Ik00ZBeiBYH^rVUp-xCqJHt>^UjWS)-V`*xb06a51X2rkXL~ROWVRM`}klT zQUqebZpan<;?%^0p8shtPaa;+L0};G4k{hDDY>{tOuz1K?m$Y+3KodHLl4#&(u0N? zJcGmtj83zb=OvPUT3cJSL2VecAL|99EpSG^r8Mk}s)s@^hw3sL%GQC@2AJfcm>fqzWPxSTV%sCtOsKtaN=MFH2^&Hu%KX&UTw zKEGbrmF{}vbb0m>hEQ>X1Fz)cx}r=xkHMj8{o&?R zbu28gT_Bl9V1uEUMyi}y!A{SBZ^#Dc3e)yv`~&v$=baGiqjWTz!2}@L4{#R?QgdiL z_+jXtp0?GVZ}Bo})pR0<>!seeuA@t@mLo{dA#$c-Ux3P_M=CiVq*zFVZu`(CHh#2MF$`q%sU2vv2YkU4C*r;`}9dUhu+>^H&~6( zBm&Lf01r1(YNZvb(|csgpO%(3-o>gBRUOv{CFQo?#hI;E8g!S)>6M0JJ-(dI(Vp%9GqUY=sU5;iBS9}QkdAz&Q7f5 z{2*we=87Zk3048Y%i^W*cY`o)?&f(f1w7?!zYsy04 z3&K7XZ1uy)kAPjs&{;$sCR7_Nk*UCu7xdCvA#6l05T5v;7q7oDL(#>y7zt6dMQB3K zjEq}A?+;!g6$<+X}&sIh5c%SUNHY1?c>}gMA*Ww zT0&64Cu>=G64KI(pkm?#Jrf{LfUXA}aEknFG#)w@`(7+W90P98(_|AVK?MNsrn3iu zfOa|B$SApXadzf@%QXNkfWsC$J3BIF=6_2TW!36E25pP#>N2Z^Mm>8A;j)=R{$ zCc2fWj0?veL`WMek(bUqc%*t z>j@&Xt-HI%qWX1(<92R|9jEcXPv9K?6`9D_v3&Xsc?d zdFwwda5|O6Dr$*LQ8^5W|1%zOadD)Lg@lWubv{O4C!+X{OGI-q8qz)e6%AFE(X zA-?E*zF9h2>Byv3YH0v70sSi$hm8>|OsO8(*jU*xayNH(aAQT>qS_{|=(ydSnp~5@ z9-0we>r5F9$+yt2j=WP+Q^TU7j3d5wfF@ZZ)gp@L`G`yfk$niHWP>IECKD4Aj;PLT zgSYue{%5L0w=m#dJCH7%WT%b9rO9gWcp`P+# z+;?B!Kdvc(!NH}Ogj!Wje?~5rnipLdr5KmzK&!<9;^;Cz9nkiKh^;dG*$>WT7nKT8 zu(c8J3A3xKlF*XOF^vvtM-Br>fiC!08l>BH?X>{(;6C(U^4K12r~o()65R$Eh~sxf zfE>x#_jz)`uwjq~ZDhsGCcmT)%9eq9d;9yzV3kd=6->C#G(a2&Knx4LzYDl~Q`Q#f zk*O4$;)3WD zB16b_p)%R`RcsXVG^NeWvty>+HphzBM9^<@w;yg$N7_juvrQO3BspPWW4{Iw0sQvo zJbrIM{di|*2AL^gz4!!r7k9N+J1b5pS6v5E4bd^P%?KpiJ|+`OcjPai508${7#gxz z%x8RyFi^}@mjs&((gfMLh1^aaJbk88UJwLAFhC-C!{Ef5Kx(LN6hLpZ4&0}tghZV_ z%kH>Ut;*!$q_jqbJrZqA<=;S88yc$e@=IfSbV?Nr&>dWc*2oK5+BX(sU>?Blr_ZA^ zs+awIsKZ1f?%cAu_^YS8d#Ua-s;J9vZr;bOR%?AJ=*adXIK??{Jk1$++O?*7ZD+J) z5OqL4K#rJ50|p@Dqlt_=1`x2qjq`7l9Am;WVW8* zdF7k{Ss&n9lEB^kh{lS12qgQeob8Zd&#PA`c#P`WP(Ko3U%|#8Ar(?oWJC)&&OUf2 zyh=h)R38#ks&*RCsr?$}g9W#&YbWnv;IknOKGMe4)xAPmcW}=p?6Rgd=8JDiQvj-; z^Ew20T%P?JRJFVUO6&nWffVbq{D(NuczA%%mj1!O@rUDtCeazPm2j~qRryRLKD1R_ zQ^LW41KK=mpOvEOwO`5M_}pzU%d7qi>%(NUfCBt3q>8-e+x9=!N97Vs#G&N~Uafg} zSZT5b;N>5(gS|1T$EjiLY@3T`-Y$oeB7BEwluq`_6+n!`Q(TQZ+k!!mimGMlCq{Ui z2s9#m@7n7d7|d>Md5GWH{vmo*L%WGu?p59=)uGL-%@W-naoHm`WuxZ2;A z`vHZIEf&1Fc(^;l2!8#hs!CSxS&UY{L66yu9CaT1l~+)?l2TH70F->!7yA$QGa{*$ zUFzKx<;dP`Mx@ar?;*KtS~|J+hv^4R=RMEqdj{^-8VP(aa6^rzkl%LBFCb7OOley- z{2l+)0_*wn>=MaosrT>Sk3iTgCx>i-?1MJyha~2Hhd({qaRE>cZ02wmr}8St{_l-A z$A-!Aupi}}F6_u@u29;4HEn_$eOyV--Gja)!4!peAp^aTie%@-#>PfEbB@#V2($&^ zKU;%*{~T3Cmo6QC>{nR_9e6p{ZzE;A0EjW(0>;A8PH3-j+poOyrf1^e8KY&LyA(c9 zeeCyP^dV$fpiWo2h<=%PEJnJHJ&v#G%!cMUGx1tyv}Vi zcMEv@<_z2nfGL3rLaKU-Og!ivH1mq5D>d_$fhgDZ>fV0=I(-UjBn2WLhsxg+l$5q7 zJ34c7b2|qIMQfUf$jFwqaH>JM*xUO_alDQ}5D_4iKYT5SDS*?^hzL<*V`>mh(C|qa zN#KP<88S6wok9Lw=Cn%+H;+u_fXe4!8^qiez`pNuL610q8|-J#B>$^#saQ=7CO!}} z8nXSc-4D!sb#-o~tEUH__lGtM%!rs67C!zP*c-uaI`Hn;O0wOI4WIkt8V>a1p*^V0 z{B)$+wUp;eVDj`I`W8K*+oi`Kp@4Z*HiQ5Ddk4*uLA{|N8@O(OZv)_#l!{7R8iDXM zhrJZxv9VIHX=lsVSD7{pZ9!%Q0`f(Whwvk82r{6_-HeLKSLbyb9U6WR_gimGaDNn; zhbvBx#;r0`i)kT~r&rGZ1RfeW!pJ-V;87Af>8d#hX!3y}k^wIWtg8>HdDYRF*@}I| z`#i`0Zsq0l8tLmRGgv`qEL*)COG`@&b~LDzm_GyXEqwM4DT9B|$fv6mQX<1h=m{cQ zHvpjFuvrIm?`z{;&k3czBE`6G+oyvteXs8K!om&Va9Dg)C$q z2mu)qfVlQqWXBJ5gKabb_^4J^R><880B+!pWg@;WG zYzpA4udhcgCy;O29I+;o73}}hw>>-w`u_bV?Cdz+K*=e1Buyvt=D*r(bzus-Ae4|v z3?M^)p^+?Dk0ywSVPis3>@_zD$tMT}{^&H`xwyPM1DSO zySDsE;>w*W6~=mLxp-O9tl4d+_N4|HsXzyM;N?9SGDFxj<#sabL(xuWnOF7V#S3u8 zJ3tC^v$LNe<`=v^mGv!2{^`fV_?%{o3*uv=lbzX(v0{Iqf(&UoAcAGsxHJb6KrD>> z4ki(JT0Lmk{^5=MRCv0q9=64Ld$}0;jx>;dnLcXm(MU*a8I!wOMs{>Mm}++*4|)k* zvr3D(6qP*wlrBO`rWSii+tlfts_Bv+9Lvty+CK;D3Lvvah6bI6cD{Rl<8)R~fFOVs zVpa836sbN@2ma^&EOK{|A{`oFif>^z-3l1%KmGgMbaG^l@4d&v{41sDC9jrYdr5z> znUcrlp_0$N6RC=+Fly;7>;H3@?oa=6a&ZX*ppcP~`OkN5L(|T0;U-hZmli)h#`|

`iQa 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 CLmNE+ literal 0 HcmV?d00001 diff --git a/core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-md-ltr-Mobile-Chrome-linux.png b/core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-md-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..b78b20510ba04f77626cd6d8c1c1ba074f8fd98f GIT binary patch literal 10842 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 UNAx4O{u@D2PF1#A+BD>U0qF;M^8f$< literal 0 HcmV?d00001 diff --git a/core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-md-ltr-Mobile-Safari-linux.png b/core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-md-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..15d9f9c58c4fe5565718edc30377be02a74dc423 GIT binary patch literal 16889 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 literal 0 HcmV?d00001 diff --git a/core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-md-rtl-Mobile-Firefox-linux.png b/core/src/components/toast/test/layout/toast.e2e.ts-snapshots/toast-stacked-long-message-md-rtl-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..447c93633d5a6d0a53ba3266c15a4e9ed56fa7ca GIT binary patch literal 16075 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 Date: Tue, 27 Jan 2026 14:20:25 -0500 Subject: [PATCH 15/55] feat(range): add classes to the range when the value is at the min or max (#30932) ## What is the current behavior? Range adds classes to the knobs at `min` and `max`, but the host element doesn't reflect those states. ## What is the new behavior? - Adds `range-value-min` and `range-value-max` when the value is at the `min` or `max`, respectively. - Adds a spec test verifying the classes are applied properly. --------- Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- core/src/components/range/range.tsx | 11 ++- core/src/components/range/test/range.spec.ts | 98 ++++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/core/src/components/range/range.tsx b/core/src/components/range/range.tsx index d39e9732e82..431dbe4b7fe 100644 --- a/core/src/components/range/range.tsx +++ b/core/src/components/range/range.tsx @@ -883,7 +883,7 @@ export class Range implements ComponentInterface { } render() { - const { disabled, el, hasLabel, rangeId, pin, pressedKnob, labelPlacement, label } = this; + const { disabled, el, hasLabel, rangeId, pin, pressedKnob, labelPlacement, label, dualKnobs, min, max } = this; const inItem = hostContext('ion-item', el); @@ -906,6 +906,13 @@ export class Range implements ComponentInterface { const mode = getIonMode(this); + /** + * Determine if any knob is at the min or max value to + * apply Host classes for styling. + */ + const valueAtMin = dualKnobs ? this.valA === min || this.valB === min : this.valA === min; + const valueAtMax = dualKnobs ? this.valA === max || this.valB === max : this.valA === max; + renderHiddenInput(true, el, this.name, JSON.stringify(this.getValue()), disabled); return ( @@ -922,6 +929,8 @@ export class Range implements ComponentInterface { [`range-label-placement-${labelPlacement}`]: true, 'range-item-start-adjustment': needsStartAdjustment, 'range-item-end-adjustment': needsEndAdjustment, + 'range-value-min': valueAtMin, + 'range-value-max': valueAtMax, })} >

Hello

+ + `, + config + ); + + const content = page.locator('ion-content'); + await expect(content).toHaveClass(/content-fullscreen/); + }); + + test('should not have content-fullscreen class when fullscreen is false', async ({ page }) => { + await page.setContent( + ` + +

Hello

+
+ `, + config + ); + + const content = page.locator('ion-content'); + await expect(content).not.toHaveClass(/content-fullscreen/); + }); }); }); From 364faced7567ab9b2807d216aefdad511b584002 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Jan 2026 15:43:30 -0500 Subject: [PATCH 17/55] chore(deps): update actions/checkout action to v6.0.2 (#30935) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [actions/checkout](https://redirect.github.com/actions/checkout) | action | patch | `v6.0.1` → `v6.0.2` | --- ### Release Notes
actions/checkout (actions/checkout) ### [`v6.0.2`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v602) [Compare Source](https://redirect.github.com/actions/checkout/compare/v6.0.1...v6.0.2) - Fix tag handling: preserve annotations and explicit fetch-tags by [@​ericsciple](https://redirect.github.com/ericsciple) in [#​2356](https://redirect.github.com/actions/checkout/pull/2356)
--- ### Configuration 📅 **Schedule**: Branch creation - "every weekday before 11am" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Never, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/ionic-team/ionic-framework). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../build-core-stencil-prerelease/action.yml | 2 +- .../workflows/actions/build-core/action.yml | 2 +- .github/workflows/build.yml | 30 +++++++++---------- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/dev-build.yml | 2 +- .github/workflows/nightly.yml | 2 +- .github/workflows/release-ionic.yml | 16 +++++----- .github/workflows/release.yml | 4 +-- .github/workflows/stencil-nightly.yml | 30 +++++++++---------- .github/workflows/update-screenshots.yml | 6 ++-- 10 files changed, 48 insertions(+), 48 deletions(-) diff --git a/.github/workflows/actions/build-core-stencil-prerelease/action.yml b/.github/workflows/actions/build-core-stencil-prerelease/action.yml index d58299125e3..0cffac83659 100644 --- a/.github/workflows/actions/build-core-stencil-prerelease/action.yml +++ b/.github/workflows/actions/build-core-stencil-prerelease/action.yml @@ -8,7 +8,7 @@ inputs: runs: using: 'composite' steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x diff --git a/.github/workflows/actions/build-core/action.yml b/.github/workflows/actions/build-core/action.yml index 19487732007..3bf6659db09 100644 --- a/.github/workflows/actions/build-core/action.yml +++ b/.github/workflows/actions/build-core/action.yml @@ -8,7 +8,7 @@ inputs: runs: using: 'composite' steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 24.x diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d3d52e048be..7772b2c432f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,7 @@ jobs: build-core: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-core with: ionicons-version: ${{ inputs.ionicons_npm_release_tag }} @@ -31,21 +31,21 @@ jobs: needs: [build-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-core-clean-build test-core-lint: needs: [build-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-core-lint test-core-spec: needs: [build-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-core-spec test-core-screenshot: @@ -62,7 +62,7 @@ jobs: needs: [build-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-core-screenshot with: shard: ${{ matrix.shard }} @@ -90,14 +90,14 @@ jobs: needs: [build-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-vue build-vue-router: needs: [build-vue] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-vue-router test-vue-e2e: @@ -108,7 +108,7 @@ jobs: needs: [build-vue, build-vue-router] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-vue-e2e with: app: ${{ matrix.apps }} @@ -126,14 +126,14 @@ jobs: needs: [build-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-angular build-angular-server: needs: [build-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-angular-server test-angular-e2e: @@ -144,7 +144,7 @@ jobs: needs: [build-angular, build-angular-server] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-angular-e2e with: app: ${{ matrix.apps }} @@ -162,14 +162,14 @@ jobs: needs: [build-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-react build-react-router: needs: [build-react] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-react-router test-react-router-e2e: @@ -180,7 +180,7 @@ jobs: needs: [build-react, build-react-router] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-react-router-e2e with: app: ${{ matrix.apps }} @@ -202,7 +202,7 @@ jobs: needs: [build-react, build-react-router] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-react-e2e with: app: ${{ matrix.apps }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 2844a4f9b01..5e6715d02b1 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -14,7 +14,7 @@ jobs: permissions: security-events: write steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: github/codeql-action/init@v4 with: languages: javascript diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index 2c459097e67..51806128a8e 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -13,7 +13,7 @@ jobs: outputs: dev-hash: ${{ steps.create-dev-hash.outputs.DEV_HASH }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # A 1 is required before the timestamp # as lerna will fail when there is a leading 0 # See https://github.com/lerna/lerna/issues/2840 diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index dc2fa5860a9..2f64d9f9bd5 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -13,7 +13,7 @@ jobs: outputs: nightly-hash: ${{ steps.create-nightly-hash.outputs.NIGHTLY_HASH }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # A 1 is required before the timestamp # as lerna will fail when there is a leading 0 # See https://github.com/lerna/lerna/issues/2840 diff --git a/.github/workflows/release-ionic.yml b/.github/workflows/release-ionic.yml index c3f9e5740b6..70f1fb1956b 100644 --- a/.github/workflows/release-ionic.yml +++ b/.github/workflows/release-ionic.yml @@ -23,7 +23,7 @@ jobs: release-core: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/actions/publish-npm with: scope: '@ionic/core' @@ -48,7 +48,7 @@ jobs: needs: [release-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Restore @ionic/docs built cache uses: ./.github/workflows/actions/download-archive with: @@ -67,7 +67,7 @@ jobs: needs: [release-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Restore @ionic/core built cache uses: ./.github/workflows/actions/download-archive with: @@ -93,7 +93,7 @@ jobs: needs: [release-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Restore @ionic/core built cache uses: ./.github/workflows/actions/download-archive with: @@ -118,7 +118,7 @@ jobs: needs: [release-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Restore @ionic/core built cache uses: ./.github/workflows/actions/download-archive with: @@ -143,7 +143,7 @@ jobs: needs: [release-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Restore @ionic/core built cache uses: ./.github/workflows/actions/download-archive with: @@ -163,7 +163,7 @@ jobs: needs: [release-react] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Restore @ionic/core built cache uses: ./.github/workflows/actions/download-archive with: @@ -188,7 +188,7 @@ jobs: needs: [release-vue] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Restore @ionic/core built cache uses: ./.github/workflows/actions/download-archive with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a3bb4491cf5..df4429a806b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -58,7 +58,7 @@ jobs: contents: write id-token: write steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: token: ${{ secrets.IONITRON_TOKEN }} fetch-depth: 0 @@ -89,7 +89,7 @@ jobs: contents: write id-token: write steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # Pull the latest version of the reference # branch instead of the revision that triggered # the workflow otherwise we won't get the commit diff --git a/.github/workflows/stencil-nightly.yml b/.github/workflows/stencil-nightly.yml index b00ac8c42a0..3e8d714ccc1 100644 --- a/.github/workflows/stencil-nightly.yml +++ b/.github/workflows/stencil-nightly.yml @@ -26,7 +26,7 @@ jobs: build-core-with-stencil-nightly: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-core-stencil-prerelease with: stencil-version: ${{ inputs.npm_release_tag || 'nightly' }} @@ -35,21 +35,21 @@ jobs: needs: [build-core-with-stencil-nightly] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-core-clean-build test-core-lint: needs: [build-core-with-stencil-nightly] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-core-lint test-core-spec: needs: [build-core-with-stencil-nightly] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-core-spec with: stencil-version: ${{ inputs.npm_release_tag || 'nightly' }} @@ -72,7 +72,7 @@ jobs: needs: [build-core-with-stencil-nightly] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-core-screenshot with: shard: ${{ matrix.shard }} @@ -100,14 +100,14 @@ jobs: needs: [build-core-with-stencil-nightly] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-vue build-vue-router: needs: [build-vue] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-vue-router test-vue-e2e: @@ -118,7 +118,7 @@ jobs: needs: [build-vue, build-vue-router] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-vue-e2e with: app: ${{ matrix.apps }} @@ -136,14 +136,14 @@ jobs: needs: [build-core-with-stencil-nightly] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-angular build-angular-server: needs: [build-core-with-stencil-nightly] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-angular-server test-angular-e2e: @@ -154,7 +154,7 @@ jobs: needs: [build-angular, build-angular-server] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-angular-e2e with: app: ${{ matrix.apps }} @@ -172,14 +172,14 @@ jobs: needs: [build-core-with-stencil-nightly] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-react build-react-router: needs: [build-react] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-react-router test-react-router-e2e: @@ -190,7 +190,7 @@ jobs: needs: [build-react, build-react-router] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-react-router-e2e with: app: ${{ matrix.apps }} @@ -212,7 +212,7 @@ jobs: needs: [build-react, build-react-router] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-react-e2e with: app: ${{ matrix.apps }} diff --git a/.github/workflows/update-screenshots.yml b/.github/workflows/update-screenshots.yml index eefcddcb893..6efecbd8f95 100644 --- a/.github/workflows/update-screenshots.yml +++ b/.github/workflows/update-screenshots.yml @@ -26,7 +26,7 @@ jobs: build-core: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/build-core test-core-screenshot: @@ -47,7 +47,7 @@ jobs: needs: [build-core] runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/workflows/actions/test-core-screenshot with: shard: ${{ matrix.shard }} @@ -59,7 +59,7 @@ jobs: runs-on: ubuntu-latest needs: [test-core-screenshot] steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # Normally, we could just push with the # default GITHUB_TOKEN, but that will # not cause the build workflow From be14dc4bb8bbd7b92e91bde89f11c3c7584aa508 Mon Sep 17 00:00:00 2001 From: OS-jacobbell <228905018+OS-jacobbell@users.noreply.github.com> Date: Tue, 27 Jan 2026 14:57:29 -0700 Subject: [PATCH 18/55] chore(ci): persist updates to core/package.json in stencil nightly build (#30937) ## What is the current behavior? The Stencil Nightly Build workflow tests Ionic with the latest nightly build of Stencil. The first step of the workflow updates Stencil, builds Ionic core, and uploads the build files. Later steps download these build files. Core's updated package.json is not uploaded with the build files, so later steps are installing an old Stencil version, leading to conflicts. ## What is the new behavior? Add core's package.json to the artifact upload. This will make all later steps use the correct Stencil version. Seven of the tests run `git diff` to ensure tests did not cause changes in tracked files. Core's package.json would register as a change, so a new step reverts package.json before running `git diff`. ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information --- .github/workflows/actions/build-angular/action.yml | 4 ++++ .../actions/build-core-stencil-prerelease/action.yml | 2 +- .github/workflows/actions/build-react/action.yml | 4 ++++ .github/workflows/actions/build-vue/action.yml | 4 ++++ .github/workflows/actions/test-angular-e2e/action.yml | 2 +- .github/workflows/actions/test-core-clean-build/action.yml | 4 ++++ .github/workflows/actions/test-core-lint/action.yml | 4 ++++ .github/workflows/actions/test-core-screenshot/action.yml | 4 ++++ .../workflows/actions/update-reference-screenshots/action.yml | 4 ++++ 9 files changed, 30 insertions(+), 2 deletions(-) diff --git a/.github/workflows/actions/build-angular/action.yml b/.github/workflows/actions/build-angular/action.yml index fc7496de421..5224f9741e0 100644 --- a/.github/workflows/actions/build-angular/action.yml +++ b/.github/workflows/actions/build-angular/action.yml @@ -27,6 +27,10 @@ runs: run: npm run build shell: bash working-directory: ./packages/angular + - name: Clean core package.json + run: git checkout ./package.json + shell: bash + working-directory: ./core - name: 🔍 Check Diff run: git diff --exit-code shell: bash diff --git a/.github/workflows/actions/build-core-stencil-prerelease/action.yml b/.github/workflows/actions/build-core-stencil-prerelease/action.yml index 0cffac83659..d49deb58d6e 100644 --- a/.github/workflows/actions/build-core-stencil-prerelease/action.yml +++ b/.github/workflows/actions/build-core-stencil-prerelease/action.yml @@ -29,4 +29,4 @@ runs: with: name: ionic-core output: core/CoreBuild.zip - paths: core/dist core/components core/css core/hydrate core/loader core/src/components.d.ts + paths: core/dist core/components core/css core/hydrate core/loader core/src/components.d.ts core/package.json diff --git a/.github/workflows/actions/build-react/action.yml b/.github/workflows/actions/build-react/action.yml index 04e3f2c8b3a..f2adcb0788f 100644 --- a/.github/workflows/actions/build-react/action.yml +++ b/.github/workflows/actions/build-react/action.yml @@ -31,6 +31,10 @@ runs: run: npm run test.spec shell: bash working-directory: ./packages/react + - name: Clean core package.json + run: git checkout ./package.json + shell: bash + working-directory: ./core - name: 🔍 Check Diff run: git diff --exit-code shell: bash diff --git a/.github/workflows/actions/build-vue/action.yml b/.github/workflows/actions/build-vue/action.yml index ddd96b7a690..72a49093fca 100644 --- a/.github/workflows/actions/build-vue/action.yml +++ b/.github/workflows/actions/build-vue/action.yml @@ -27,6 +27,10 @@ runs: run: npm run build shell: bash working-directory: ./packages/vue + - name: Clean core package.json + run: git checkout ./package.json + shell: bash + working-directory: ./core - name: 🔍 Check Diff run: git diff --exit-code shell: bash diff --git a/.github/workflows/actions/test-angular-e2e/action.yml b/.github/workflows/actions/test-angular-e2e/action.yml index 1e5b49b3150..c6225382658 100644 --- a/.github/workflows/actions/test-angular-e2e/action.yml +++ b/.github/workflows/actions/test-angular-e2e/action.yml @@ -17,7 +17,7 @@ runs: - uses: ./.github/workflows/actions/download-archive with: name: ionic-angular - path: ./angular + path: ./packages/angular filename: AngularBuild.zip - uses: ./.github/workflows/actions/download-archive with: diff --git a/.github/workflows/actions/test-core-clean-build/action.yml b/.github/workflows/actions/test-core-clean-build/action.yml index ac5c345a235..7e5942a036e 100644 --- a/.github/workflows/actions/test-core-clean-build/action.yml +++ b/.github/workflows/actions/test-core-clean-build/action.yml @@ -12,6 +12,10 @@ runs: name: ionic-core path: ./core filename: CoreBuild.zip + - name: Clean core package.json + run: git checkout ./package.json + shell: bash + working-directory: ./core - name: 🔍 Check Diff run: | git diff --exit-code || { diff --git a/.github/workflows/actions/test-core-lint/action.yml b/.github/workflows/actions/test-core-lint/action.yml index a32355d33fa..ef9d37d0c7d 100644 --- a/.github/workflows/actions/test-core-lint/action.yml +++ b/.github/workflows/actions/test-core-lint/action.yml @@ -10,6 +10,10 @@ runs: run: npm ci working-directory: ./core shell: bash + - name: Clean core package.json + run: git checkout ./package.json + shell: bash + working-directory: ./core - name: 🖌️ Lint run: npm run lint shell: bash diff --git a/.github/workflows/actions/test-core-screenshot/action.yml b/.github/workflows/actions/test-core-screenshot/action.yml index 1ae7ac361e0..629c68d79f2 100644 --- a/.github/workflows/actions/test-core-screenshot/action.yml +++ b/.github/workflows/actions/test-core-screenshot/action.yml @@ -30,6 +30,10 @@ runs: run: npm run test.e2e.docker.ci ${{ inputs.component }} -- --shard=${{ inputs.shard }}/${{ inputs.totalShards }} shell: bash working-directory: ./core + - name: Clean core package.json + run: git checkout ./package.json + shell: bash + working-directory: ./core - name: Test and Update id: test-and-update if: inputs.update == 'true' diff --git a/.github/workflows/actions/update-reference-screenshots/action.yml b/.github/workflows/actions/update-reference-screenshots/action.yml index f104d227095..9c082f1a17d 100644 --- a/.github/workflows/actions/update-reference-screenshots/action.yml +++ b/.github/workflows/actions/update-reference-screenshots/action.yml @@ -21,6 +21,10 @@ runs: find . -type f -name 'UpdatedScreenshots-*.zip' -exec unzip -q -o -d ../ {} \; shell: bash working-directory: ./artifacts + - name: Clean core package.json + run: git checkout ./package.json + shell: bash + working-directory: ./core - name: 📸 Push Screenshots # Configure user as Ionitron # and push only the changed .png snapshots From 0cf4c03e298bb4f7eea71c966a1473765ebd6d7a Mon Sep 17 00:00:00 2001 From: Maria Hutt Date: Thu, 29 Jan 2026 06:32:23 -0800 Subject: [PATCH 19/55] feat(datetime): add wheel part to ion-picker-column (#30934) --- core/api.txt | 1 + core/src/components/datetime/datetime.tsx | 9 ++ .../datetime/test/custom/datetime.e2e.ts | 134 ++++++++++++++++++ .../datetime/test/custom/index.html | 7 + 4 files changed, 151 insertions(+) diff --git a/core/api.txt b/core/api.txt index 745d82786af..995c372cdfd 100644 --- a/core/api.txt +++ b/core/api.txt @@ -569,6 +569,7 @@ ion-datetime,part,calendar-day today ion-datetime,part,month-year-button ion-datetime,part,time-button ion-datetime,part,time-button active +ion-datetime,part,wheel ion-datetime,part,wheel-item ion-datetime,part,wheel-item active diff --git a/core/src/components/datetime/datetime.tsx b/core/src/components/datetime/datetime.tsx index 3411f28eb57..95f97d37cf0 100644 --- a/core/src/components/datetime/datetime.tsx +++ b/core/src/components/datetime/datetime.tsx @@ -79,6 +79,7 @@ import { checkForPresentationFormatMismatch, warnIfTimeZoneProvided } from './ut * @slot buttons - The buttons in the datetime. * @slot time-label - The label for the time selector in the datetime. * + * @part wheel - The wheel container when using a wheel style layout, or in the month/year picker when using a grid style layout. * @part wheel-item - The individual items when using a wheel style layout, or in the * month/year picker when using a grid style layout. * @part wheel-item active - The currently selected wheel-item. @@ -1724,6 +1725,7 @@ export class Datetime implements ComponentInterface { return ( { await expect(datetime).toHaveScreenshot(screenshot(`datetime-custom-calendar-days`)); }); }); + + test.describe(title('CSS shadow parts'), () => { + test('should be able to customize wheel part within the wheel style', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30420', + }); + + await page.setContent( + ` + + + `, + config + ); + + const datetime = page.locator('ion-datetime'); + const pickerColumn = datetime.locator('ion-picker-column').first(); + + const backgroundColor = await pickerColumn.evaluate((el) => { + return window.getComputedStyle(el).backgroundColor; + }); + + expect(backgroundColor).toBe('rgb(255, 0, 0)'); + }); + + test('should be able to customize wheel part within the month/year picker', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30420', + }); + + await page.setContent( + ` + + + `, + config + ); + + const datetime = page.locator('ion-datetime'); + const monthYearButton = datetime.locator('.calendar-month-year-toggle'); + + await monthYearButton.click(); + + const pickerColumn = datetime.locator('ion-picker-column').first(); + + const backgroundColor = await pickerColumn.evaluate((el) => { + return window.getComputedStyle(el).backgroundColor; + }); + + expect(backgroundColor).toBe('rgb(255, 165, 0)'); + }); + + test('should be able to customize wheel part within the time picker', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30420', + }); + + await page.setContent( + ` + + + `, + config + ); + + const datetime = page.locator('ion-datetime'); + const timeButton = datetime.locator('.time-body'); + + await timeButton.click(); + + const pickerColumn = page.locator('ion-picker-column').first(); + + const backgroundColor = await pickerColumn.evaluate((el) => { + return window.getComputedStyle(el).backgroundColor; + }); + + expect(backgroundColor).toBe('rgb(0, 128, 0)'); + }); + + test('should be able to customize wheel part when focused', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30420', + }); + + await page.setContent( + ` + + + `, + config + ); + + const datetime = page.locator('ion-datetime'); + const pickerColumn = datetime.locator('ion-picker-column').first(); + + await pickerColumn.click({ position: { x: 10, y: 10 } }); + + const backgroundColor = await pickerColumn.evaluate((el) => { + return window.getComputedStyle(el).backgroundColor; + }); + + expect(backgroundColor).toBe('rgb(0, 0, 255)'); + }); + }); }); /** diff --git a/core/src/components/datetime/test/custom/index.html b/core/src/components/datetime/test/custom/index.html index 09895d9c591..f0df8734521 100644 --- a/core/src/components/datetime/test/custom/index.html +++ b/core/src/components/datetime/test/custom/index.html @@ -74,6 +74,13 @@ color: rgb(128, 30, 171); } + /* Targets the month/year picker and the wheel style datetime */ + .custom-grid-wheel::part(wheel):focus, + /* Targets the time picker */ + ion-picker-column:focus { + background-color: rgba(138, 238, 69, 0.37); + } + /* * Custom Datetime Day Parts * ------------------------------------------- From 822da428af86cd9b036b81515272321eb8fa586c Mon Sep 17 00:00:00 2001 From: Shane Date: Thu, 29 Jan 2026 08:35:06 -0800 Subject: [PATCH 20/55] feat(angular): add custom injector support for modal and popover controllers (#30899) Issue number: resolves #30638 --------- ## What is the current behavior? When using `ModalController.create()` or `PopoverController.create()` in Angular, components rendered inside overlays cannot access non-global services or tokens from the component tree. For example, route-scoped services or Angular's Dir directive for bidirectional text support are not accessible from within a modal, requiring complex workarounds with wrapper components. ## What is the new behavior? `ModalController.create()` and `PopoverController.create()` now accept an optional injector property that allows passing a custom Angular Injector. This enables overlay components to access services and tokens that are not available in the root injector, such as route-scoped services or the Dir directive from Angular CDK. ```typescript const customInjector = Injector.create({ providers: [{ provide: MyService, useValue: myServiceInstance }], parent: this.injector, }); ``` ```typescript const modal = await this.modalController.create({ component: MyModalComponent, injector: customInjector, }); ``` ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information Current dev build: ``` 8.7.17-dev.11769628168.11eca7cd ``` --- packages/angular/common/src/index.ts | 1 + .../common/src/providers/angular-delegate.ts | 17 ++++-- .../common/src/types/overlay-options.ts | 18 ++++++ packages/angular/src/index.ts | 3 +- .../angular/src/providers/modal-controller.ts | 7 ++- .../src/providers/popover-controller.ts | 7 ++- packages/angular/standalone/src/index.ts | 3 +- .../src/providers/modal-controller.ts | 7 ++- .../src/providers/popover-controller.ts | 7 ++- .../standalone/modal-custom-injector.spec.ts | 30 ++++++++++ .../popover-custom-injector.spec.ts | 16 ++++++ .../standalone/app-standalone/app.routes.ts | 2 + .../home-page/home-page.component.html | 10 ++++ .../modal-custom-injector.component.ts | 57 +++++++++++++++++++ .../modal/modal.component.ts | 35 ++++++++++++ .../modal-custom-injector/test.service.ts | 14 +++++ .../popover-custom-injector.component.ts | 44 ++++++++++++++ .../popover/popover.component.ts | 22 +++++++ .../popover-custom-injector/test.service.ts | 14 +++++ 19 files changed, 292 insertions(+), 22 deletions(-) create mode 100644 packages/angular/common/src/types/overlay-options.ts create mode 100644 packages/angular/test/base/e2e/src/standalone/modal-custom-injector.spec.ts create mode 100644 packages/angular/test/base/e2e/src/standalone/popover-custom-injector.spec.ts create mode 100644 packages/angular/test/base/src/app/standalone/modal-custom-injector/modal-custom-injector.component.ts create mode 100644 packages/angular/test/base/src/app/standalone/modal-custom-injector/modal/modal.component.ts create mode 100644 packages/angular/test/base/src/app/standalone/modal-custom-injector/test.service.ts create mode 100644 packages/angular/test/base/src/app/standalone/popover-custom-injector/popover-custom-injector.component.ts create mode 100644 packages/angular/test/base/src/app/standalone/popover-custom-injector/popover/popover.component.ts create mode 100644 packages/angular/test/base/src/app/standalone/popover-custom-injector/test.service.ts diff --git a/packages/angular/common/src/index.ts b/packages/angular/common/src/index.ts index 447fb3e1c14..91ef464bf0a 100644 --- a/packages/angular/common/src/index.ts +++ b/packages/angular/common/src/index.ts @@ -9,6 +9,7 @@ export { AngularDelegate, bindLifecycleEvents, IonModalToken } from './providers export type { IonicWindow } from './types/interfaces'; export type { ViewDidEnter, ViewDidLeave, ViewWillEnter, ViewWillLeave } from './types/ionic-lifecycle-hooks'; +export type { ModalOptions, PopoverOptions } from './types/overlay-options'; export { NavParams } from './directives/navigation/nav-params'; diff --git a/packages/angular/common/src/providers/angular-delegate.ts b/packages/angular/common/src/providers/angular-delegate.ts index dd4964ef1c1..bde802ab115 100644 --- a/packages/angular/common/src/providers/angular-delegate.ts +++ b/packages/angular/common/src/providers/angular-delegate.ts @@ -36,7 +36,8 @@ export class AngularDelegate { create( environmentInjector: EnvironmentInjector, injector: Injector, - elementReferenceKey?: string + elementReferenceKey?: string, + customInjector?: Injector ): AngularFrameworkDelegate { return new AngularFrameworkDelegate( environmentInjector, @@ -44,7 +45,8 @@ export class AngularDelegate { this.applicationRef, this.zone, elementReferenceKey, - this.config.useSetInputAPI ?? false + this.config.useSetInputAPI ?? false, + customInjector ); } } @@ -59,7 +61,8 @@ export class AngularFrameworkDelegate implements FrameworkDelegate { private applicationRef: ApplicationRef, private zone: NgZone, private elementReferenceKey?: string, - private enableSignalsSupport?: boolean + private enableSignalsSupport?: boolean, + private customInjector?: Injector ) {} attachViewToDom(container: any, component: any, params?: any, cssClasses?: string[]): Promise { @@ -93,7 +96,8 @@ export class AngularFrameworkDelegate implements FrameworkDelegate { componentProps, cssClasses, this.elementReferenceKey, - this.enableSignalsSupport + this.enableSignalsSupport, + this.customInjector ); resolve(el); }); @@ -131,7 +135,8 @@ export const attachView = ( params: any, cssClasses: string[] | undefined, elementReferenceKey: string | undefined, - enableSignalsSupport: boolean | undefined + enableSignalsSupport: boolean | undefined, + customInjector?: Injector ): any => { /** * Wraps the injector with a custom injector that @@ -158,7 +163,7 @@ export const attachView = ( const childInjector = Injector.create({ providers, - parent: injector, + parent: customInjector ?? injector, }); const componentRef = createComponent(component, { diff --git a/packages/angular/common/src/types/overlay-options.ts b/packages/angular/common/src/types/overlay-options.ts new file mode 100644 index 00000000000..93ec10cb5f1 --- /dev/null +++ b/packages/angular/common/src/types/overlay-options.ts @@ -0,0 +1,18 @@ +import type { Injector } from '@angular/core'; +import type { ModalOptions as CoreModalOptions, PopoverOptions as CorePopoverOptions } from '@ionic/core/components'; + +/** + * Modal options with Angular-specific injector support. + * Extends @ionic/core ModalOptions with an optional injector property. + */ +export type ModalOptions = CoreModalOptions & { + injector?: Injector; +}; + +/** + * Popover options with Angular-specific injector support. + * Extends @ionic/core PopoverOptions with an optional injector property. + */ +export type PopoverOptions = CorePopoverOptions & { + injector?: Injector; +}; diff --git a/packages/angular/src/index.ts b/packages/angular/src/index.ts index 3eefb6c46ee..bb3c1e9568f 100644 --- a/packages/angular/src/index.ts +++ b/packages/angular/src/index.ts @@ -32,6 +32,7 @@ export { ViewDidEnter, ViewDidLeave, } from '@ionic/angular/common'; +export type { ModalOptions, PopoverOptions } from '@ionic/angular/common'; export { AlertController } from './providers/alert-controller'; export { AnimationController } from './providers/animation-controller'; export { ActionSheetController } from './providers/action-sheet-controller'; @@ -98,14 +99,12 @@ export { IonicSafeString, LoadingOptions, MenuCustomEvent, - ModalOptions, NavCustomEvent, PickerOptions, PickerButton, PickerColumn, PickerColumnOption, PlatformConfig, - PopoverOptions, RadioGroupCustomEvent, RadioGroupChangeEventDetail, RangeCustomEvent, diff --git a/packages/angular/src/providers/modal-controller.ts b/packages/angular/src/providers/modal-controller.ts index 51edf69cf36..682aabd2a32 100644 --- a/packages/angular/src/providers/modal-controller.ts +++ b/packages/angular/src/providers/modal-controller.ts @@ -1,6 +1,6 @@ import { Injector, Injectable, EnvironmentInjector, inject } from '@angular/core'; import { AngularDelegate, OverlayBaseController } from '@ionic/angular/common'; -import type { ModalOptions } from '@ionic/core'; +import type { ModalOptions } from '@ionic/angular/common'; import { modalController } from '@ionic/core'; @Injectable() @@ -14,9 +14,10 @@ export class ModalController extends OverlayBaseController { + const { injector: customInjector, ...restOpts } = opts; return super.create({ - ...opts, - delegate: this.angularDelegate.create(this.environmentInjector, this.injector, 'modal'), + ...restOpts, + delegate: this.angularDelegate.create(this.environmentInjector, this.injector, 'modal', customInjector), }); } } diff --git a/packages/angular/src/providers/popover-controller.ts b/packages/angular/src/providers/popover-controller.ts index 96c5c8d5a82..c5873e2e182 100644 --- a/packages/angular/src/providers/popover-controller.ts +++ b/packages/angular/src/providers/popover-controller.ts @@ -1,6 +1,6 @@ import { Injector, inject, EnvironmentInjector } from '@angular/core'; import { AngularDelegate, OverlayBaseController } from '@ionic/angular/common'; -import type { PopoverOptions } from '@ionic/core'; +import type { PopoverOptions } from '@ionic/angular/common'; import { popoverController } from '@ionic/core'; export class PopoverController extends OverlayBaseController { @@ -13,9 +13,10 @@ export class PopoverController extends OverlayBaseController { + const { injector: customInjector, ...restOpts } = opts; return super.create({ - ...opts, - delegate: this.angularDelegate.create(this.environmentInjector, this.injector, 'popover'), + ...restOpts, + delegate: this.angularDelegate.create(this.environmentInjector, this.injector, 'popover', customInjector), }); } } diff --git a/packages/angular/standalone/src/index.ts b/packages/angular/standalone/src/index.ts index 4dc766c1d41..131cbdb56da 100644 --- a/packages/angular/standalone/src/index.ts +++ b/packages/angular/standalone/src/index.ts @@ -28,6 +28,7 @@ export { ViewWillLeave, ViewDidLeave, } from '@ionic/angular/common'; +export type { ModalOptions, PopoverOptions } from '@ionic/angular/common'; export { IonNav } from './navigation/nav'; export { IonCheckbox, @@ -96,14 +97,12 @@ export { IonicSafeString, LoadingOptions, MenuCustomEvent, - ModalOptions, NavCustomEvent, PickerOptions, PickerButton, PickerColumn, PickerColumnOption, PlatformConfig, - PopoverOptions, RadioGroupCustomEvent, RadioGroupChangeEventDetail, RangeCustomEvent, diff --git a/packages/angular/standalone/src/providers/modal-controller.ts b/packages/angular/standalone/src/providers/modal-controller.ts index 07e406ec5d6..5cb85d9fbcd 100644 --- a/packages/angular/standalone/src/providers/modal-controller.ts +++ b/packages/angular/standalone/src/providers/modal-controller.ts @@ -1,6 +1,6 @@ import { Injector, Injectable, EnvironmentInjector, inject } from '@angular/core'; import { AngularDelegate, OverlayBaseController } from '@ionic/angular/common'; -import type { ModalOptions } from '@ionic/core/components'; +import type { ModalOptions } from '@ionic/angular/common'; import { modalController } from '@ionic/core/components'; import { defineCustomElement } from '@ionic/core/components/ion-modal.js'; @@ -16,9 +16,10 @@ export class ModalController extends OverlayBaseController { + const { injector: customInjector, ...restOpts } = opts; return super.create({ - ...opts, - delegate: this.angularDelegate.create(this.environmentInjector, this.injector, 'modal'), + ...restOpts, + delegate: this.angularDelegate.create(this.environmentInjector, this.injector, 'modal', customInjector), }); } } diff --git a/packages/angular/standalone/src/providers/popover-controller.ts b/packages/angular/standalone/src/providers/popover-controller.ts index 395b4dbdb70..6aaaf46e129 100644 --- a/packages/angular/standalone/src/providers/popover-controller.ts +++ b/packages/angular/standalone/src/providers/popover-controller.ts @@ -1,6 +1,6 @@ import { Injector, inject, EnvironmentInjector } from '@angular/core'; import { AngularDelegate, OverlayBaseController } from '@ionic/angular/common'; -import type { PopoverOptions } from '@ionic/core/components'; +import type { PopoverOptions } from '@ionic/angular/common'; import { popoverController } from '@ionic/core/components'; import { defineCustomElement } from '@ionic/core/components/ion-popover.js'; @@ -15,9 +15,10 @@ export class PopoverController extends OverlayBaseController { + const { injector: customInjector, ...restOpts } = opts; return super.create({ - ...opts, - delegate: this.angularDelegate.create(this.environmentInjector, this.injector, 'popover'), + ...restOpts, + delegate: this.angularDelegate.create(this.environmentInjector, this.injector, 'popover', customInjector), }); } } diff --git a/packages/angular/test/base/e2e/src/standalone/modal-custom-injector.spec.ts b/packages/angular/test/base/e2e/src/standalone/modal-custom-injector.spec.ts new file mode 100644 index 00000000000..f06224042eb --- /dev/null +++ b/packages/angular/test/base/e2e/src/standalone/modal-custom-injector.spec.ts @@ -0,0 +1,30 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Modal: Custom Injector', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/standalone/modal-custom-injector'); + }); + + test('should inject custom service via custom injector', async ({ page }) => { + await page.locator('ion-button#open-modal-with-custom-injector').click(); + + await expect(page.locator('ion-modal')).toBeVisible(); + + const serviceValue = page.locator('#service-value'); + await expect(serviceValue).toHaveText('Service Value: custom-injector-value'); + + await page.locator('#close-modal').click(); + await expect(page.locator('ion-modal')).not.toBeVisible(); + }); + + test('should fail without custom injector when service is not globally provided', async ({ page }) => { + page.on('dialog', async (dialog) => { + expect(dialog.message()).toContain('TestService not available'); + await dialog.accept(); + }); + + await page.locator('ion-button#open-modal-without-custom-injector').click(); + + await page.waitForEvent('dialog'); + }); +}); diff --git a/packages/angular/test/base/e2e/src/standalone/popover-custom-injector.spec.ts b/packages/angular/test/base/e2e/src/standalone/popover-custom-injector.spec.ts new file mode 100644 index 00000000000..255e59575f0 --- /dev/null +++ b/packages/angular/test/base/e2e/src/standalone/popover-custom-injector.spec.ts @@ -0,0 +1,16 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Popover: Custom Injector', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/standalone/popover-custom-injector'); + }); + + test('should inject custom service via custom injector', async ({ page }) => { + await page.locator('ion-button#open-popover-with-custom-injector').click(); + + await expect(page.locator('ion-popover')).toBeVisible(); + + const serviceValue = page.locator('#service-value'); + await expect(serviceValue).toHaveText('Service Value: custom-injector-value'); + }); +}); 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 667ef672e8b..197563dfb32 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 @@ -22,6 +22,8 @@ export const routes: Routes = [ ] }, { path: 'programmatic-modal', loadComponent: () => import('../programmatic-modal/programmatic-modal.component').then(c => c.ProgrammaticModalComponent) }, + { path: 'modal-custom-injector', loadComponent: () => import('../modal-custom-injector/modal-custom-injector.component').then(c => c.ModalCustomInjectorComponent) }, + { path: 'popover-custom-injector', loadComponent: () => import('../popover-custom-injector/popover-custom-injector.component').then(c => c.PopoverCustomInjectorComponent) }, { path: 'router-outlet', loadComponent: () => import('../router-outlet/router-outlet.component').then(c => c.RouterOutletComponent) }, { path: 'back-button', loadComponent: () => import('../back-button/back-button.component').then(c => c.BackButtonComponent) }, { path: 'router-link', loadComponent: () => import('../router-link/router-link.component').then(c => c.RouterLinkComponent) }, diff --git a/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html b/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html index 6dbad643eb2..058cec23c09 100644 --- a/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html +++ b/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html @@ -110,6 +110,11 @@ Programmatic Modal Test + + + Modal Custom Injector Test + + Overlay Controllers Test @@ -120,6 +125,11 @@ Popover Test + + + Popover Custom Injector Test + + diff --git a/packages/angular/test/base/src/app/standalone/modal-custom-injector/modal-custom-injector.component.ts b/packages/angular/test/base/src/app/standalone/modal-custom-injector/modal-custom-injector.component.ts new file mode 100644 index 00000000000..e889f108293 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/modal-custom-injector/modal-custom-injector.component.ts @@ -0,0 +1,57 @@ +import { Component, inject, Injector } from '@angular/core'; +import { IonContent, IonHeader, IonTitle, IonToolbar, IonButton, ModalController } from '@ionic/angular/standalone'; +import { ModalCustomInjectorModalComponent } from './modal/modal.component'; +import { TestService } from './test.service'; + +@Component({ + selector: 'app-modal-custom-injector', + template: ` + + + Modal Custom Injector Test + + + + + Open Modal with Custom Injector + + + Open Modal without Custom Injector + + + `, + standalone: true, + imports: [IonContent, IonHeader, IonTitle, IonToolbar, IonButton] +}) +export class ModalCustomInjectorComponent { + private modalController = inject(ModalController); + private injector = inject(Injector); + + async openWithCustomInjector() { + const testService = new TestService(); + testService.setValue('custom-injector-value'); + + const customInjector = Injector.create({ + providers: [{ provide: TestService, useValue: testService }], + parent: this.injector, + }); + + const modal = await this.modalController.create({ + component: ModalCustomInjectorModalComponent, + injector: customInjector, + }); + + await modal.present(); + } + + async openWithoutCustomInjector() { + try { + const modal = await this.modalController.create({ + component: ModalCustomInjectorModalComponent, + }); + await modal.present(); + } catch (e) { + alert('Error: TestService not available without custom injector'); + } + } +} diff --git a/packages/angular/test/base/src/app/standalone/modal-custom-injector/modal/modal.component.ts b/packages/angular/test/base/src/app/standalone/modal-custom-injector/modal/modal.component.ts new file mode 100644 index 00000000000..8c97d4a89e4 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/modal-custom-injector/modal/modal.component.ts @@ -0,0 +1,35 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { IonContent, IonHeader, IonTitle, IonToolbar, IonButton, IonButtons } from '@ionic/angular/standalone'; +import { TestService } from '../test.service'; + +@Component({ + selector: 'app-modal-custom-injector-modal', + template: ` + + + Modal with Custom Injector + + Close + + + + +

Service Value: {{ serviceValue }}

+
+ `, + standalone: true, + imports: [IonContent, IonHeader, IonTitle, IonToolbar, IonButton, IonButtons] +}) +export class ModalCustomInjectorModalComponent implements OnInit { + private testService = inject(TestService); + serviceValue = ''; + modal: HTMLIonModalElement | undefined; + + ngOnInit() { + this.serviceValue = this.testService.getValue(); + } + + dismiss() { + this.modal?.dismiss(); + } +} diff --git a/packages/angular/test/base/src/app/standalone/modal-custom-injector/test.service.ts b/packages/angular/test/base/src/app/standalone/modal-custom-injector/test.service.ts new file mode 100644 index 00000000000..c5fe87d1a48 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/modal-custom-injector/test.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; + +@Injectable() +export class TestService { + private value = 'default-value'; + + setValue(value: string) { + this.value = value; + } + + getValue(): string { + return this.value; + } +} diff --git a/packages/angular/test/base/src/app/standalone/popover-custom-injector/popover-custom-injector.component.ts b/packages/angular/test/base/src/app/standalone/popover-custom-injector/popover-custom-injector.component.ts new file mode 100644 index 00000000000..66b74033ef1 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/popover-custom-injector/popover-custom-injector.component.ts @@ -0,0 +1,44 @@ +import { Component, inject, Injector } from '@angular/core'; +import { IonContent, IonHeader, IonTitle, IonToolbar, IonButton, PopoverController } from '@ionic/angular/standalone'; +import { PopoverCustomInjectorPopoverComponent } from './popover/popover.component'; +import { TestService } from './test.service'; + +@Component({ + selector: 'app-popover-custom-injector', + template: ` + + + Popover Custom Injector Test + + + + + Open Popover with Custom Injector + + + `, + standalone: true, + imports: [IonContent, IonHeader, IonTitle, IonToolbar, IonButton] +}) +export class PopoverCustomInjectorComponent { + private popoverController = inject(PopoverController); + private injector = inject(Injector); + + async openWithCustomInjector(event: Event) { + const testService = new TestService(); + testService.setValue('custom-injector-value'); + + const customInjector = Injector.create({ + providers: [{ provide: TestService, useValue: testService }], + parent: this.injector, + }); + + const popover = await this.popoverController.create({ + component: PopoverCustomInjectorPopoverComponent, + event: event, + injector: customInjector, + }); + + await popover.present(); + } +} diff --git a/packages/angular/test/base/src/app/standalone/popover-custom-injector/popover/popover.component.ts b/packages/angular/test/base/src/app/standalone/popover-custom-injector/popover/popover.component.ts new file mode 100644 index 00000000000..2be85458c5a --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/popover-custom-injector/popover/popover.component.ts @@ -0,0 +1,22 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { IonContent } from '@ionic/angular/standalone'; +import { TestService } from '../test.service'; + +@Component({ + selector: 'app-popover-custom-injector-popover', + template: ` + +

Service Value: {{ serviceValue }}

+
+ `, + standalone: true, + imports: [IonContent] +}) +export class PopoverCustomInjectorPopoverComponent implements OnInit { + private testService = inject(TestService); + serviceValue = ''; + + ngOnInit() { + this.serviceValue = this.testService.getValue(); + } +} diff --git a/packages/angular/test/base/src/app/standalone/popover-custom-injector/test.service.ts b/packages/angular/test/base/src/app/standalone/popover-custom-injector/test.service.ts new file mode 100644 index 00000000000..c5fe87d1a48 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/popover-custom-injector/test.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; + +@Injectable() +export class TestService { + private value = 'default-value'; + + setValue(value: string) { + this.value = value; + } + + getValue(): string { + return this.value; + } +} From 893d5239979a468081bd88eda6ef602f9358f5aa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 30 Jan 2026 09:18:12 -0500 Subject: [PATCH 21/55] chore(deps): update dependency @capacitor/core to v8.0.2 (#30938) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@capacitor/core](https://capacitorjs.com) ([source](https://redirect.github.com/ionic-team/capacitor)) | [`8.0.1` → `8.0.2`](https://renovatebot.com/diffs/npm/@capacitor%2fcore/8.0.1/8.0.2) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@capacitor%2fcore/8.0.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@capacitor%2fcore/8.0.1/8.0.2?slim=true) | --- ### Release Notes
ionic-team/capacitor (@​capacitor/core) ### [`v8.0.2`](https://redirect.github.com/ionic-team/capacitor/blob/HEAD/CHANGELOG.md#802-2026-01-27) [Compare Source](https://redirect.github.com/ionic-team/capacitor/compare/8.0.1...8.0.2) ##### Bug Fixes - **android:** AGP 9.0 no longer supports `proguard-android.txt` ([#​8315](https://redirect.github.com/ionic-team/capacitor/issues/8315)) ([dcc76c3](https://redirect.github.com/ionic-team/capacitor/commit/dcc76c37508a9b71fb36d95707748c2dd115cf52)) - **cli:** Update tar package ([#​8311](https://redirect.github.com/ionic-team/capacitor/issues/8311)) ([0969c5c](https://redirect.github.com/ionic-team/capacitor/commit/0969c5cd0b16cf23d2489a85a3b8fa1bee2ebf3b)) - **core:** make SystemBars hide and show options optional ([#​8305](https://redirect.github.com/ionic-team/capacitor/issues/8305)) ([95dc7d8](https://redirect.github.com/ionic-team/capacitor/commit/95dc7d8ace3aabdda7e325c4a8ef7d1432ad37e9)) - **SystemBars:** get correct style on handleOnConfigurationChanged ([#​8295](https://redirect.github.com/ionic-team/capacitor/issues/8295)) ([2a66b44](https://redirect.github.com/ionic-team/capacitor/commit/2a66b44915895f971e4a26a8612798aa2f95ea11)) - **SystemBars:** Set window background color according to theme ([#​8306](https://redirect.github.com/ionic-team/capacitor/issues/8306)) ([6037e38](https://redirect.github.com/ionic-team/capacitor/commit/6037e3836ec24c9ddf26e74e5fbec20ab506adfd)) - **SystemBars:** Skipping margin manipulation when on a fixed WebView ([#​8309](https://redirect.github.com/ionic-team/capacitor/issues/8309)) ([53c33b6](https://redirect.github.com/ionic-team/capacitor/commit/53c33b614218bf635322fbdf9a38038a7964e3d4))
--- ### Configuration 📅 **Schedule**: Branch creation - "every weekday before 11am" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Never, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/ionic-team/ionic-framework). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- core/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/package-lock.json b/core/package-lock.json index 25a81fd8f8a..6b2c88c5512 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -629,9 +629,9 @@ "license": "MIT" }, "node_modules/@capacitor/core": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.0.1.tgz", - "integrity": "sha512-5UqSWxGMp/B8KhYu7rAijqNtYslhcLh+TrbfU48PfdMDsPfaU/VY48sMNzC22xL8BmoFoql/3SKyP+pavTOvOA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.0.2.tgz", + "integrity": "sha512-EXZfxkL6GFJS2cb7TIBR7RiHA5iz6ufDcl1VmUpI2pga3lJ5Ck2+iqbx7N+osL3XYem9ad4XCidJEMm64DX6UQ==", "dev": true, "license": "MIT", "peer": true, From cc75ff42e1e5359487499532b88f71dda715d7b5 Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Tue, 3 Feb 2026 09:51:30 -0500 Subject: [PATCH 22/55] chore(scripts): remove no longer used test.e2e.script (#30943) Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- core/package-lock.json | 20 --- core/package.json | 4 +- core/scripts/testing/e2e-script.mjs | 260 ---------------------------- 3 files changed, 1 insertion(+), 283 deletions(-) delete mode 100644 core/scripts/testing/e2e-script.mjs diff --git a/core/package-lock.json b/core/package-lock.json index 6b2c88c5512..c3656beae5a 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -19,7 +19,6 @@ "@capacitor/haptics": "^8.0.0", "@capacitor/keyboard": "^8.0.0", "@capacitor/status-bar": "^8.0.0", - "@clack/prompts": "^0.11.0", "@ionic/eslint-config": "^0.3.0", "@ionic/prettier-config": "^2.0.0", "@playwright/test": "^1.56.1", @@ -669,25 +668,6 @@ "@capacitor/core": ">=8.0.0" } }, - "node_modules/@clack/core": { - "version": "0.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "sisteransi": "^1.0.5" - } - }, - "node_modules/@clack/prompts": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@clack/core": "0.5.0", - "picocolors": "^1.0.0", - "sisteransi": "^1.0.5" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "dev": true, diff --git a/core/package.json b/core/package.json index ceb84b5c68c..24cee91bce6 100644 --- a/core/package.json +++ b/core/package.json @@ -44,7 +44,6 @@ "@capacitor/haptics": "^8.0.0", "@capacitor/keyboard": "^8.0.0", "@capacitor/status-bar": "^8.0.0", - "@clack/prompts": "^0.11.0", "@ionic/eslint-config": "^0.3.0", "@ionic/prettier-config": "^2.0.0", "@playwright/test": "^1.56.1", @@ -104,8 +103,7 @@ "docker.build": "docker build -t ionic-playwright .", "test.e2e.docker": "npm run docker.build && node ./scripts/docker.mjs", "test.e2e.docker.update-snapshots": "npm run test.e2e.docker -- --update-snapshots='changed'", - "test.e2e.docker.ci": "npm run docker.build && CI=true node ./scripts/docker.mjs", - "test.e2e.script": "node scripts/testing/e2e-script.mjs" + "test.e2e.docker.ci": "npm run docker.build && CI=true node ./scripts/docker.mjs" }, "author": "Ionic Team", "license": "MIT", diff --git a/core/scripts/testing/e2e-script.mjs b/core/scripts/testing/e2e-script.mjs deleted file mode 100644 index 794447bf61c..00000000000 --- a/core/scripts/testing/e2e-script.mjs +++ /dev/null @@ -1,260 +0,0 @@ -// The purpose of this script is to provide a way run the E2E tests -// without having the developer to manually run multiple commands based -// on the desired end result. -// E.g. update the local ground truths for a specific component or -// open the Playwright report after running the E2E tests. - -import { - intro, - outro, - confirm, - spinner, - isCancel, - cancel, - text, - log, -} from '@clack/prompts'; -import { exec, spawn } from 'child_process'; -import fs from 'node:fs'; -import { setTimeout as sleep } from 'node:timers/promises'; -import util from 'node:util'; -import color from 'picocolors'; - -async function main() { - const execAsync = util.promisify(exec); - const cleanUpFiles = async () => { - // Clean up the local ground truths. - const cleanUp = spinner(); - - // Inform the user that the local ground truths are being cleaned up. - cleanUp.start('Restoring local ground truths'); - - // Reset the local ground truths. - await execAsync('git reset -- src/**/*-linux.png').catch((error) => { - cleanUp.stop('Failed to reset local ground truths'); - console.error(error); - return process.exit(0); - }); - - // Restore the local ground truths. - await execAsync('git restore -- src/**/*-linux.png').catch((error) => { - cleanUp.stop('Failed to restore local ground truths'); - console.error(error); - return process.exit(0); - }); - - // Inform the user that the local ground truths have been cleaned up. - cleanUp.stop('Local ground truths have been restored to their original state in order to avoid committing them.'); - }; - - intro(color.inverse(' Update Local Ground Truths')); - - // Ask user for the component name they want to test. - const componentValue = await text({ - message: 'Enter the component or path you want to test (e.g. chip, src/components/chip)', - placeholder: 'Empty for all components', - }); - - // User cancelled the operation with `Ctrl+C` or `CMD+C`. - if (isCancel(componentValue)) { - cancel('Operation cancelled'); - return process.exit(0); - } - - // Ask user if they want to update their local ground truths. - const shouldUpdateTruths = await confirm({ - message: 'Do you want to update your local ground truths?', - }); - - // User cancelled the operation with `Ctrl+C` or `CMD+C`. - if (isCancel(shouldUpdateTruths)) { - cancel('Operation cancelled'); - return process.exit(0); - } - - if (shouldUpdateTruths) { - const defaultBaseBranch = 'main'; - - // Ask user for the base branch. - let baseBranch = await text({ - message: 'Enter the base branch name:', - placeholder: `default: ${defaultBaseBranch}`, - }) - - // User cancelled the operation with `Ctrl+C` or `CMD+C`. - if (isCancel(baseBranch)) { - cancel('Operation cancelled'); - return process.exit(0); - } - - // User didn't provide a base branch. - if (!baseBranch) { - baseBranch = defaultBaseBranch; - } - - /** - * The provided base branch needs to be fetched. - * This ensures that the local base branch is up-to-date with the - * remote base branch. Otherwise, there might be errors stating that - * certain files don't exist in the local base branch. - */ - const fetchBaseBranch = spinner(); - - // Inform the user that the base branch is being fetched. - fetchBaseBranch.start(`Fetching "${baseBranch}" to have the latest changes`); - - // Fetch the base branch. - await execAsync(`git fetch origin ${baseBranch}`).catch((error) => { - fetchBaseBranch.stop(`Failed to fetch "${baseBranch}"`); - console.error(error); - return process.exit(0); - }); - - // Inform the user that the base branch has been fetched. - fetchBaseBranch.stop(`Fetched "${baseBranch}"`); - - - const updateGroundTruth = spinner(); - - // Inform the user that the local ground truths are being updated. - updateGroundTruth.start('Updating local ground truths'); - - // Check if user provided an existing file or directory. - const isValidLocation = fs.existsSync(componentValue); - - // User provided an existing file or directory. - if (isValidLocation) { - const stats = fs.statSync(componentValue); - - // User provided a file as the component. - // ex: `componentValue` = `src/components/chip/test/basic/chip.e2e.ts` - if (stats.isFile()) { - // Update the local ground truths for the provided path. - await execAsync(`git checkout origin/${baseBranch} -- ${componentValue}-snapshots/*-linux.png`).catch((error) => { - updateGroundTruth.stop('Failed to update local ground truths'); - console.error(error); - return process.exit(0); - }); - } - - // User provided a directory as the component. - // ex: `componentValue` = `src/components/chip` - if (stats.isDirectory()) { - // Update the local ground truths for the provided directory. - await execAsync(`git checkout origin/${baseBranch} -- ${componentValue}/test/*/*.e2e.ts-snapshots/*-linux.png`).catch((error) => { - updateGroundTruth.stop('Failed to update local ground truths'); - console.error(error); - return process.exit(0); - }); - } - } - // User provided a component name as the component. - // ex: `componentValue` = `chip` - else if (componentValue) { - // Update the local ground truths for the provided component. - await execAsync(`git checkout origin/${baseBranch} -- src/components/${componentValue}/test/*/${componentValue}.e2e.ts-snapshots/*-linux.png`).catch((error) => { - updateGroundTruth.stop('Failed to update local ground truths'); - console.error(error); - return process.exit(0); - }); - } - // User provided an empty string. - else { - // Update the local ground truths for all components. - await execAsync(`git checkout origin/${baseBranch} -- src/components/*/test/*/*.e2e.ts-snapshots/*-linux.png`).catch((error) => { - updateGroundTruth.stop('Failed to update local ground truths'); - console.error(error); - return process.exit(0); - }); - } - - // Inform the user that the local ground truths have been updated. - updateGroundTruth.stop('Updated local ground truths'); - } - - const buildCore = spinner(); - - // Inform the user that the core is being built. - buildCore.start('Building core'); - - /** - * Build core - * Otherwise, the uncommitted changes will not be reflected in the tests because: - * - popping the stash doesn't trigger a re-render even if `npm start` is running - * - app is not running the `npm start` command - */ - await execAsync('npm run build').catch((error) => { - // Clean up the local ground truths. - cleanUpFiles(); - - buildCore.stop('Failed to build core'); - console.error(error); - return process.exit(0); - }); - - buildCore.stop('Built core'); - - const runE2ETests = spinner(); - - // Inform the user that the E2E tests are being run. - runE2ETests.start('Running E2E tests'); - - // User provided a component value. - if (componentValue) { - await execAsync(`npm run test.e2e.docker.ci ${componentValue}`).catch((error) => { - // Clean up the local ground truths. - cleanUpFiles(); - - runE2ETests.stop('Failed to run E2E tests'); - console.error(error); - return process.exit(0); - }); - } else { - await execAsync('npm run test.e2e.docker.ci').catch((error) => { - // Clean up the local ground truths. - cleanUpFiles(); - - runE2ETests.stop('Failed to run E2E tests'); - console.error(error); - return process.exit(0); - }); - } - - runE2ETests.stop('Ran E2E tests'); - - // Clean up the local ground truths. - await cleanUpFiles(); - - // Ask user if they want to open the Playwright report. - const shouldOpenReport = await confirm({ - message: 'Do you want to open the Playwright report?', - }); - - // User cancelled the operation with `Ctrl+C` or `CMD+C`. - if (isCancel(shouldOpenReport)) { - cancel('Operation cancelled'); - return process.exit(0); - } - - // User chose to open the Playwright report. - if (shouldOpenReport) { - // Use spawn to display the server information and the key to quit the server. - spawn('npx', ['playwright', 'show-report'], { - stdio: 'inherit', - }); - } else { - // Inform the user that the Playwright report can be opened by running the following command. - log.info('If you change your mind, you can open the Playwright report by running the following command:'); - log.info(color.bold('npx playwright show-report')); - } - - if (shouldOpenReport) { - outro("You're all set! Don't forget to quit serving the Playwright report when you're done."); - } else { - outro("You're all set!"); - } - - await sleep(1000); -} - -main().catch(console.error); From 6e4f60af4c188ae04028b444aa21118ae27c2ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Naso?= Date: Tue, 3 Feb 2026 20:02:27 -0300 Subject: [PATCH 23/55] feat(select): pass cancelText property to modal interface (#30282) Co-authored-by: Nicolas Naso Co-authored-by: Brandy Smith Co-authored-by: Maria Hutt --- core/api.txt | 1 + core/src/components.d.ts | 10 ++ .../components/select-modal/select-modal.tsx | 7 +- .../select-modal/test/custom/index.html | 40 ++++++++ .../test/custom/select-modal.e2e.ts | 45 +++++++++ core/src/components/select/select.tsx | 1 + ...o-selected-ios-ltr-Mobile-Chrome-linux.png | Bin 20371 -> 19828 bytes ...-selected-ios-ltr-Mobile-Firefox-linux.png | Bin 31050 -> 31112 bytes ...o-selected-ios-ltr-Mobile-Safari-linux.png | Bin 25202 -> 25285 bytes ...to-selected-md-ltr-Mobile-Chrome-linux.png | Bin 18937 -> 18428 bytes ...o-selected-md-ltr-Mobile-Firefox-linux.png | Bin 27643 -> 27605 bytes ...to-selected-md-ltr-Mobile-Safari-linux.png | Bin 22527 -> 22670 bytes .../select/test/custom/select.e2e.ts | 86 ++++++++++++++++++ packages/angular/src/directives/proxies.ts | 4 +- .../standalone/src/directives/proxies.ts | 4 +- packages/vue/src/proxies.ts | 1 + 16 files changed, 194 insertions(+), 5 deletions(-) create mode 100644 core/src/components/select-modal/test/custom/index.html create mode 100644 core/src/components/select-modal/test/custom/select-modal.e2e.ts diff --git a/core/api.txt b/core/api.txt index 995c372cdfd..b4036e6b8e8 100644 --- a/core/api.txt +++ b/core/api.txt @@ -1767,6 +1767,7 @@ ion-select,part,supporting-text ion-select,part,text ion-select-modal,scoped +ion-select-modal,prop,cancelText,string,'Close',false,false ion-select-modal,prop,header,string | undefined,undefined,false,false ion-select-modal,prop,multiple,boolean | undefined,undefined,false,false ion-select-modal,prop,options,SelectModalOption[],[],false,false diff --git a/core/src/components.d.ts b/core/src/components.d.ts index 5e47667392b..ae6d9f4c2fb 100644 --- a/core/src/components.d.ts +++ b/core/src/components.d.ts @@ -3223,6 +3223,11 @@ export namespace Components { "value"?: any | null; } interface IonSelectModal { + /** + * The text to display on the cancel button. + * @default 'Close' + */ + "cancelText": string; "header"?: string; "multiple"?: boolean; /** @@ -8548,6 +8553,11 @@ declare namespace LocalJSX { "value"?: any | null; } interface IonSelectModal { + /** + * The text to display on the cancel button. + * @default 'Close' + */ + "cancelText"?: string; "header"?: string; "multiple"?: boolean; /** diff --git a/core/src/components/select-modal/select-modal.tsx b/core/src/components/select-modal/select-modal.tsx index 5925d209640..d83d7fa76b0 100644 --- a/core/src/components/select-modal/select-modal.tsx +++ b/core/src/components/select-modal/select-modal.tsx @@ -23,6 +23,11 @@ export class SelectModal implements ComponentInterface { @Prop() header?: string; + /** + * The text to display on the cancel button. + */ + @Prop() cancelText = 'Close'; + @Prop() multiple?: boolean; @Prop() options: SelectModalOption[] = []; @@ -149,7 +154,7 @@ export class SelectModal implements ComponentInterface { {this.header !== undefined && {this.header}} - this.closeModal()}>Close + this.closeModal()}>{this.cancelText} diff --git a/core/src/components/select-modal/test/custom/index.html b/core/src/components/select-modal/test/custom/index.html new file mode 100644 index 00000000000..20de632ce3d --- /dev/null +++ b/core/src/components/select-modal/test/custom/index.html @@ -0,0 +1,40 @@ + + + + + Select - Custom + + + + + + + + + + + + + Select Modal - Custom + + + + + + + + + + + + + diff --git a/core/src/components/select-modal/test/custom/select-modal.e2e.ts b/core/src/components/select-modal/test/custom/select-modal.e2e.ts new file mode 100644 index 00000000000..7c95a4428dd --- /dev/null +++ b/core/src/components/select-modal/test/custom/select-modal.e2e.ts @@ -0,0 +1,45 @@ +import { expect } from '@playwright/test'; +import { configs, test } from '@utils/test/playwright'; + +import type { SelectModalOption } from '../../select-modal-interface'; +import { SelectModalPage } from '../fixtures'; + +const options: SelectModalOption[] = [ + { value: 'apple', text: 'Apple', disabled: false, checked: false }, + { value: 'banana', text: 'Banana', disabled: false, checked: false }, +]; + +/** + * This behavior does not vary across modes/directions. + */ +configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => { + test.describe(title('select-modal: custom'), () => { + let selectModalPage: SelectModalPage; + + test.beforeEach(async ({ page }) => { + selectModalPage = new SelectModalPage(page); + }); + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + test('should render custom cancel text when prop is provided', async ({ page: _page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30295', + }); + + await selectModalPage.setup(config, options, false); + + const cancelButton = selectModalPage.selectModal.locator('ion-button'); + + // Verify the default text on the cancel button + await expect(cancelButton).toHaveText('Close'); + + await selectModalPage.selectModal.evaluate((selectModal: HTMLIonSelectModalElement) => { + selectModal.cancelText = 'Close me'; + }); + + // Verify the cancel button text has been updated + await expect(cancelButton).toHaveText('Close me'); + }); + }); +}); diff --git a/core/src/components/select/select.tsx b/core/src/components/select/select.tsx index b8de35c4843..97309bac332 100644 --- a/core/src/components/select/select.tsx +++ b/core/src/components/select/select.tsx @@ -795,6 +795,7 @@ export class Select implements ComponentInterface { component: 'ion-select-modal', componentProps: { header: interfaceOptions.header, + cancelText: this.cancelText, multiple, value, options: this.createOverlaySelectOptions(this.childOpts, value), diff --git a/core/src/components/select/test/basic/select.e2e.ts-snapshots/select-basic-modal-scroll-to-selected-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/select/test/basic/select.e2e.ts-snapshots/select-basic-modal-scroll-to-selected-ios-ltr-Mobile-Chrome-linux.png index a66e87cecbaf5404cb2e5ee8fc168390a775290f..43fcd9ef7098a54eaa643b625b21a3129853ff61 100644 GIT binary patch literal 19828 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%0AToDd^j*FUB_zFu27DRxf0&}< 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 E0CUwl6951J diff --git a/core/src/components/select/test/basic/select.e2e.ts-snapshots/select-basic-modal-scroll-to-selected-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/select/test/basic/select.e2e.ts-snapshots/select-basic-modal-scroll-to-selected-ios-ltr-Mobile-Firefox-linux.png index 2e4f0b3a06fdb31a4723a0721a43b6c32219aa56..b25f9c98d2fcb1b354b7cf5e429ec15cf022ea9c 100644 GIT binary patch literal 31112 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 literal 31050 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≠&Tv`+@Khc7(`1 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 L9L%qBd}96$MV!)G diff --git a/core/src/components/select/test/basic/select.e2e.ts-snapshots/select-basic-modal-scroll-to-selected-ios-ltr-Mobile-Safari-linux.png b/core/src/components/select/test/basic/select.e2e.ts-snapshots/select-basic-modal-scroll-to-selected-ios-ltr-Mobile-Safari-linux.png index e49ddb007b3d68ef609c6468523848515278298e..0cd3370fa9a5440d697dbbeefd910473981574e8 100644 GIT binary patch literal 25285 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 literal 25202 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 diff --git a/core/src/components/select/test/basic/select.e2e.ts-snapshots/select-basic-modal-scroll-to-selected-md-ltr-Mobile-Chrome-linux.png b/core/src/components/select/test/basic/select.e2e.ts-snapshots/select-basic-modal-scroll-to-selected-md-ltr-Mobile-Chrome-linux.png index 2acdba257d9b774e98d215c06e2bb585aa8e0730..a75ada58efb2ff4681e209a8510caa11489e529a 100644 GIT binary patch literal 18428 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 literal 18937 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 II`G1O080Unk^lez diff --git a/core/src/components/select/test/basic/select.e2e.ts-snapshots/select-basic-modal-scroll-to-selected-md-ltr-Mobile-Safari-linux.png b/core/src/components/select/test/basic/select.e2e.ts-snapshots/select-basic-modal-scroll-to-selected-md-ltr-Mobile-Safari-linux.png index a4e7755364c49cfdb89630c7fee5dc0b3dc725b4..984eb8a04834639916d479a2ab03326916129480 100644 GIT binary patch literal 22670 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

DhR=nL<=e^02X|VT+x&usH0J`GgfXiAc>KZZVPk z6#k2Rw{KwJuNreR>}eog^el3|0X6|~gEC+=B6w)2uf@R;;8z{tAQ><_YX@2kHu_RE z#UtOtvh&mGcd@Z})fX4gJ|bpha;HD0FCxi%yx-#c>+{?7=$G_FSs75oh!V@^YTy*t z9`!mIi;yD*u1MgXaytQ1KoV+^ku->p4p@o7U2U@+NGhqEJ(kvJh`5sG*aer19u;_= zYgRDLB$%9cv_1({7A^Uua)KuDJjn~YvMdcCQ`)_9Luy8=E4lTonLjW90N8_s1b&z$ zvp$UP5J;KH=DH6q%NJ(w`>(@`cK=r9`h6he4t2?y&%?dcS*qecjuF57^6|n|Gnaw$ zvEVgIPH$}3ZAJU5-sPts3``X@=fU$unYqRN+ z1^=;{s;!3>l%w8QUAp>J%7(fp%~0L4b&zV@bf!1!!)u0%($bX|{q9Fz4A>bgY^}Z2 zx-2CwGV-oxt(Ky){Zk3C^xz)vcWdh2&pwTpI8l|o@IEA8`|{TxfB$02YazVv=}W;b z?MAf>uSH+$WhU)z%N|c|KBPN;bB&qc>OSH1F88GdmhXIFkT|m#<>t|trgPx(W}WG@ z>_<)ubX~25_w{A=s0qb&w&$G~kU6Uovbdtfe)4mIBR2*ATH2ZstS_@d*t$>lOg>Iy zhkng0%;D8HP%z1zTGwrO_55(+8Hc8pGj+2Tc5dr#8eiv|o9gXqOkS7IeDGO+u47}S zqhR(}`nSR&zt-!%x>7M=vH1}{zI{8UDZi3#a!Y$}>%H*EbhEAsjf$>^wyFSEW`54r z$wJXxZ+J`c4fyZPG2HqcAuSy(8=5@b%yanOU}JxIy_mV+BQ}BXL^Zd>zPU>&^KLCo zxX~wR!WPSST9;i7XWjZS{2nXl-}G$POirkc)R7|$zx(wY^Y!RTe4Z;^whdjdw`!lJ z-g&!2O?V`Pj&ommlV{Ysd!i{$MQ+239|yS2Th=TJQK!nMD{iIf>0Qv3@{CFj-MYjb zULUcvhb1;Y`dz0;#DU;4xhl^tk3GYQ(+LTRs-~f-eG%g!tJBTj*hDn8I{zMStE~&a zImDwdT4}H(_t{h|dpsq`!kRyCiL3EYu`};9XUc2&7q^!97>1g@7_+l|`dt&vwIm@e z9sKf(;7S)hi4!y9?9OthW(2OLk8*LFuj@!(7o%3?)O|BP@9Otl$MTC=)E(2 z+)gk59v>xDmA}ZS9&#iqZE|;&HZ<^*hkB61w|*% z2_26Ep=KQZLV42@@-^qnqI=^d^v@)k0&>LOAVOG z>niac`TW%S%v>jJPE)IkUYXE*qJh|aQ(e7a*kS?OcH1J=l6y;;{-$}L{S_hEL6IiG z7^Plb>$cWvfmk$dzaro;AuVT{(p%BjoGU!ZxrfT^v-WvU3EwYPY3b04eIF_7o2_>~ z6iXI$8raLE$O%kAnOK$i@YMK{54PBk_j*!g`JHW!oJ{-?+o#J)fvai3C{8{c^V1iue#@+M~r&VoUAA?xpesnYLa%P*P)Y$8{7^4y-Yar8j2fpu@Mh!V(yP`t8e;AK z`!Brr5#7LQYqyDs)-H`@OMgP|;bnQWE88l9Klt>urbMU?nQF-0vzwweeNYg+l;hJ$ zn?2JW7SNEYy%w6Au0++9I}KqGUJGYdbL+n&PdqW3d!#-+TpKM5-C=T|x!BxKCPhrD zL^Vb`D{#@(C#W<)u1)820K1Z^VsT`rBd^2UsY0V2Cld0~MIAjkI4Zk8TpJmi?Al7} zYFaWP(yV5q;vLo+GVEMDz826+d|_UkVg5qFgTQ0q;UcT}*`{>LenBRiemxZ5mxbG7Gao%p8GUPp?TbIIk@K?OeQMyU1x;~X++sFmW;YOeO zR=GV#Y&%z@*^6>NTk5U& zdi#&1xeQMj2A zl5%F&FN1Wv^zq+aWNx4@`sQ4NFd^6f(a82#qN6B2meo2P`v@=brO2L=mySPi?cRR_ D1o(Gh diff --git a/core/src/components/select/test/custom/select.e2e.ts b/core/src/components/select/test/custom/select.e2e.ts index 58232365170..884fcda47ca 100644 --- a/core/src/components/select/test/custom/select.e2e.ts +++ b/core/src/components/select/test/custom/select.e2e.ts @@ -72,5 +72,91 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => { const wrapper = page.locator('.wrapper'); await expect(wrapper).toHaveScreenshot(screenshot(`select-custom-parts-diff`)); }); + + test('should render custom cancel text when prop is provided with alert interface', async ({ page }) => { + await page.setContent( + ` + + Apples + Bananas + Oranges + + `, + config + ); + + const select = page.locator('ion-select'); + const ionAlertDidPresent = await page.spyOnEvent('ionAlertDidPresent'); + + await select.click(); + await ionAlertDidPresent.next(); + + await page.waitForChanges(); + + const alert = page.locator('ion-alert'); + const cancelButton = alert.locator('.alert-button-role-cancel'); + + // Verify the cancel button text + await expect(cancelButton).toHaveText('Close me'); + }); + + test('should render custom cancel text when prop is provided with action sheet interface', async ({ page }) => { + await page.setContent( + ` + + Apples + Bananas + Oranges + + `, + config + ); + + const select = page.locator('ion-select'); + const ionActionSheetDidPresent = await page.spyOnEvent('ionActionSheetDidPresent'); + + await select.click(); + await ionActionSheetDidPresent.next(); + + await page.waitForChanges(); + + const actionSheet = page.locator('ion-action-sheet'); + const cancelButton = actionSheet.locator('.action-sheet-cancel'); + + // Verify the cancel button text + await expect(cancelButton).toHaveText('Close me'); + }); + + test('should render custom cancel text when prop is provided with modal interface', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30295', + }); + + await page.setContent( + ` + + Apples + Bananas + Oranges + + `, + config + ); + + const select = page.locator('ion-select'); + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + await select.click(); + await ionModalDidPresent.next(); + + await page.waitForChanges(); + + const modal = page.locator('ion-modal'); + const cancelButton = modal.locator('ion-button'); + + // Verify the cancel button text + await expect(cancelButton).toHaveText('Close me'); + }); }); }); diff --git a/packages/angular/src/directives/proxies.ts b/packages/angular/src/directives/proxies.ts index c81ac8f8571..beaf411cec5 100644 --- a/packages/angular/src/directives/proxies.ts +++ b/packages/angular/src/directives/proxies.ts @@ -2192,14 +2192,14 @@ This event will not emit when programmatically setting the `value` property. @ProxyCmp({ - inputs: ['header', 'multiple', 'options'] + inputs: ['cancelText', 'header', 'multiple', 'options'] }) @Component({ selector: 'ion-select-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: '', // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property - inputs: ['header', 'multiple', 'options'], + inputs: ['cancelText', 'header', 'multiple', 'options'], }) export class IonSelectModal { protected el: HTMLIonSelectModalElement; diff --git a/packages/angular/standalone/src/directives/proxies.ts b/packages/angular/standalone/src/directives/proxies.ts index 93f9bf10c86..2fa0482d3d6 100644 --- a/packages/angular/standalone/src/directives/proxies.ts +++ b/packages/angular/standalone/src/directives/proxies.ts @@ -1921,14 +1921,14 @@ export declare interface IonSegmentView extends Components.IonSegmentView { @ProxyCmp({ defineCustomElementFn: defineIonSelectModal, - inputs: ['header', 'multiple', 'options'] + inputs: ['cancelText', 'header', 'multiple', 'options'] }) @Component({ selector: 'ion-select-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: '', // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property - inputs: ['header', 'multiple', 'options'], + inputs: ['cancelText', 'header', 'multiple', 'options'], standalone: true }) export class IonSelectModal { diff --git a/packages/vue/src/proxies.ts b/packages/vue/src/proxies.ts index a0c23232908..72e22d2c7b4 100644 --- a/packages/vue/src/proxies.ts +++ b/packages/vue/src/proxies.ts @@ -947,6 +947,7 @@ export const IonSelect: StencilVueComponent = /*@__PURE__*/ defineContainer('ion-select-modal', defineIonSelectModal, [ 'header', + 'cancelText', 'multiple', 'options' ]); From 46806bd6e2af90a0b31fca68f508c06d3d281ec0 Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Tue, 10 Feb 2026 09:59:24 -0500 Subject: [PATCH 24/55] feat(segment-view): add swipeGesture property to disable swiping (#30948) Issue number: resolves #30290 --------- ## What is the current behavior? The segment view swipe gesture can only be disabled by adding the `disabled` property and setting `opacity: 1`. ## What is the new behavior? - Adds a new property, `swipeGesture`, to disable swiping on the segment view - Adds an e2e test which verifies the styles blocking the swipe are correctly applied when `swipeGesture` is `false` ## Does this introduce a breaking change? - [ ] Yes - [x] No --------- Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- core/api.txt | 1 + core/src/components.d.ts | 10 ++ .../components/segment-view/segment-view.scss | 3 +- .../components/segment-view/segment-view.tsx | 8 +- .../test/swipe-gesture/index.html | 147 ++++++++++++++++++ .../test/swipe-gesture/segment-view.e2e.ts | 51 ++++++ packages/angular/src/directives/proxies.ts | 4 +- .../standalone/src/directives/proxies.ts | 4 +- packages/vue/src/proxies.ts | 1 + 9 files changed, 223 insertions(+), 6 deletions(-) create mode 100644 core/src/components/segment-view/test/swipe-gesture/index.html create mode 100644 core/src/components/segment-view/test/swipe-gesture/segment-view.e2e.ts diff --git a/core/api.txt b/core/api.txt index b4036e6b8e8..43e95807d4c 100644 --- a/core/api.txt +++ b/core/api.txt @@ -1693,6 +1693,7 @@ ion-segment-content,shadow ion-segment-view,shadow ion-segment-view,prop,disabled,boolean,false,false,false +ion-segment-view,prop,swipeGesture,boolean,true,false,false ion-segment-view,event,ionSegmentViewScroll,SegmentViewScrollEvent,true ion-select,shadow diff --git a/core/src/components.d.ts b/core/src/components.d.ts index ae6d9f4c2fb..d690184aff6 100644 --- a/core/src/components.d.ts +++ b/core/src/components.d.ts @@ -3113,6 +3113,11 @@ export namespace Components { * @param smoothScroll : Whether to animate the scroll transition. */ "setContent": (id: string, smoothScroll?: boolean) => Promise; + /** + * If `true`, users will be able to swipe the segment view to navigate between segment contents. + * @default true + */ + "swipeGesture": boolean; } interface IonSelect { /** @@ -8424,6 +8429,11 @@ declare namespace LocalJSX { * Emitted when the segment view is scrolled. */ "onIonSegmentViewScroll"?: (event: IonSegmentViewCustomEvent) => void; + /** + * If `true`, users will be able to swipe the segment view to navigate between segment contents. + * @default true + */ + "swipeGesture"?: boolean; } interface IonSelect { /** diff --git a/core/src/components/segment-view/segment-view.scss b/core/src/components/segment-view/segment-view.scss index a41030992f6..52210425a63 100644 --- a/core/src/components/segment-view/segment-view.scss +++ b/core/src/components/segment-view/segment-view.scss @@ -21,7 +21,8 @@ display: none; } -:host(.segment-view-disabled) { +:host(.segment-view-disabled), +:host(.segment-view-swipe-disabled) { touch-action: none; overflow-x: hidden; } diff --git a/core/src/components/segment-view/segment-view.tsx b/core/src/components/segment-view/segment-view.tsx index 21de96590a3..a503b5e2637 100644 --- a/core/src/components/segment-view/segment-view.tsx +++ b/core/src/components/segment-view/segment-view.tsx @@ -23,6 +23,11 @@ export class SegmentView implements ComponentInterface { */ @Prop() disabled = false; + /** + * If `true`, users will be able to swipe the segment view to navigate between segment contents. + */ + @Prop() swipeGesture = true; + /** * @internal * @@ -141,13 +146,14 @@ export class SegmentView implements ComponentInterface { } render() { - const { disabled, isManualScroll } = this; + const { disabled, isManualScroll, swipeGesture } = this; return ( diff --git a/core/src/components/segment-view/test/swipe-gesture/index.html b/core/src/components/segment-view/test/swipe-gesture/index.html new file mode 100644 index 00000000000..8a5c39b6cc2 --- /dev/null +++ b/core/src/components/segment-view/test/swipe-gesture/index.html @@ -0,0 +1,147 @@ + + + + + Segment View - Swipe Gesture + + + + + + + + + + + + + + + Segment View - Swipe Gesture + + + + +

+ Swipe Gesture: Segment Enabled; Segment View + Enabled +

+ + + Paid + + + Free + + + Top + + + + + Free + Top + + +

+ Swipe Gesture: Segment Disabled; Segment View + Enabled +

+ + + Paid + + + Free + + + Top + + + + Paid + Free + Top + + +

+ Swipe Gesture: Segment Enabled; Segment View + Disabled +

+ + + Paid + + + Free + + + Top + + + + Paid + Free + Top + + +

+ Swipe Gesture: Segment Disabled; Segment View + Disabled +

+ + + Paid + + + Free + + + Top + + + + Paid + Free + Top + + + + + diff --git a/core/src/components/segment-view/test/swipe-gesture/segment-view.e2e.ts b/core/src/components/segment-view/test/swipe-gesture/segment-view.e2e.ts new file mode 100644 index 00000000000..f250cb142db --- /dev/null +++ b/core/src/components/segment-view/test/swipe-gesture/segment-view.e2e.ts @@ -0,0 +1,51 @@ +import { expect } from '@playwright/test'; +import { configs, test } from '@utils/test/playwright'; + +/** + * This behavior does not vary across modes/directions + */ +configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => { + test.describe(title('segment-view: swipe gesture'), () => { + test('should allow swiping the segment view by default', async ({ page }) => { + await page.setContent( + ` + + + Free + Top + + `, + config + ); + + const segmentView = page.locator('ion-segment-view'); + + const allowsSwipe = await segmentView.evaluate((el: HTMLElement) => { + const style = getComputedStyle(el); + return style.overflowX !== 'hidden' && style.touchAction !== 'none'; + }); + expect(allowsSwipe).toBe(true); + }); + + test('should not allow swiping the segment view when swipeGesture is false', async ({ page }) => { + await page.setContent( + ` + + + Free + Top + + `, + config + ); + + const segmentView = page.locator('ion-segment-view'); + + const allowsSwipe = await segmentView.evaluate((el: HTMLElement) => { + const style = getComputedStyle(el); + return style.overflowX !== 'hidden' && style.touchAction !== 'none'; + }); + expect(allowsSwipe).toBe(false); + }); + }); +}); diff --git a/packages/angular/src/directives/proxies.ts b/packages/angular/src/directives/proxies.ts index beaf411cec5..d5b1a91baca 100644 --- a/packages/angular/src/directives/proxies.ts +++ b/packages/angular/src/directives/proxies.ts @@ -2113,14 +2113,14 @@ export declare interface IonSegmentContent extends Components.IonSegmentContent @ProxyCmp({ - inputs: ['disabled'] + inputs: ['disabled', 'swipeGesture'] }) @Component({ selector: 'ion-segment-view', changeDetection: ChangeDetectionStrategy.OnPush, template: '', // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property - inputs: ['disabled'], + inputs: ['disabled', 'swipeGesture'], }) export class IonSegmentView { protected el: HTMLIonSegmentViewElement; diff --git a/packages/angular/standalone/src/directives/proxies.ts b/packages/angular/standalone/src/directives/proxies.ts index 2fa0482d3d6..3d2693c0b83 100644 --- a/packages/angular/standalone/src/directives/proxies.ts +++ b/packages/angular/standalone/src/directives/proxies.ts @@ -1889,14 +1889,14 @@ export declare interface IonSegmentContent extends Components.IonSegmentContent @ProxyCmp({ defineCustomElementFn: defineIonSegmentView, - inputs: ['disabled'] + inputs: ['disabled', 'swipeGesture'] }) @Component({ selector: 'ion-segment-view', changeDetection: ChangeDetectionStrategy.OnPush, template: '', // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property - inputs: ['disabled'], + inputs: ['disabled', 'swipeGesture'], standalone: true }) export class IonSegmentView { diff --git a/packages/vue/src/proxies.ts b/packages/vue/src/proxies.ts index 72e22d2c7b4..31d13970a4c 100644 --- a/packages/vue/src/proxies.ts +++ b/packages/vue/src/proxies.ts @@ -899,6 +899,7 @@ export const IonSegmentContent: StencilVueComponent = /*@ export const IonSegmentView: StencilVueComponent = /*@__PURE__*/ defineContainer('ion-segment-view', defineIonSegmentView, [ 'disabled', + 'swipeGesture', 'ionSegmentViewScroll' ], [ 'ionSegmentViewScroll' From 55735df3fa62c8e259c56db3169f3d5459e71c0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bengt=20Wei=C3=9Fe?= Date: Wed, 11 Feb 2026 01:24:39 +0100 Subject: [PATCH 25/55] feat(textarea): reflect disabled and readonly props (#30910) Co-authored-by: Maria Hutt --- core/api.txt | 4 +- core/src/components/textarea/textarea.tsx | 4 +- .../test/base/e2e/src/lazy/inputs.spec.ts | 211 ++++++++++-------- .../base/e2e/src/standalone/inputs.spec.ts | 28 +++ .../src/app/lazy/inputs/inputs.component.html | 28 ++- .../src/app/lazy/inputs/inputs.component.ts | 17 ++ .../standalone/app-standalone/app.routes.ts | 1 + .../home-page/home-page.component.html | 5 + .../standalone/inputs/inputs.component.html | 79 +++++++ .../app/standalone/inputs/inputs.component.ts | 80 +++++++ packages/react/test/base/src/pages/Inputs.tsx | 34 ++- .../tests/e2e/specs/components/inputs.cy.ts | 103 +++++---- packages/vue/test/base/src/views/Inputs.vue | 46 ++-- .../test/base/tests/e2e/specs/inputs.cy.js | 98 ++++---- 14 files changed, 532 insertions(+), 206 deletions(-) create mode 100644 packages/angular/test/base/e2e/src/standalone/inputs.spec.ts create mode 100644 packages/angular/test/base/src/app/standalone/inputs/inputs.component.html create mode 100644 packages/angular/test/base/src/app/standalone/inputs/inputs.component.ts diff --git a/core/api.txt b/core/api.txt index 43e95807d4c..cec14576248 100644 --- a/core/api.txt +++ b/core/api.txt @@ -1876,7 +1876,7 @@ ion-textarea,prop,cols,number | undefined,undefined,false,true ion-textarea,prop,counter,boolean,false,false,false ion-textarea,prop,counterFormatter,((inputLength: number, maxLength: number) => string) | undefined,undefined,false,false ion-textarea,prop,debounce,number | undefined,undefined,false,false -ion-textarea,prop,disabled,boolean,false,false,false +ion-textarea,prop,disabled,boolean,false,false,true ion-textarea,prop,enterkeyhint,"done" | "enter" | "go" | "next" | "previous" | "search" | "send" | undefined,undefined,false,false ion-textarea,prop,errorText,string | undefined,undefined,false,false ion-textarea,prop,fill,"outline" | "solid" | undefined,undefined,false,false @@ -1889,7 +1889,7 @@ ion-textarea,prop,minlength,number | undefined,undefined,false,false ion-textarea,prop,mode,"ios" | "md",undefined,false,false ion-textarea,prop,name,string,this.inputId,false,false ion-textarea,prop,placeholder,string | undefined,undefined,false,false -ion-textarea,prop,readonly,boolean,false,false,false +ion-textarea,prop,readonly,boolean,false,false,true ion-textarea,prop,required,boolean,false,false,false ion-textarea,prop,rows,number | undefined,undefined,false,false ion-textarea,prop,shape,"round" | undefined,undefined,false,false diff --git a/core/src/components/textarea/textarea.tsx b/core/src/components/textarea/textarea.tsx index 89646f6a247..ea5fa464186 100644 --- a/core/src/components/textarea/textarea.tsx +++ b/core/src/components/textarea/textarea.tsx @@ -132,7 +132,7 @@ export class Textarea implements ComponentInterface { /** * If `true`, the user cannot interact with the textarea. */ - @Prop() disabled = false; + @Prop({ reflect: true }) disabled = false; /** * The fill for the item. If `"solid"` the item will have a background. If @@ -177,7 +177,7 @@ export class Textarea implements ComponentInterface { /** * If `true`, the user cannot modify the value. */ - @Prop() readonly = false; + @Prop({ reflect: true }) readonly = false; /** * If `true`, the user must fill in a value before submitting a form. diff --git a/packages/angular/test/base/e2e/src/lazy/inputs.spec.ts b/packages/angular/test/base/e2e/src/lazy/inputs.spec.ts index fdf2b38adc4..d8b8b4919bd 100644 --- a/packages/angular/test/base/e2e/src/lazy/inputs.spec.ts +++ b/packages/angular/test/base/e2e/src/lazy/inputs.spec.ts @@ -5,105 +5,126 @@ test.describe('Inputs', () => { await page.goto('/lazy/inputs'); }); - test('should have default values', async ({ page }) => { - // Check primary elements for default values - await expect(page.locator('ion-checkbox').first()).toHaveJSProperty('checked', true); - await expect(page.locator('ion-radio-group').first()).toHaveJSProperty('value', 'nes'); - await expect(page.locator('ion-toggle').first()).toHaveJSProperty('checked', true); - await expect(page.locator('ion-input').first()).toHaveJSProperty('value', 'some text'); - await expect(page.locator('ion-input-otp').first()).toHaveJSProperty('value', '1234'); - await expect(page.locator('ion-datetime').first()).toHaveJSProperty('value', '1994-03-15'); - await expect(page.locator('ion-select').first()).toHaveJSProperty('value', 'nes'); - await expect(page.locator('ion-range').first()).toHaveJSProperty('value', 50); - }); + test.describe('basic functionality', () => { + test('should have default values', async ({ page }) => { + // Check primary elements for default values + await expect(page.locator('ion-checkbox').first()).toHaveJSProperty('checked', true); + await expect(page.locator('ion-radio-group').first()).toHaveJSProperty('value', 'nes'); + await expect(page.locator('ion-toggle').first()).toHaveJSProperty('checked', true); + await expect(page.locator('ion-input').first()).toHaveJSProperty('value', 'some text'); + await expect(page.locator('ion-input-otp').first()).toHaveJSProperty('value', '1234'); + await expect(page.locator('ion-datetime').first()).toHaveJSProperty('value', '1994-03-15'); + await expect(page.locator('ion-select').first()).toHaveJSProperty('value', 'nes'); + await expect(page.locator('ion-range').first()).toHaveJSProperty('value', 50); + }); - test('should reset values', async ({ page }) => { - await page.locator('#reset-button').click(); - - // Check primary elements after reset - await expect(page.locator('ion-checkbox').first()).toHaveJSProperty('checked', false); - await expect(page.locator('ion-radio-group').first()).toHaveJSProperty('value', undefined); - await expect(page.locator('ion-toggle').first()).toHaveJSProperty('checked', false); - /** - * The `value` property gets set to undefined - * for these components, so we need to check - * that the value property is undefined. - */ - await expect(page.locator('ion-input').first()).toHaveJSProperty('value', undefined); - await expect(page.locator('ion-input-otp').first()).toHaveJSProperty('value', undefined); - await expect(page.locator('ion-datetime').first()).toHaveJSProperty('value', undefined); - await expect(page.locator('ion-select').first()).toHaveJSProperty('value', undefined); - await expect(page.locator('ion-range').first()).toHaveJSProperty('value', undefined); - }); + test('should reset values', async ({ page }) => { + await page.locator('#reset-button').click(); + + // Check primary elements after reset + await expect(page.locator('ion-checkbox').first()).toHaveJSProperty('checked', false); + await expect(page.locator('ion-radio-group').first()).toHaveJSProperty('value', undefined); + await expect(page.locator('ion-toggle').first()).toHaveJSProperty('checked', false); + /** + * The `value` property gets set to undefined + * for these components, so we need to check + * that the value property is undefined. + */ + await expect(page.locator('ion-input').first()).toHaveJSProperty('value', undefined); + await expect(page.locator('ion-input-otp').first()).toHaveJSProperty('value', undefined); + await expect(page.locator('ion-datetime').first()).toHaveJSProperty('value', undefined); + await expect(page.locator('ion-select').first()).toHaveJSProperty('value', undefined); + await expect(page.locator('ion-range').first()).toHaveJSProperty('value', undefined); + }); - test('should set values', async ({ page }) => { - await page.locator('#reset-button').click(); - await page.locator('#set-button').click(); - - // Check primary elements after setting values - await expect(page.locator('ion-checkbox').first()).toHaveJSProperty('checked', true); - await expect(page.locator('ion-radio-group').first()).toHaveJSProperty('value', 'nes'); - await expect(page.locator('ion-toggle').first()).toHaveJSProperty('checked', true); - await expect(page.locator('ion-input').first()).toHaveJSProperty('value', 'some text'); - await expect(page.locator('ion-input-otp').first()).toHaveJSProperty('value', '1234'); - await expect(page.locator('ion-datetime').first()).toHaveJSProperty('value', '1994-03-15'); - await expect(page.locator('ion-select').first()).toHaveJSProperty('value', 'nes'); - await expect(page.locator('ion-range').first()).toHaveJSProperty('value', 50); - }); + test('should set values', async ({ page }) => { + await page.locator('#reset-button').click(); + await page.locator('#set-button').click(); + + // Check primary elements after setting values + await expect(page.locator('ion-checkbox').first()).toHaveJSProperty('checked', true); + await expect(page.locator('ion-radio-group').first()).toHaveJSProperty('value', 'nes'); + await expect(page.locator('ion-toggle').first()).toHaveJSProperty('checked', true); + await expect(page.locator('ion-input').first()).toHaveJSProperty('value', 'some text'); + await expect(page.locator('ion-input-otp').first()).toHaveJSProperty('value', '1234'); + await expect(page.locator('ion-datetime').first()).toHaveJSProperty('value', '1994-03-15'); + await expect(page.locator('ion-select').first()).toHaveJSProperty('value', 'nes'); + await expect(page.locator('ion-range').first()).toHaveJSProperty('value', 50); + }); - test('should update angular when values change', async ({ page }) => { - await page.locator('#reset-button').click(); - - await page.locator('ion-checkbox#first-checkbox').click(); - await page.locator('ion-radio').first().click(); - await page.locator('ion-toggle').first().click(); - - await page.locator('ion-input').nth(0).locator('input').fill('hola'); - await page.locator('ion-input').nth(0).locator('input').blur(); - - await page.locator('ion-input-otp input').nth(0).fill('1'); - await page.locator('ion-input-otp input').nth(1).fill('2'); - await page.locator('ion-input-otp input').nth(2).fill('3'); - await page.locator('ion-input-otp input').nth(3).fill('4'); - await page.locator('ion-input-otp input').nth(3).blur(); - - // Set date to 1994-03-14 - await page.locator('ion-datetime').first().click(); - await page.locator('ion-datetime').first().locator('.calendar-day:not([disabled])').first().click(); - - await page.locator('ion-select#game-console').click(); - await expect(page.locator('ion-alert')).toBeVisible(); - // Playstation option - await page.locator('ion-alert .alert-radio-button').nth(3).click(); - // Click confirm button - await page.locator('ion-alert .alert-button:not(.alert-button-role-cancel)').click(); - - // Check note text (Angular binding updates) - await expect(page.locator('#checkbox-note')).toHaveText('true'); - await expect(page.locator('#radio-note')).toHaveText('nes'); - await expect(page.locator('#toggle-note')).toHaveText('true'); - await expect(page.locator('#input-note')).toHaveText('hola'); - await expect(page.locator('#input-otp-note')).toHaveText('1234'); - await expect(page.locator('#datetime-note')).toHaveText('1994-03-14'); - await expect(page.locator('#select-note')).toHaveText('ps'); - }); + test('should update angular when values change', async ({ page }) => { + await page.locator('#reset-button').click(); - test('should update values when erasing input', async ({ page }) => { - // Focus the input and press backspace to remove last character - await page.locator('ion-input').nth(0).locator('input').click(); - await page.locator('ion-input').nth(0).locator('input').press('Backspace'); - // Check mirror element reflects the change - await expect(page.locator('ion-input').nth(1)).toHaveJSProperty('value', 'some tex'); - // Check note text (Angular binding) - await expect(page.locator('#input-note')).toHaveText('some tex'); - - // Focus the last OTP input and press backspace - await page.locator('ion-input-otp input').last().click(); - await page.locator('ion-input-otp input').last().press('Backspace'); - // Check mirror element reflects the change - await expect(page.locator('ion-input-otp').nth(1)).toHaveJSProperty('value', '123'); - // Check note text (Angular binding) - await expect(page.locator('#input-otp-note')).toHaveText('123'); + await page.locator('ion-checkbox#first-checkbox').click(); + await page.locator('ion-radio').first().click(); + await page.locator('ion-toggle').first().click(); + + await page.locator('ion-input').nth(0).locator('input').fill('hola'); + await page.locator('ion-input').nth(0).locator('input').blur(); + + await page.locator('ion-input-otp input').nth(0).fill('1'); + await page.locator('ion-input-otp input').nth(1).fill('2'); + await page.locator('ion-input-otp input').nth(2).fill('3'); + await page.locator('ion-input-otp input').nth(3).fill('4'); + await page.locator('ion-input-otp input').nth(3).blur(); + + // Set date to 1994-03-14 + await page.locator('ion-datetime').first().click(); + await page.locator('ion-datetime').first().locator('.calendar-day:not([disabled])').first().click(); + + await page.locator('ion-select#game-console').click(); + await expect(page.locator('ion-alert')).toBeVisible(); + // Playstation option + await page.locator('ion-alert .alert-radio-button').nth(3).click(); + // Click confirm button + await page.locator('ion-alert .alert-button:not(.alert-button-role-cancel)').click(); + + // Check note text (Angular binding updates) + await expect(page.locator('#checkbox-note')).toHaveText('true'); + await expect(page.locator('#radio-note')).toHaveText('nes'); + await expect(page.locator('#toggle-note')).toHaveText('true'); + await expect(page.locator('#input-note')).toHaveText('hola'); + await expect(page.locator('#input-otp-note')).toHaveText('1234'); + await expect(page.locator('#datetime-note')).toHaveText('1994-03-14'); + await expect(page.locator('#select-note')).toHaveText('ps'); + }); + + test('should update values when erasing input', async ({ page }) => { + // Focus the input and press backspace to remove last character + await page.locator('ion-input').nth(0).locator('input').click(); + await page.locator('ion-input').nth(0).locator('input').press('Backspace'); + // Check mirror element reflects the change + await expect(page.locator('ion-input').nth(1)).toHaveJSProperty('value', 'some tex'); + // Check note text (Angular binding) + await expect(page.locator('#input-note')).toHaveText('some tex'); + + // Focus the last OTP input and press backspace + await page.locator('ion-input-otp input').last().click(); + await page.locator('ion-input-otp input').last().press('Backspace'); + // Check mirror element reflects the change + await expect(page.locator('ion-input-otp').nth(1)).toHaveJSProperty('value', '123'); + // Check note text (Angular binding) + await expect(page.locator('#input-otp-note')).toHaveText('123'); + }); + + test('should reflect props when component has a default value', async ({ page }) => { + // Disable inputs + await page.locator('#disable-button').click(); + + // Disabled prop + await expect(page.locator('ion-input').first()).toHaveAttribute('disabled', ''); + await expect(page.locator('ion-input-otp').first()).toHaveAttribute('disabled', ''); + await expect(page.locator('ion-textarea').first()).toHaveAttribute('disabled', ''); + + // Reset disabled state and set readonly state + await page.locator('#disable-button').click(); + await page.locator('#readonly-button').click(); + + // Readonly prop + await expect(page.locator('ion-input').first()).toHaveAttribute('readonly', ''); + await expect(page.locator('ion-input-otp').first()).toHaveAttribute('readonly', ''); + await expect(page.locator('ion-textarea').first()).toHaveAttribute('readonly', ''); + }); }); test.describe('updating text input refs', () => { diff --git a/packages/angular/test/base/e2e/src/standalone/inputs.spec.ts b/packages/angular/test/base/e2e/src/standalone/inputs.spec.ts new file mode 100644 index 00000000000..b5b17496ee2 --- /dev/null +++ b/packages/angular/test/base/e2e/src/standalone/inputs.spec.ts @@ -0,0 +1,28 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Inputs', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/standalone/inputs'); + }); + + test.describe('basic functionality', () => { + test('should reflect props when component has a default value', async ({ page }) => { + // Disable inputs + await page.locator('#disable-button').click(); + + // Disabled prop + await expect(page.locator('ion-input')).toHaveAttribute('disabled', ''); + await expect(page.locator('ion-input-otp')).toHaveAttribute('disabled', ''); + await expect(page.locator('ion-textarea')).toHaveAttribute('disabled', ''); + + // Reset disabled state and set readonly state + await page.locator('#disable-button').click(); + await page.locator('#readonly-button').click(); + + // Readonly prop + await expect(page.locator('ion-input')).toHaveAttribute('readonly', ''); + await expect(page.locator('ion-input-otp')).toHaveAttribute('readonly', ''); + await expect(page.locator('ion-textarea')).toHaveAttribute('readonly', ''); + }); + }); +}); diff --git a/packages/angular/test/base/src/app/lazy/inputs/inputs.component.html b/packages/angular/test/base/src/app/lazy/inputs/inputs.component.html index c63e1c2792e..728406e3909 100644 --- a/packages/angular/test/base/src/app/lazy/inputs/inputs.component.html +++ b/packages/angular/test/base/src/app/lazy/inputs/inputs.component.html @@ -11,18 +11,18 @@ DateTime - + {{datetime}} DateTime Mirror - + {{datetime}} - + No Game Console NES Nintendo64 @@ -48,7 +48,7 @@ - + Toggle {{toggle}} @@ -62,27 +62,27 @@ - + {{input}} - + {{input}} - Input OTP + Input OTP {{inputOtp}} - Input OTP Mirror + Input OTP Mirror {{inputOtp}} - + Checkbox {{checkbox}} @@ -97,7 +97,7 @@ - Radio + Radio {{radio}} @@ -110,14 +110,20 @@ - + Range + + + +

Set values Reset values + Toggle Disabled + Toggle Readonly

diff --git a/packages/angular/test/base/src/app/lazy/inputs/inputs.component.ts b/packages/angular/test/base/src/app/lazy/inputs/inputs.component.ts index e53f73948c3..fb04b7d1467 100644 --- a/packages/angular/test/base/src/app/lazy/inputs/inputs.component.ts +++ b/packages/angular/test/base/src/app/lazy/inputs/inputs.component.ts @@ -16,6 +16,11 @@ export class InputsComponent { select? = 'nes'; changes = 0; range? = 50; + textarea? = 'some text'; + + // States + isDisabled = false; + isReadonly = false; setValues() { console.log('set values'); @@ -27,6 +32,7 @@ export class InputsComponent { this.toggle = true; this.select = 'nes'; this.range = 50; + this.textarea = 'some text'; } resetValues() { @@ -39,6 +45,17 @@ export class InputsComponent { this.toggle = false; this.select = undefined; this.range = undefined; + this.textarea = undefined; + } + + toggleDisable() { + console.log(`toggle disable to ${!this.isDisabled}`); + this.isDisabled = !this.isDisabled; + } + + toggleReadonly() { + console.log(`toggle readonly to ${!this.isReadonly}`); + this.isReadonly = !this.isReadonly; } counter() { 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 197563dfb32..a12903f57d3 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 @@ -7,6 +7,7 @@ export const routes: Routes = [ component: AppComponent, children: [ { path: '', loadComponent: () => import('../home-page/home-page.component').then(c => c.HomePageComponent) }, + { path: 'inputs', loadComponent: () => import('../inputs/inputs.component').then(c => c.InputsComponent) }, { 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) }, diff --git a/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html b/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html index 058cec23c09..9bc81f2433e 100644 --- a/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html +++ b/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html @@ -28,6 +28,11 @@ Icon Test + + + Inputs Test + + Reorder Group Test diff --git a/packages/angular/test/base/src/app/standalone/inputs/inputs.component.html b/packages/angular/test/base/src/app/standalone/inputs/inputs.component.html new file mode 100644 index 00000000000..16e02b5d4a4 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/inputs/inputs.component.html @@ -0,0 +1,79 @@ + + + + Inputs test + + + + +
+ + + DateTime + + {{form.value.datetime}} + + + + + No Game Console + NES + Nintendo64 + PlayStation + Sega Genesis + Sega Saturn + SNES + + {{form.value.select}} + + + + + Toggle + + {{form.value.toggle}} + + + + + {{form.value.input}} + + + + Input OTP + {{form.value.inputOtp}} + + + + + Checkbox + + {{form.value.checkbox}} + + + + + Radio + + {{form.value.radio}} + + + + + Range + + + + + + + + +
+

+ Set values + Reset values + Toggle Disabled + Toggle Readonly +

+
diff --git a/packages/angular/test/base/src/app/standalone/inputs/inputs.component.ts b/packages/angular/test/base/src/app/standalone/inputs/inputs.component.ts new file mode 100644 index 00000000000..0fa0fc83ce6 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/inputs/inputs.component.ts @@ -0,0 +1,80 @@ +import { Component } from '@angular/core'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { + IonHeader, IonToolbar, IonTitle, IonContent, IonList, IonItem, + IonLabel, IonDatetime, IonNote, IonSelect, IonSelectOption, + IonToggle, IonInput, IonInputOtp, IonCheckbox, IonRadioGroup, + IonRadio, IonRange, IonTextarea, IonButton +} from '@ionic/angular/standalone'; + +@Component({ + selector: 'app-inputs', + templateUrl: './inputs.component.html', + standalone: true, + imports: [ + ReactiveFormsModule, + IonHeader, IonToolbar, IonTitle, IonContent, IonList, IonItem, + IonLabel, IonDatetime, IonNote, IonSelect, IonSelectOption, + IonToggle, IonInput, IonInputOtp, IonCheckbox, IonRadioGroup, + IonRadio, IonRange, IonTextarea, IonButton + ], +}) +export class InputsComponent { + // Create the FormGroup + form = new FormGroup({ + datetime: new FormControl('1994-03-15'), + input: new FormControl('some text'), + inputOtp: new FormControl('1234'), + checkbox: new FormControl(true), + radio: new FormControl('nes'), + toggle: new FormControl(true), + select: new FormControl('nes'), + range: new FormControl(50), + textarea: new FormControl('some text'), + }); + + // States + isDisabled = false; + isReadonly = false; + + setValues() { + console.log('set values'); + this.form.patchValue({ + datetime: '1994-03-15', + input: 'some text', + inputOtp: '1234', + checkbox: true, + radio: 'nes', + toggle: true, + select: 'nes', + range: 50, + textarea: 'some text', + }); + } + + resetValues() { + console.log('reset values'); + // reset them each + this.form.patchValue({ + datetime: undefined, + input: undefined, + inputOtp: undefined, + checkbox: false, + radio: undefined, + toggle: false, + select: undefined, + range: undefined, + textarea: undefined, + }); + } + + toggleDisable() { + console.log(`toggle disable to ${!this.isDisabled}`); + this.isDisabled = !this.isDisabled; + } + + toggleReadonly() { + console.log(`toggle readonly to ${!this.isReadonly}`); + this.isReadonly = !this.isReadonly; + } +} diff --git a/packages/react/test/base/src/pages/Inputs.tsx b/packages/react/test/base/src/pages/Inputs.tsx index 7e5db11b5de..47ac3ac5328 100644 --- a/packages/react/test/base/src/pages/Inputs.tsx +++ b/packages/react/test/base/src/pages/Inputs.tsx @@ -66,6 +66,10 @@ const Inputs: React.FC = () => { const [segment, setSegment] = useState('dogs'); const [select, setSelect] = useState('apples'); + // States + const [isDisabled, setIsDisabled] = useState(false); + const [isReadonly, setIsReadonly] = useState(false); + const reset = () => { setCheckbox(false); setToggle(false); @@ -94,6 +98,14 @@ const Inputs: React.FC = () => { setSelect('bananas'); }; + const toggleDisable = () => { + setIsDisabled(!isDisabled); + }; + + const toggleReadonly = () => { + setIsReadonly(!isReadonly); + }; + return ( @@ -109,6 +121,7 @@ const Inputs: React.FC = () => { onIonChange={(e: IonSegmentCustomEvent) => { if (typeof e.detail.value === 'string') setSegment(e.detail.value); }} + disabled={isDisabled} > Dogs @@ -122,6 +135,7 @@ const Inputs: React.FC = () => { ) => setSearchbar(e.detail.value!)} + disabled={isDisabled} > @@ -137,6 +151,7 @@ const Inputs: React.FC = () => { ) => setCheckbox(e.detail.checked)} + disabled={isDisabled} > Checkbox @@ -146,6 +161,7 @@ const Inputs: React.FC = () => { ) => setToggle(e.detail.checked)} + disabled={isDisabled} > Toggle @@ -156,6 +172,8 @@ const Inputs: React.FC = () => { value={input} onIonInput={(e: IonInputCustomEvent) => setInput(e.detail.value!)} label="Input" + disabled={isDisabled} + readonly={isReadonly} > @@ -163,6 +181,8 @@ const Inputs: React.FC = () => { ) => setInputOtp(e.detail.value ?? '')} + disabled={isDisabled} + readonly={isReadonly} > @@ -174,6 +194,7 @@ const Inputs: React.FC = () => { max={100} value={range} onIonChange={(e: IonRangeCustomEvent) => setRange(e.detail.value as { lower: number; upper: number })} + disabled={isDisabled} > @@ -182,6 +203,8 @@ const Inputs: React.FC = () => { value={textarea} onIonInput={(e: IonTextareaCustomEvent) => setTextarea(e.detail.value!)} label="Textarea" + disabled={isDisabled} + readonly={isReadonly} > @@ -195,6 +218,8 @@ const Inputs: React.FC = () => { setDatetime(value); } }} + disabled={isDisabled} + readonly={isReadonly} > @@ -203,13 +228,13 @@ const Inputs: React.FC = () => { onIonChange={(e: IonRadioGroupCustomEvent) => setRadio(e.detail.value)} > - Red + Red - Green + Green - Blue + Blue @@ -218,6 +243,7 @@ const Inputs: React.FC = () => { value={select} onIonChange={(e: IonSelectCustomEvent>) => setSelect(e.detail.value)} label="Select" + disabled={isDisabled} > Apples Bananas @@ -241,6 +267,8 @@ const Inputs: React.FC = () => { Reset Values Set Values + Toggle Disabled + Toggle Readonly diff --git a/packages/react/test/base/tests/e2e/specs/components/inputs.cy.ts b/packages/react/test/base/tests/e2e/specs/components/inputs.cy.ts index b32468bd96e..55732f89cae 100644 --- a/packages/react/test/base/tests/e2e/specs/components/inputs.cy.ts +++ b/packages/react/test/base/tests/e2e/specs/components/inputs.cy.ts @@ -3,48 +3,69 @@ describe('Inputs', () => { cy.visit('/inputs') }) - it('should have default value', () => { - cy.get('ion-checkbox').should('have.prop', 'checked').and('eq', false); - cy.get('ion-toggle').should('have.prop', 'checked').and('eq', false); - cy.get('ion-input').should('have.prop', 'value').and('eq', ''); - cy.get('ion-input-otp').should('have.prop', 'value').and('eq', ''); - cy.get('ion-range').should('have.prop', 'value').and('deep.eq', { lower: 30, upper: 70 }); - cy.get('ion-textarea').should('have.prop', 'value').and('eq', ''); - cy.get('ion-searchbar').should('have.prop', 'value').and('eq', ''); - cy.get('ion-datetime').should('have.prop', 'value').and('eq', ''); - cy.get('ion-radio-group').should('have.prop', 'value').and('eq', 'red'); - cy.get('ion-segment').should('have.prop', 'value').and('eq', 'dogs'); - cy.get('ion-select').should('have.prop', 'value').and('eq', 'apples'); - }); + describe('basic functionality', () => { + it('should have default value', () => { + cy.get('ion-checkbox').should('have.prop', 'checked').and('eq', false); + cy.get('ion-toggle').should('have.prop', 'checked').and('eq', false); + cy.get('ion-input').should('have.prop', 'value').and('eq', ''); + cy.get('ion-input-otp').should('have.prop', 'value').and('eq', ''); + cy.get('ion-range').should('have.prop', 'value').and('deep.eq', { lower: 30, upper: 70 }); + cy.get('ion-textarea').should('have.prop', 'value').and('eq', ''); + cy.get('ion-searchbar').should('have.prop', 'value').and('eq', ''); + cy.get('ion-datetime').should('have.prop', 'value').and('eq', ''); + cy.get('ion-radio-group').should('have.prop', 'value').and('eq', 'red'); + cy.get('ion-segment').should('have.prop', 'value').and('eq', 'dogs'); + cy.get('ion-select').should('have.prop', 'value').and('eq', 'apples'); + }); + + it('should set/reset values', () => { + cy.get('ion-button#set').click(); - it('should set/reset values', () => { - cy.get('ion-button#set').click(); - - cy.get('ion-checkbox').should('have.prop', 'checked').and('eq', true); - cy.get('ion-toggle').should('have.prop', 'checked').and('eq', true); - cy.get('ion-input').should('have.prop', 'value').and('eq', 'Hello World'); - cy.get('ion-input-otp').should('have.prop', 'value').and('eq', '1234'); - cy.get('ion-range').should('have.prop', 'value').and('deep.eq', { lower: 10, upper: 90 }); - cy.get('ion-textarea').should('have.prop', 'value').and('eq', 'Lorem Ipsum'); - cy.get('ion-searchbar').should('have.prop', 'value').and('eq', 'Search Query'); - cy.get('ion-datetime').should('have.prop', 'value').and('eq', '2019-01-31'); - cy.get('ion-radio-group').should('have.prop', 'value').and('eq', 'blue'); - cy.get('ion-segment').should('have.prop', 'value').and('eq', 'cats'); - cy.get('ion-select').should('have.prop', 'value').and('eq', 'bananas'); - - cy.get('ion-button#reset').click(); - - cy.get('ion-checkbox').should('have.prop', 'checked').and('eq', false); - cy.get('ion-toggle').should('have.prop', 'checked').and('eq', false); - cy.get('ion-input').should('have.prop', 'value').and('eq', ''); - cy.get('ion-input-otp').should('have.prop', 'value').and('eq', ''); - cy.get('ion-range').should('have.prop', 'value').and('deep.eq', { lower: 30, upper: 70 }); - cy.get('ion-textarea').should('have.prop', 'value').and('eq', ''); - cy.get('ion-searchbar').should('have.prop', 'value').and('eq', ''); - cy.get('ion-datetime').should('have.prop', 'value').and('eq', ''); - cy.get('ion-radio-group').should('have.prop', 'value').and('eq', 'red'); - cy.get('ion-segment').should('have.prop', 'value').and('eq', 'dogs'); - cy.get('ion-select').should('have.prop', 'value').and('eq', 'apples'); + cy.get('ion-checkbox').should('have.prop', 'checked').and('eq', true); + cy.get('ion-toggle').should('have.prop', 'checked').and('eq', true); + cy.get('ion-input').should('have.prop', 'value').and('eq', 'Hello World'); + cy.get('ion-input-otp').should('have.prop', 'value').and('eq', '1234'); + cy.get('ion-range').should('have.prop', 'value').and('deep.eq', { lower: 10, upper: 90 }); + cy.get('ion-textarea').should('have.prop', 'value').and('eq', 'Lorem Ipsum'); + cy.get('ion-searchbar').should('have.prop', 'value').and('eq', 'Search Query'); + cy.get('ion-datetime').should('have.prop', 'value').and('eq', '2019-01-31'); + cy.get('ion-radio-group').should('have.prop', 'value').and('eq', 'blue'); + cy.get('ion-segment').should('have.prop', 'value').and('eq', 'cats'); + cy.get('ion-select').should('have.prop', 'value').and('eq', 'bananas'); + + cy.get('ion-button#reset').click(); + + cy.get('ion-checkbox').should('have.prop', 'checked').and('eq', false); + cy.get('ion-toggle').should('have.prop', 'checked').and('eq', false); + cy.get('ion-input').should('have.prop', 'value').and('eq', ''); + cy.get('ion-input-otp').should('have.prop', 'value').and('eq', ''); + cy.get('ion-range').should('have.prop', 'value').and('deep.eq', { lower: 30, upper: 70 }); + cy.get('ion-textarea').should('have.prop', 'value').and('eq', ''); + cy.get('ion-searchbar').should('have.prop', 'value').and('eq', ''); + cy.get('ion-datetime').should('have.prop', 'value').and('eq', ''); + cy.get('ion-radio-group').should('have.prop', 'value').and('eq', 'red'); + cy.get('ion-segment').should('have.prop', 'value').and('eq', 'dogs'); + cy.get('ion-select').should('have.prop', 'value').and('eq', 'apples'); + }); + + it('should reflect props when component has a default value', () => { + // Disable inputs + cy.get('ion-button#disable').click(); + + // Disabled prop + cy.get('ion-input').should('have.attr', 'disabled'); + cy.get('ion-input-otp').should('have.attr', 'disabled'); + cy.get('ion-textarea').should('have.attr', 'disabled'); + + // Reset disabled state and set readonly state + cy.get('ion-button#disable').click(); + cy.get('ion-button#readonly').click(); + + // Readonly prop + cy.get('ion-input').should('have.attr', 'readonly'); + cy.get('ion-input-otp').should('have.attr', 'readonly'); + cy.get('ion-textarea').should('have.attr', 'readonly'); + }); }); describe('updating text input refs', () => { diff --git a/packages/vue/test/base/src/views/Inputs.vue b/packages/vue/test/base/src/views/Inputs.vue index 28108f4f0dd..6bfe69984b2 100644 --- a/packages/vue/test/base/src/views/Inputs.vue +++ b/packages/vue/test/base/src/views/Inputs.vue @@ -8,7 +8,7 @@ Inputs - + Dogs @@ -18,7 +18,7 @@ - + @@ -30,48 +30,48 @@ - Checkbox + Checkbox - Toggle + Toggle - + - + - + - + Datetime - + - Red + Red - Green + Green - Blue + Blue - + Apples Bananas @@ -94,6 +94,8 @@ Reset Values Set Values + Toggle Disabled + Toggle Readonly @@ -171,6 +173,10 @@ export default defineComponent({ const segment = ref('dogs'); const select = ref('apples'); + // States + const isDisabled = ref(false); + const isReadonly = ref(false); + const reset = () => { checkbox.value = false; toggle.value = false; @@ -205,6 +211,14 @@ export default defineComponent({ select.value = 'bananas'; } + const toggleDisable = () => { + isDisabled.value = !isDisabled.value; + }; + + const toggleReadonly = () => { + isReadonly.value = !isReadonly.value; + }; + return { checkbox, toggle, @@ -217,9 +231,13 @@ export default defineComponent({ radio, segment, select, + isDisabled, + isReadonly, reset, - set + set, + toggleDisable, + toggleReadonly } } }); diff --git a/packages/vue/test/base/tests/e2e/specs/inputs.cy.js b/packages/vue/test/base/tests/e2e/specs/inputs.cy.js index 26c26f8ef95..f836496a5d0 100644 --- a/packages/vue/test/base/tests/e2e/specs/inputs.cy.js +++ b/packages/vue/test/base/tests/e2e/specs/inputs.cy.js @@ -2,48 +2,70 @@ describe('Inputs', () => { beforeEach(() => { cy.visit('/inputs') }) - it('should have default value', () => { - cy.get('ion-checkbox').should('have.prop', 'checked').and('eq', false); - cy.get('ion-toggle').should('have.prop', 'checked').and('eq', false); - cy.get('ion-input').should('have.prop', 'value').and('eq', ''); - cy.get('ion-input-otp').should('have.prop', 'value').and('eq', ''); - cy.get('ion-range').should('have.prop', 'value').and('deep.eq', { lower: 30, upper: 70 }); - cy.get('ion-textarea').should('have.prop', 'value').and('eq', ''); - cy.get('ion-searchbar').should('have.prop', 'value').and('eq', ''); - cy.get('ion-datetime').should('have.prop', 'value').and('eq', ''); - cy.get('ion-radio-group').should('have.prop', 'value').and('eq', 'red'); - cy.get('ion-segment').should('have.prop', 'value').and('eq', 'dogs'); - cy.get('ion-select').should('have.prop', 'value').and('eq', 'apples'); - }); + + describe('basic functionality', () => { + it('should have default value', () => { + cy.get('ion-checkbox').should('have.prop', 'checked').and('eq', false); + cy.get('ion-toggle').should('have.prop', 'checked').and('eq', false); + cy.get('ion-input').should('have.prop', 'value').and('eq', ''); + cy.get('ion-input-otp').should('have.prop', 'value').and('eq', ''); + cy.get('ion-range').should('have.prop', 'value').and('deep.eq', { lower: 30, upper: 70 }); + cy.get('ion-textarea').should('have.prop', 'value').and('eq', ''); + cy.get('ion-searchbar').should('have.prop', 'value').and('eq', ''); + cy.get('ion-datetime').should('have.prop', 'value').and('eq', ''); + cy.get('ion-radio-group').should('have.prop', 'value').and('eq', 'red'); + cy.get('ion-segment').should('have.prop', 'value').and('eq', 'dogs'); + cy.get('ion-select').should('have.prop', 'value').and('eq', 'apples'); + }); + + it('should set/reset values', () => { + cy.get('ion-button#set').click(); + + cy.get('ion-checkbox').should('have.prop', 'checked').and('eq', true); + cy.get('ion-toggle').should('have.prop', 'checked').and('eq', true); + cy.get('ion-input').should('have.prop', 'value').and('eq', 'Hello World'); + cy.get('ion-input-otp').should('have.prop', 'value').and('eq', '1234'); + cy.get('ion-range').should('have.prop', 'value').and('deep.eq', { lower: 10, upper: 90 }); + cy.get('ion-textarea').should('have.prop', 'value').and('eq', 'Lorem Ipsum'); + cy.get('ion-searchbar').should('have.prop', 'value').and('eq', 'Search Query'); + cy.get('ion-datetime').should('have.prop', 'value').and('eq', '2019-01-31'); + cy.get('ion-radio-group').should('have.prop', 'value').and('eq', 'blue'); + cy.get('ion-segment').should('have.prop', 'value').and('eq', 'cats'); + cy.get('ion-select').should('have.prop', 'value').and('eq', 'bananas'); - it('should set/reset values', () => { - cy.get('ion-button#set').click(); + cy.get('ion-button#reset').click(); - cy.get('ion-checkbox').should('have.prop', 'checked').and('eq', true); - cy.get('ion-toggle').should('have.prop', 'checked').and('eq', true); - cy.get('ion-input').should('have.prop', 'value').and('eq', 'Hello World'); - cy.get('ion-input-otp').should('have.prop', 'value').and('eq', '1234'); - cy.get('ion-range').should('have.prop', 'value').and('deep.eq', { lower: 10, upper: 90 }); - cy.get('ion-textarea').should('have.prop', 'value').and('eq', 'Lorem Ipsum'); - cy.get('ion-searchbar').should('have.prop', 'value').and('eq', 'Search Query'); - cy.get('ion-datetime').should('have.prop', 'value').and('eq', '2019-01-31'); - cy.get('ion-radio-group').should('have.prop', 'value').and('eq', 'blue'); - cy.get('ion-segment').should('have.prop', 'value').and('eq', 'cats'); - cy.get('ion-select').should('have.prop', 'value').and('eq', 'bananas'); + cy.get('ion-checkbox').should('have.prop', 'checked').and('eq', false); + cy.get('ion-toggle').should('have.prop', 'checked').and('eq', false); + cy.get('ion-input').should('have.prop', 'value').and('eq', ''); + cy.get('ion-input-otp').should('have.prop', 'value').and('eq', ''); + cy.get('ion-range').should('have.prop', 'value').and('deep.eq', { lower: 30, upper: 70 }); + cy.get('ion-textarea').should('have.prop', 'value').and('eq', ''); + cy.get('ion-searchbar').should('have.prop', 'value').and('eq', ''); + cy.get('ion-datetime').should('have.prop', 'value').and('eq', ''); + cy.get('ion-radio-group').should('have.prop', 'value').and('eq', 'red'); + cy.get('ion-segment').should('have.prop', 'value').and('eq', 'dogs'); + cy.get('ion-select').should('have.prop', 'value').and('eq', 'apples'); + }); + + it('should reflect props when component has a default value', () => { + // Disable inputs + cy.get('ion-button#disable').click(); - cy.get('ion-button#reset').click(); + // Disabled prop + cy.get('ion-input').should('have.attr', 'disabled'); + cy.get('ion-input-otp').should('have.attr', 'disabled'); + cy.get('ion-textarea').should('have.attr', 'disabled'); - cy.get('ion-checkbox').should('have.prop', 'checked').and('eq', false); - cy.get('ion-toggle').should('have.prop', 'checked').and('eq', false); - cy.get('ion-input').should('have.prop', 'value').and('eq', ''); - cy.get('ion-input-otp').should('have.prop', 'value').and('eq', ''); - cy.get('ion-range').should('have.prop', 'value').and('deep.eq', { lower: 30, upper: 70 }); - cy.get('ion-textarea').should('have.prop', 'value').and('eq', ''); - cy.get('ion-searchbar').should('have.prop', 'value').and('eq', ''); - cy.get('ion-datetime').should('have.prop', 'value').and('eq', ''); - cy.get('ion-radio-group').should('have.prop', 'value').and('eq', 'red'); - cy.get('ion-segment').should('have.prop', 'value').and('eq', 'dogs'); - cy.get('ion-select').should('have.prop', 'value').and('eq', 'apples'); + // Reset disabled state and set readonly state + cy.get('ion-button#disable').click(); + cy.get('ion-button#readonly').click(); + + // Readonly prop + cy.get('ion-input').should('have.attr', 'readonly'); + cy.get('ion-input-otp').should('have.attr', 'readonly'); + cy.get('ion-textarea').should('have.attr', 'readonly'); + }); }); describe('updating text input refs', () => { From a1fa50b8e2ea92e4a63c5e97428f37b6375629bd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 12 Feb 2026 16:50:12 -0500 Subject: [PATCH 26/55] chore(deps): update dependency @capacitor/core to v8.1.0 (#30953) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@capacitor/core](https://capacitorjs.com) ([source](https://redirect.github.com/ionic-team/capacitor)) | [`8.0.2` → `8.1.0`](https://renovatebot.com/diffs/npm/@capacitor%2fcore/8.0.2/8.1.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@capacitor%2fcore/8.1.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@capacitor%2fcore/8.0.2/8.1.0?slim=true) | --- ### Release Notes
ionic-team/capacitor (@​capacitor/core) ### [`v8.1.0`](https://redirect.github.com/ionic-team/capacitor/blob/HEAD/CHANGELOG.md#810-2026-02-11) [Compare Source](https://redirect.github.com/ionic-team/capacitor/compare/8.0.2...8.1.0) ##### Bug Fixes - **cookies:** only send expires param on web if a date is set ([b10cd7f](https://redirect.github.com/ionic-team/capacitor/commit/b10cd7ff15b010a76802374214f4e0cbd04abdab)) ##### Features - **cli:** Add packageManager to iOS config ([#​8321](https://redirect.github.com/ionic-team/capacitor/issues/8321)) ([a125498](https://redirect.github.com/ionic-team/capacitor/commit/a1254983bbb9dcb273d93f3c5f639b792e516406)) ##### Reverts - revert version bump from [#​8319](https://redirect.github.com/ionic-team/capacitor/issues/8319) and [#​8320](https://redirect.github.com/ionic-team/capacitor/issues/8320) ([a48ebb6](https://redirect.github.com/ionic-team/capacitor/commit/a48ebb622ea4ebe92927bf1756a4d8ac6012884b)) #### [8.0.2](https://redirect.github.com/ionic-team/capacitor/compare/8.0.1...8.0.2) (2026-01-27) ##### Bug Fixes - **android:** AGP 9.0 no longer supports `proguard-android.txt` ([#​8315](https://redirect.github.com/ionic-team/capacitor/issues/8315)) ([dcc76c3](https://redirect.github.com/ionic-team/capacitor/commit/dcc76c37508a9b71fb36d95707748c2dd115cf52)) - **cli:** Update tar package ([#​8311](https://redirect.github.com/ionic-team/capacitor/issues/8311)) ([0969c5c](https://redirect.github.com/ionic-team/capacitor/commit/0969c5cd0b16cf23d2489a85a3b8fa1bee2ebf3b)) - **core:** make SystemBars hide and show options optional ([#​8305](https://redirect.github.com/ionic-team/capacitor/issues/8305)) ([95dc7d8](https://redirect.github.com/ionic-team/capacitor/commit/95dc7d8ace3aabdda7e325c4a8ef7d1432ad37e9)) - **SystemBars:** get correct style on handleOnConfigurationChanged ([#​8295](https://redirect.github.com/ionic-team/capacitor/issues/8295)) ([2a66b44](https://redirect.github.com/ionic-team/capacitor/commit/2a66b44915895f971e4a26a8612798aa2f95ea11)) - **SystemBars:** Set window background color according to theme ([#​8306](https://redirect.github.com/ionic-team/capacitor/issues/8306)) ([6037e38](https://redirect.github.com/ionic-team/capacitor/commit/6037e3836ec24c9ddf26e74e5fbec20ab506adfd)) - **SystemBars:** Skipping margin manipulation when on a fixed WebView ([#​8309](https://redirect.github.com/ionic-team/capacitor/issues/8309)) ([53c33b6](https://redirect.github.com/ionic-team/capacitor/commit/53c33b614218bf635322fbdf9a38038a7964e3d4)) #### [8.0.1](https://redirect.github.com/ionic-team/capacitor/compare/8.0.0...8.0.1) (2026-01-13) ##### Bug Fixes - **android:** Remove calculated bottom inset if keyboard is visible ([#​8280](https://redirect.github.com/ionic-team/capacitor/issues/8280)) ([196b642](https://redirect.github.com/ionic-team/capacitor/commit/196b642236d293a5012e3c307fcd942766e56cce)) - **cli:** Support wireless iOS devices in `cap run` ([#​8301](https://redirect.github.com/ionic-team/capacitor/issues/8301)) ([dcb368c](https://redirect.github.com/ionic-team/capacitor/commit/dcb368c33555487f1b6f46a6d8e30736bdd78955)) - **cli:** use latest native-run ([#​8296](https://redirect.github.com/ionic-team/capacitor/issues/8296)) ([121d830](https://redirect.github.com/ionic-team/capacitor/commit/121d83013f39e25009121533a2c3ad86e428d6b2))
--- ### Configuration 📅 **Schedule**: Branch creation - "every weekday before 11am" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Never, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/ionic-team/ionic-framework). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- core/package-lock.json | 43 +++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/core/package-lock.json b/core/package-lock.json index c3656beae5a..442149f3031 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -93,7 +93,6 @@ "version": "7.16.12", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -628,12 +627,11 @@ "license": "MIT" }, "node_modules/@capacitor/core": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.0.2.tgz", - "integrity": "sha512-EXZfxkL6GFJS2cb7TIBR7RiHA5iz6ufDcl1VmUpI2pga3lJ5Ck2+iqbx7N+osL3XYem9ad4XCidJEMm64DX6UQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.1.0.tgz", + "integrity": "sha512-UfMBMWc1v7J+14AhH03QmeNwV3HZx3qnOWhpwnHfzALEwAwlV/itQOQqcasMQYhOHWL0tiymc5ByaLTn7KKQxw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -852,7 +850,6 @@ "version": "4.33.0", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "4.33.0", "@typescript-eslint/types": "4.33.0", @@ -1790,7 +1787,6 @@ "node_modules/@stencil/core": { "version": "4.38.0", "license": "MIT", - "peer": true, "bin": { "stencil": "bin/stencil" }, @@ -2215,7 +2211,6 @@ "version": "6.7.2", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "6.7.2", "@typescript-eslint/types": "6.7.2", @@ -2441,6 +2436,7 @@ "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.25", @@ -2455,6 +2451,7 @@ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=0.12" }, @@ -2467,7 +2464,8 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@vue/compiler-dom": { "version": "3.5.25", @@ -2475,6 +2473,7 @@ "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-core": "3.5.25", "@vue/shared": "3.5.25" @@ -2486,6 +2485,7 @@ "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.25", @@ -2503,7 +2503,8 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@vue/compiler-sfc/node_modules/postcss": { "version": "8.5.6", @@ -2525,6 +2526,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -2540,6 +2542,7 @@ "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.25", "@vue/shared": "3.5.25" @@ -2551,6 +2554,7 @@ "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vue/shared": "3.5.25" } @@ -2561,6 +2565,7 @@ "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vue/reactivity": "3.5.25", "@vue/shared": "3.5.25" @@ -2572,6 +2577,7 @@ "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vue/reactivity": "3.5.25", "@vue/runtime-core": "3.5.25", @@ -2585,6 +2591,7 @@ "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-ssr": "3.5.25", "@vue/shared": "3.5.25" @@ -2598,7 +2605,8 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz", "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@zeit/schemas": { "version": "2.21.0", @@ -2621,7 +2629,6 @@ "version": "7.4.0", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3782,7 +3789,8 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/debug": { "version": "2.6.9", @@ -4076,7 +4084,6 @@ "version": "7.32.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -7272,6 +7279,7 @@ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -7593,6 +7601,7 @@ } ], "license": "MIT", + "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -7947,7 +7956,6 @@ "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "playwright-core": "cli.js" }, @@ -7959,7 +7967,6 @@ "version": "7.0.35", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -8065,7 +8072,6 @@ "version": "0.36.2", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "postcss": ">=5.0.0" } @@ -8114,7 +8120,6 @@ "version": "2.6.1", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -8472,7 +8477,6 @@ "version": "2.35.1", "dev": true, "license": "MIT", - "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -8694,6 +8698,7 @@ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } From c8a65dcd7ee1d05f898e8a6f4d5e7b69f0cc756a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Feb 2026 18:12:03 +0000 Subject: [PATCH 27/55] chore(deps): update dependency @capacitor/status-bar to v8.0.1 (#30954) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@capacitor/status-bar](https://redirect.github.com/ionic-team/capacitor-plugins) | [`8.0.0` → `8.0.1`](https://renovatebot.com/diffs/npm/@capacitor%2fstatus-bar/8.0.0/8.0.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@capacitor%2fstatus-bar/8.0.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@capacitor%2fstatus-bar/8.0.0/8.0.1?slim=true) | --- ### Release Notes
ionic-team/capacitor-plugins (@​capacitor/status-bar) ### [`v8.0.1`](https://redirect.github.com/ionic-team/capacitor-plugins/compare/@capacitor/splash-screen@8.0.0...bf4fe8c9ace79237c048c9b5ee0ab7455042bc86) [Compare Source](https://redirect.github.com/ionic-team/capacitor-plugins/compare/@capacitor/status-bar@8.0.0...@capacitor/status-bar@8.0.1)
--- ### Configuration 📅 **Schedule**: Branch creation - "every weekday before 11am" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Never, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/ionic-team/ionic-framework). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- core/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/package-lock.json b/core/package-lock.json index 442149f3031..5fc8c332797 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -657,9 +657,9 @@ } }, "node_modules/@capacitor/status-bar": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-8.0.0.tgz", - "integrity": "sha512-aIj3bc7z8lfPgOen8HlrBrkfnxpFnh21OCx6jCUx4Mvv+B6eEkUQ49b32DOddgVfr+igRHLX2SYi7duqIsNDXg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-8.0.1.tgz", + "integrity": "sha512-OR59dlbwvmrV5dKsC9lvwv48QaGbqcbSTBpk+9/WXWxXYSdXXdzJZU9p8oyNPAkuJhCdnSa3XmU43fZRPBJJ5w==", "dev": true, "license": "MIT", "peerDependencies": { From 6490797851cede3bfda893a19b10f165259ec988 Mon Sep 17 00:00:00 2001 From: Shane Date: Fri, 13 Feb 2026 11:41:39 -0800 Subject: [PATCH 28/55] fix(modal, popover): respect safe area insets on popovers and modals (#30949) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue number: resolves #28411 --------- ## What is the current behavior? When a modal is displayed on tablet-sized screens (>= 768px × >= 600px), the `--ion-safe-area-*` CSS variables are explicitly set to 0px. This was intended for inset modals that don't touch screen edges, but it breaks safe area handling on newer iPads with Face ID/home indicators, causing content to overlap with system UI elements. ## What is the new behavior? Modals now dynamically handle safe-area insets based on their type and position. This has to be done because modals that don't touch the edges cannot have a safe area applied (because it will add unnecessary padding), but modals that do touch the edges need to apply safe area correctly or the edges will be obstructed by whatever is in the safe area. ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information [Modals test page](https://ionic-framework-git-fw-6830-2-ionic1.vercel.app/src/components/modal/test/safe-area/index.html) [Popovers test page](https://ionic-framework-git-fw-6830-2-ionic1.vercel.app/src/components/popover/test/safe-area/index.html) Current dev build: ``` 8.7.18-dev.11770674094.18396f54 ``` --------- Co-authored-by: ionitron --- ...ton-active-ios-ltr-Mobile-Safari-linux.png | Bin 1444 -> 1546 bytes ...ime-picker-ios-ltr-Mobile-Safari-linux.png | Bin 6941 -> 6952 bytes core/src/components/modal/modal.scss | 11 +- core/src/components/modal/modal.tsx | 197 +++++++++- core/src/components/modal/safe-area-utils.ts | 201 ++++++++++ .../modal/test/safe-area/index.html | 262 +++++++++++++ .../modal/test/safe-area/modal.e2e.ts | 370 ++++++++++++++++++ .../popover/animations/ios.enter.ts | 46 ++- .../components/popover/animations/md.enter.ts | 50 ++- .../popover/test/safe-area/index.html | 154 ++++++++ .../popover/test/safe-area/popover.e2e.ts | 81 ++++ ...rea-bottom-ios-ltr-Mobile-Chrome-linux.png | Bin 0 -> 14448 bytes ...ea-bottom-ios-ltr-Mobile-Firefox-linux.png | Bin 0 -> 23407 bytes ...rea-bottom-ios-ltr-Mobile-Safari-linux.png | Bin 0 -> 19440 bytes ...area-bottom-md-ltr-Mobile-Chrome-linux.png | Bin 0 -> 14108 bytes ...rea-bottom-md-ltr-Mobile-Firefox-linux.png | Bin 0 -> 21370 bytes ...area-bottom-md-ltr-Mobile-Safari-linux.png | Bin 0 -> 17780 bytes ...area-large-ios-ltr-Mobile-Chrome-linux.png | Bin 0 -> 16419 bytes ...rea-large-ios-ltr-Mobile-Firefox-linux.png | Bin 0 -> 28264 bytes ...area-large-ios-ltr-Mobile-Safari-linux.png | Bin 0 -> 21938 bytes ...-area-large-md-ltr-Mobile-Chrome-linux.png | Bin 0 -> 15343 bytes ...area-large-md-ltr-Mobile-Firefox-linux.png | Bin 0 -> 25389 bytes ...-area-large-md-ltr-Mobile-Safari-linux.png | Bin 0 -> 19563 bytes ...area-right-ios-ltr-Mobile-Chrome-linux.png | Bin 0 -> 13644 bytes ...rea-right-ios-ltr-Mobile-Firefox-linux.png | Bin 0 -> 24694 bytes ...area-right-ios-ltr-Mobile-Safari-linux.png | Bin 0 -> 18768 bytes ...-area-right-md-ltr-Mobile-Chrome-linux.png | Bin 0 -> 13637 bytes ...area-right-md-ltr-Mobile-Firefox-linux.png | Bin 0 -> 22525 bytes ...-area-right-md-ltr-Mobile-Safari-linux.png | Bin 0 -> 17537 bytes core/src/components/popover/utils.ts | 134 ++++++- 30 files changed, 1454 insertions(+), 52 deletions(-) create mode 100644 core/src/components/modal/safe-area-utils.ts create mode 100644 core/src/components/modal/test/safe-area/index.html create mode 100644 core/src/components/modal/test/safe-area/modal.e2e.ts create mode 100644 core/src/components/popover/test/safe-area/index.html create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-ios-ltr-Mobile-Chrome-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-ios-ltr-Mobile-Firefox-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-ios-ltr-Mobile-Safari-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-md-ltr-Mobile-Chrome-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-md-ltr-Mobile-Firefox-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-md-ltr-Mobile-Safari-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-large-ios-ltr-Mobile-Chrome-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-large-ios-ltr-Mobile-Firefox-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-large-ios-ltr-Mobile-Safari-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-large-md-ltr-Mobile-Chrome-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-large-md-ltr-Mobile-Firefox-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-large-md-ltr-Mobile-Safari-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-ios-ltr-Mobile-Chrome-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-ios-ltr-Mobile-Firefox-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-ios-ltr-Mobile-Safari-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-md-ltr-Mobile-Chrome-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-md-ltr-Mobile-Firefox-linux.png create mode 100644 core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-md-ltr-Mobile-Safari-linux.png diff --git a/core/src/components/datetime/test/custom/datetime.e2e.ts-snapshots/datetime-custom-time-button-active-ios-ltr-Mobile-Safari-linux.png b/core/src/components/datetime/test/custom/datetime.e2e.ts-snapshots/datetime-custom-time-button-active-ios-ltr-Mobile-Safari-linux.png index 7c7e296086a3849d98f379209a71b9ed20cec521..f4bc6529a2b693292bdd7485911cf194ce0b3762 100644 GIT binary patch delta 1499 zcmV<11tj{U3yKVoL4UMKL_t(&f$f@GOk716$A2?tFYGR`6xyZW+Om`au~MupSd^%E ziLJN9+Qi2AU^LNZwfdmZ2OspMUgDD)jqz?$ebB^)M6EP!qrF%wR4KIu3n;fz78W?{ z?m1_CSY244>@IB5OZNA)nVJ8bnQyo7wTY?F(#eXRfx(zvHo83j0*;vFJ&HxeCuv`YpWyGsv7BmHN+>S8i#Tw>ijnr+Z zh{Vc`f~JrFBBEstx}nEk3D0$^F1MkdqS8| zlV$!qiq{k@*l&0|N^oEzq0E)%Ah*zkw23+GygoNMd5#PAckb*Mnv^WNIydQ@X0s@x zPL70We)A~$c!ZLwLIyj7L?#XH-C0lJs=TG?6dc;!!GE!DPE)bD6iX?-f9E*snpSh` zV>JkE{_SeGH^i4O9l)7uM_iwyuob%PT>oTYrzO1vvQ zDeJmh2Y+e%?k^tRb!%L=@xBVaczz#&>x(JdSiIoa9)0T$oVhX2pEy6oFJGT#&+A9n z@#@V9o_V~vlk4wWGw&)nbEt1IW{H!2=vQ#Adz5SMSdGmQlWPu1WkV^wZ9_!$Sh_aS zH_rZ#ey68xC@r03C>kGG7dI%t^0ItND+&qrCx0&QWOxd5XxLFr=-ecIr$!R$e5<^4 z9UGXVF(VeO&0YAbi_&`5Ow#vM0oz}0oKrkDG>NCciDr)_623qIkL+riHcpDV`8-h{ z4Kvt1O8xfAw1;bV*~nkvK@UzPl-Fzt(AwNZRimGo$MoLc&tY?Dti7p}-am%ZejY3# zP=C!NG7+WiyR&S1pmI7W2o~I5FR1&E@$))^ouh<95!w&@P1ED+@z<jQnYfGHT0vZ72)&ymn+x-S(FoDXlIfrzY delta 1396 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 { - this.handleViewTransition(); + const context = this.getSafeAreaContext(); + + // iOS card modals: handle portrait/landscape view transitions + if (context.isCardModal && !this.enterAnimation && !this.leaveAnimation) { + this.handleViewTransition(); + } + + // Sheet modals: re-compute the internal offset property since safe-area + // values may change on device rotation (e.g., portrait notch vs landscape). + if (context.isSheetModal) { + this.updateSheetOffsetTop(); + } + + // Regular (non-sheet, non-card) modals: update safe-area overrides + // since the viewport may have crossed the centered-dialog breakpoint. + if (!context.isSheetModal && !context.isCardModal) { + this.updateSafeAreaOverrides(); + + // Re-evaluate fullscreen safe-area padding: clear first, then re-apply + if (this.wrapperEl) { + this.wrapperEl.style.removeProperty('height'); + this.wrapperEl.style.removeProperty('padding-bottom'); + } + this.applyFullscreenSafeArea(); + } }, 50); // Debounce to avoid excessive calls during active resizing } @@ -406,6 +435,9 @@ export class Modal implements ComponentInterface, OverlayInterface { this.triggerController.removeClickListener(); this.cleanupViewTransitionListener(); this.cleanupParentRemovalObserver(); + // Also called in dismiss() — intentional dual cleanup covers both + // dismiss-then-remove and direct DOM removal without dismiss. + this.cleanupSafeAreaOverrides(); } componentWillLoad() { @@ -594,6 +626,13 @@ export class Modal implements ComponentInterface, OverlayInterface { writeTask(() => this.el.classList.add('show-modal')); + // Recalculate isSheetModal before safe-area setup because framework + // bindings (e.g., Angular) may not have been applied when componentWillLoad ran. + this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined; + + // Set initial safe-area overrides before animation + this.setInitialSafeAreaOverrides(); + const hasCardModal = presentingElement !== undefined; /** @@ -614,6 +653,12 @@ export class Modal implements ComponentInterface, OverlayInterface { expandToScroll: this.expandToScroll, }); + // Update safe-area based on actual position after animation + this.updateSafeAreaOverrides(); + + // Apply fullscreen safe-area padding if needed + this.applyFullscreenSafeArea(); + /* tslint:disable-next-line */ if (typeof window !== 'undefined') { /** @@ -646,14 +691,7 @@ export class Modal implements ComponentInterface, OverlayInterface { window.addEventListener(KEYBOARD_DID_OPEN, this.keyboardOpenCallback); } - /** - * Recalculate isSheetModal because framework bindings (e.g., Angular) - * may not have been applied when componentWillLoad ran. - */ - const isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined; - this.isSheetModal = isSheetModal; - - if (isSheetModal) { + if (this.isSheetModal) { this.initSheetGesture(); } else if (hasCardModal) { this.initSwipeToClose(); @@ -885,6 +923,10 @@ export class Modal implements ComponentInterface, OverlayInterface { return false; } + // Cancel any pending resize timeout to prevent stale updates during dismiss + clearTimeout(this.resizeTimeout); + this.resizeTimeout = undefined; + /** * Because the canDismiss check below is async, * we need to claim a lock before the check happens, @@ -956,6 +998,7 @@ export class Modal implements ComponentInterface, OverlayInterface { } this.cleanupViewTransitionListener(); this.cleanupParentRemovalObserver(); + this.cleanupSafeAreaOverrides(); this.cleanupChildRoutePassthrough(); } @@ -1166,6 +1209,10 @@ export class Modal implements ComponentInterface, OverlayInterface { transitionAnimation.play().then(() => { this.viewTransitionAnimation = undefined; + // Wait for a layout pass after the transition so getBoundingClientRect() + // in getPositionBasedSafeAreaConfig() reflects the new dimensions. + raf(() => this.updateSafeAreaOverrides()); + // After orientation transition, recreate the swipe-to-close gesture // with updated animation that reflects the new presenting element state this.reinitSwipeToClose(); @@ -1335,6 +1382,130 @@ export class Modal implements ComponentInterface, OverlayInterface { this.parentRemovalObserver = undefined; } + /** + * Creates the context object for safe-area utilities. + */ + private getSafeAreaContext(): ModalSafeAreaContext { + return { + isSheetModal: this.isSheetModal, + isCardModal: this.presentingElement !== undefined && getIonMode(this) === 'ios', + presentingElement: this.presentingElement, + breakpoints: this.breakpoints, + currentBreakpoint: this.currentBreakpoint, + }; + } + + /** + * Sets initial safe-area overrides before modal animation. + * Called in present() before animation starts. + * + * For sheet modals, the SCSS --height formula uses --ion-modal-offset-top + * (an internal property) instead of --ion-safe-area-top. We resolve the + * root safe-area-top to pixels and set --ion-modal-offset-top, decoupling + * the height calculation from --ion-safe-area-top (which is zeroed for + * sheets to prevent header content from getting double-offset padding). + */ + private setInitialSafeAreaOverrides(): void { + const context = this.getSafeAreaContext(); + const safeAreaConfig = getInitialSafeAreaConfig(context); + applySafeAreaOverrides(this.el, safeAreaConfig); + + // Set the internal offset property with the resolved root safe-area-top value + if (context.isSheetModal) { + this.updateSheetOffsetTop(); + } + } + + /** + * Resolves the current root --ion-safe-area-top value and sets the + * internal --ion-modal-offset-top property on the host element. + * Called on present and on resize (e.g., device rotation changes safe-area). + */ + private updateSheetOffsetTop(): void { + const safeAreaTop = getRootSafeAreaTop(); + this.el.style.setProperty('--ion-modal-offset-top', `${safeAreaTop}px`); + } + + /** + * Updates safe-area overrides during dynamic state changes. + * Called after animations, during gestures, and on orientation changes. + */ + private updateSafeAreaOverrides(): void { + const { wrapperEl, el } = this; + const context = this.getSafeAreaContext(); + + // Sheet modals: safe-area is fully determined at presentation time + // (top is always 0px, height is frozen). Nothing to update. + if (context.isSheetModal) return; + + // Card modals have fixed safe-area requirements set by initial prediction. + if (context.isCardModal) return; + + // wrapperEl is required for position-based detection below + if (!wrapperEl) return; + + // Regular modals: use position-based detection to correctly handle both + // fullscreen modals and centered dialogs with custom dimensions. + const safeAreaConfig = getPositionBasedSafeAreaConfig(wrapperEl); + applySafeAreaOverrides(el, safeAreaConfig); + } + + /** + * Applies padding-bottom to fullscreen modal wrapper to prevent + * content from overlapping system navigation bar. + */ + private applyFullscreenSafeArea(): void { + const { wrapperEl, el } = this; + if (!wrapperEl) return; + + const context = this.getSafeAreaContext(); + if (context.isSheetModal || context.isCardModal) return; + + // Check for standard Ionic layout children (ion-content, ion-footer), + // searching one level deep for wrapped components (e.g., + // ...). + // Note: uses a manual loop instead of querySelector(':scope > ...') because + // Stencil's mock-doc (used in spec tests) does not support :scope. + let hasContent = false; + let hasFooter = false; + for (const child of Array.from(el.children)) { + if (child.tagName === 'ION-CONTENT') hasContent = true; + if (child.tagName === 'ION-FOOTER') hasFooter = true; + for (const grandchild of Array.from(child.children)) { + if (grandchild.tagName === 'ION-CONTENT') hasContent = true; + if (grandchild.tagName === 'ION-FOOTER') hasFooter = true; + } + } + + // Only apply wrapper padding for standard Ionic layouts (has ion-content + // but no ion-footer). Custom modals with raw HTML are fully + // developer-controlled and should not be modified. + if (!hasContent || hasFooter) return; + + // Reduce wrapper height by safe-area and add equivalent padding so the + // total visual size stays the same but the flex content area shrinks. + // Using height + padding instead of box-sizing: border-box avoids + // breaking custom modals that set --border-width (border-box would + // include the border inside the height, changing the layout). + wrapperEl.style.setProperty('height', 'calc(var(--height) - var(--ion-safe-area-bottom, 0px))'); + wrapperEl.style.setProperty('padding-bottom', 'var(--ion-safe-area-bottom, 0px)'); + } + + /** + * Clears all safe-area overrides and padding from wrapper. + */ + private cleanupSafeAreaOverrides(): void { + clearSafeAreaOverrides(this.el); + + // Remove internal sheet offset property + this.el.style.removeProperty('--ion-modal-offset-top'); + + if (this.wrapperEl) { + this.wrapperEl.style.removeProperty('height'); + this.wrapperEl.style.removeProperty('padding-bottom'); + } + } + render() { const { handle, diff --git a/core/src/components/modal/safe-area-utils.ts b/core/src/components/modal/safe-area-utils.ts new file mode 100644 index 00000000000..a13bf1770a0 --- /dev/null +++ b/core/src/components/modal/safe-area-utils.ts @@ -0,0 +1,201 @@ +import { win } from '@utils/browser'; +import { raf } from '@utils/helpers'; + +type SafeAreaValue = '0px' | 'inherit'; + +/** + * Configuration for safe-area CSS custom properties. + * Each direction can inherit the root safe-area value or be zeroed out. + */ +export interface SafeAreaConfig { + top: SafeAreaValue; + bottom: SafeAreaValue; + left: SafeAreaValue; + right: SafeAreaValue; +} + +/** + * Context information about the modal used to determine safe-area behavior. + */ +export interface ModalSafeAreaContext { + isSheetModal: boolean; + isCardModal: boolean; + presentingElement?: HTMLElement; + breakpoints?: number[]; + currentBreakpoint?: number; +} + +/** + * These thresholds match the SCSS media query breakpoints in modal.vars.scss + * that trigger the centered dialog layout (non-fullscreen modal). + * + * SCSS defines two height breakpoints: $modal-inset-min-height-small (600px) + * and $modal-inset-min-height-large (768px). We use the smaller one because + * that's the threshold where the modal transitions from fullscreen to centered + * dialog — the larger breakpoint only increases the dialog's height. + */ +const MODAL_INSET_MIN_WIDTH = 768; +const MODAL_INSET_MIN_HEIGHT = 600; +const EDGE_THRESHOLD = 5; + +/** + * Cache for resolved root safe-area-top value, invalidated once per frame. + */ +let cachedRootSafeAreaTop: number | null = null; +let cacheInvalidationScheduled = false; + +/** + * Determines if the current viewport meets the CSS media query conditions + * that cause regular modals to render as centered dialogs instead of fullscreen. + * Matches: @media (min-width: 768px) and (min-height: 600px) + */ +const isCenteredDialogViewport = (): boolean => { + if (!win) return false; + return win.matchMedia(`(min-width: ${MODAL_INSET_MIN_WIDTH}px) and (min-height: ${MODAL_INSET_MIN_HEIGHT}px)`) + .matches; +}; + +/** + * Resolves the current root --ion-safe-area-top value to pixels. + * Uses a temporary element because getComputedStyle on :root returns + * the declared value of custom properties (e.g. "env(safe-area-inset-top)") + * rather than a resolved number. + * + * Results are cached for the current frame to avoid repeated reflows. + */ +export const getRootSafeAreaTop = (): number => { + if (cachedRootSafeAreaTop !== null) { + return cachedRootSafeAreaTop; + } + + const doc = win?.document; + if (!doc?.body) { + return 0; + } + + const el = doc.createElement('div'); + el.style.cssText = + 'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;' + 'padding-top:var(--ion-safe-area-top,0px);'; + doc.body.appendChild(el); + const value = parseFloat(getComputedStyle(el).paddingTop) || 0; + el.remove(); + + cachedRootSafeAreaTop = value; + if (!cacheInvalidationScheduled) { + cacheInvalidationScheduled = true; + raf(() => { + cachedRootSafeAreaTop = null; + cacheInvalidationScheduled = false; + }); + } + + return value; +}; + +/** + * Returns the initial safe-area configuration based on modal type. + * This is called before animation starts and uses configuration-based prediction. + * + * @param context - Modal context information + * @returns SafeAreaConfig with initial safe-area values + */ +export const getInitialSafeAreaConfig = (context: ModalSafeAreaContext): SafeAreaConfig => { + const { isSheetModal, isCardModal } = context; + + // Sheet modals always zero top safe-area. The sheet height offset from the + // top edge is handled by --ion-modal-offset-top (set in modal.tsx) using + // the resolved root value, so --ion-safe-area-top is never needed for + // height calculation. Keeping it at 0px prevents header content from + // getting double-offset padding. + if (isSheetModal) { + return { + top: '0px', + bottom: 'inherit', + left: '0px', + right: '0px', + }; + } + + // Card modals need safe-area for height calculation. + // Note: isCardModal is already gated on mode === 'ios' by the caller. + if (isCardModal) { + return { + top: 'inherit', + bottom: 'inherit', + left: '0px', + right: '0px', + }; + } + + // On viewports that meet the centered dialog media query breakpoints, + // regular modals render as centered dialogs (not fullscreen), so they + // don't touch any screen edges and don't need safe-area insets. + if (isCenteredDialogViewport()) { + return { + top: '0px', + bottom: '0px', + left: '0px', + right: '0px', + }; + } + + // Fullscreen modals on phone - inherit all safe areas + return { + top: 'inherit', + bottom: 'inherit', + left: 'inherit', + right: 'inherit', + }; +}; + +/** + * Returns safe-area configuration based on actual modal position. + * Detects which edges the modal overlaps with and only applies safe-area to those edges. + * + * Note: On Android edge-to-edge (API 36+), getBoundingClientRect() may report + * inconsistent values. Sheet and card modals avoid this by using configuration-based + * prediction instead. Regular modals use coordinate detection which works reliably + * on web and iOS; Android edge-to-edge may need a configuration-based fallback + * once a reliable detection mechanism is available. + * + * @param wrapperEl - The modal wrapper element to measure + * @returns SafeAreaConfig based on position + */ +export const getPositionBasedSafeAreaConfig = (wrapperEl: HTMLElement): SafeAreaConfig => { + const rect = wrapperEl.getBoundingClientRect(); + const vh = win?.innerHeight ?? 0; + const vw = win?.innerWidth ?? 0; + + // Only apply safe-area to sides where modal overlaps with screen edge + return { + top: rect.top <= EDGE_THRESHOLD ? 'inherit' : '0px', + bottom: rect.bottom >= vh - EDGE_THRESHOLD ? 'inherit' : '0px', + left: rect.left <= EDGE_THRESHOLD ? 'inherit' : '0px', + right: rect.right >= vw - EDGE_THRESHOLD ? 'inherit' : '0px', + }; +}; + +/** + * Applies safe-area CSS custom property overrides to the modal host element. + * + * @param hostEl - The modal host element (ion-modal) + * @param config - Safe-area configuration to apply + */ +export const applySafeAreaOverrides = (hostEl: HTMLElement, config: SafeAreaConfig): void => { + hostEl.style.setProperty('--ion-safe-area-top', config.top); + hostEl.style.setProperty('--ion-safe-area-bottom', config.bottom); + hostEl.style.setProperty('--ion-safe-area-left', config.left); + hostEl.style.setProperty('--ion-safe-area-right', config.right); +}; + +/** + * Clears safe-area CSS custom property overrides from the modal host element. + * + * @param hostEl - The modal host element (ion-modal) + */ +export const clearSafeAreaOverrides = (hostEl: HTMLElement): void => { + hostEl.style.removeProperty('--ion-safe-area-top'); + hostEl.style.removeProperty('--ion-safe-area-bottom'); + hostEl.style.removeProperty('--ion-safe-area-left'); + hostEl.style.removeProperty('--ion-safe-area-right'); +}; diff --git a/core/src/components/modal/test/safe-area/index.html b/core/src/components/modal/test/safe-area/index.html new file mode 100644 index 00000000000..14681f3820f --- /dev/null +++ b/core/src/components/modal/test/safe-area/index.html @@ -0,0 +1,262 @@ + + + + + Modal - Safe Area + + + + + + + + + + + +
+
+ + +
+ + + Modal - Safe Area + + + + +

Fullscreen Modals

+ + + +

Sheet Modals

+ + +

Card Modals (iOS)

+ + +

Centered Dialog (Tablet)

+ + +

Diagnostic Info

+
+

Window Width:

+

Window Height:

+

Is Tablet:

+
+
+
+
+ + + + diff --git a/core/src/components/modal/test/safe-area/modal.e2e.ts b/core/src/components/modal/test/safe-area/modal.e2e.ts new file mode 100644 index 00000000000..af2a58c7699 --- /dev/null +++ b/core/src/components/modal/test/safe-area/modal.e2e.ts @@ -0,0 +1,370 @@ +import { expect } from '@playwright/test'; +import { configs, test, Viewports } from '@utils/test/playwright'; + +/** + * These tests verify that safe-area CSS custom properties are correctly + * applied to modals based on their type and position. + * + * Safe-area handling is position-based and not affected by text direction. + * Testing only LTR to avoid redundant test runs. + */ + +/** + * The test page (index.html) sets these root safe-area values. + * Keep in sync with the :root block in test/safe-area/index.html. + */ +const TEST_SAFE_AREA_TOP = '47px'; +configs({ modes: ['ios', 'md'], directions: ['ltr'] }).forEach(({ title, config }) => { + test.describe(title('modal: safe-area handling'), () => { + test.beforeEach(async ({ page }) => { + await page.goto('/src/components/modal/test/safe-area', config); + }); + + test('fullscreen modal should inherit all safe-area values on phone', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30900', + }); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + await page.click('#fullscreen-modal'); + await ionModalDidPresent.next(); + + const modal = page.locator('ion-modal'); + + // On phone viewport, fullscreen modal should inherit safe-area values + const safeAreaTop = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-top'); + }); + const safeAreaBottom = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-bottom'); + }); + + expect(safeAreaTop).toBe('inherit'); + expect(safeAreaBottom).toBe('inherit'); + }); + + test('regular modal should have safe-area zeroed on tablet (centered dialog)', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30900', + }); + + await page.setViewportSize(Viewports.tablet.portrait); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + await page.click('#fullscreen-modal'); + await ionModalDidPresent.next(); + + const modal = page.locator('ion-modal'); + + // On tablet viewport, the CSS media query renders regular modals as + // centered dialogs (600x500). Since they don't touch screen edges, + // safe-area values should be zeroed out. + const safeAreaTop = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-top'); + }); + const safeAreaBottom = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-bottom'); + }); + + expect(safeAreaTop).toBe('0px'); + expect(safeAreaBottom).toBe('0px'); + }); + + test('sheet modal should only use bottom safe-area', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30900', + }); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + await page.click('#sheet-modal'); + await ionModalDidPresent.next(); + + const modal = page.locator('ion-modal'); + + // Sheet modals should have top safe-area zeroed (doesn't touch top edge) + // but bottom safe-area inherited (touches bottom edge) + const safeAreaTop = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-top'); + }); + const safeAreaBottom = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-bottom'); + }); + + expect(safeAreaTop).toBe('0px'); + expect(safeAreaBottom).toBe('inherit'); + }); + + test('fullscreen modal without footer should have wrapper padding-bottom', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30900', + }); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + await page.click('#fullscreen-modal-no-footer'); + await ionModalDidPresent.next(); + + const modal = page.locator('ion-modal'); + + // When no footer is present, the wrapper should have reduced height + // and padding-bottom to prevent content from overlapping the system + // navigation bar, without changing box-sizing (which would break + // custom modals with --border-width). + const wrapper = modal.locator('.modal-wrapper'); + const paddingBottom = await wrapper.evaluate((el: HTMLElement) => { + return el.style.getPropertyValue('padding-bottom'); + }); + const height = await wrapper.evaluate((el: HTMLElement) => { + return el.style.getPropertyValue('height'); + }); + + expect(paddingBottom).toBe('var(--ion-safe-area-bottom, 0px)'); + expect(height).toBe('calc(var(--height) - var(--ion-safe-area-bottom, 0px))'); + }); + + test('sheet modal at breakpoint 1 should keep top safe-area zeroed', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30900', + }); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + await page.click('#sheet-modal'); + await ionModalDidPresent.next(); + + const modal = page.locator('ion-modal'); + + // Initially at breakpoint 0.5 — top safe-area should be zeroed + let safeAreaTop = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-top'); + }); + expect(safeAreaTop).toBe('0px'); + + // Move to breakpoint 1 (fully expanded) via the public method + const ionBreakpointDidChange = await page.spyOnEvent('ionBreakpointDidChange'); + await modal.evaluate((el: HTMLIonModalElement) => { + el.setCurrentBreakpoint(1); + }); + await ionBreakpointDidChange.next(); + + // At breakpoint 1, top safe-area should still be 0px because the + // sheet height is frozen with the resolved root value. This prevents + // header content from getting double-offset padding. + safeAreaTop = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-top'); + }); + expect(safeAreaTop).toBe('0px'); + }); + + test('sheet modal should have --ion-modal-offset-top set with resolved safe-area value', async ({ + page, + }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30900', + }); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + await page.click('#sheet-modal'); + await ionModalDidPresent.next(); + + const modal = page.locator('ion-modal'); + + // The internal --ion-modal-offset-top property should be set to the + // resolved root --ion-safe-area-top value. The SCSS --height formula + // uses this instead of --ion-safe-area-top directly. + const offsetTop = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-modal-offset-top'); + }); + expect(offsetTop).toBe(TEST_SAFE_AREA_TOP); + }); + + test('fullscreen modal safe-area should update on resize from phone to tablet', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30900', + }); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + await page.click('#fullscreen-modal'); + await ionModalDidPresent.next(); + + const modal = page.locator('ion-modal'); + + // On phone viewport, modal should inherit safe-area + const safeAreaTop = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-top'); + }); + expect(safeAreaTop).toBe('inherit'); + + // Resize to tablet viewport (centered dialog breakpoint) + await page.setViewportSize(Viewports.tablet.portrait); + + // Poll until the debounced resize handler updates safe-area overrides + await expect + .poll(async () => { + return modal.evaluate((el: HTMLIonModalElement) => el.style.getPropertyValue('--ion-safe-area-top')); + }) + .toBe('0px'); + + const safeAreaBottom = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-bottom'); + }); + + expect(safeAreaBottom).toBe('0px'); + }); + + test('centered dialog should have all safe-area values zeroed on tablet', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30900', + }); + + await page.setViewportSize(Viewports.tablet.portrait); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + await page.click('#centered-dialog'); + await ionModalDidPresent.next(); + + const modal = page.locator('ion-modal'); + + // Centered dialogs don't touch any edge, so all safe-areas should be zeroed + const safeAreaTop = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-top'); + }); + const safeAreaBottom = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-bottom'); + }); + + expect(safeAreaTop).toBe('0px'); + expect(safeAreaBottom).toBe('0px'); + }); + + test('safe-area overrides should be cleared on dismiss', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30900', + }); + + // Present modal programmatically so we control the lifecycle + // (the HTML page's presenters call modal.remove() after dismiss, + // which races with our post-dismiss evaluation) + await page.evaluate(async () => { + const modal = document.createElement('ion-modal'); + modal.component = document.createElement('div'); + document.body.appendChild(modal); + await modal.present(); + }); + + const modal = page.locator('ion-modal'); + + // Verify overrides are set + let safeAreaTop = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-top'); + }); + expect(safeAreaTop).not.toBe(''); + + // Dismiss the modal but don't remove the element + await modal.evaluate(async (el: HTMLIonModalElement) => { + await el.dismiss(); + }); + + // Verify overrides are cleared after dismiss + safeAreaTop = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-top'); + }); + expect(safeAreaTop).toBe(''); + + // Clean up + await modal.evaluate((el: HTMLIonModalElement) => el.remove()); + }); + }); +}); + +configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => { + test.describe(title('modal: card modal safe-area (iOS only)'), () => { + test.beforeEach(async ({ page }) => { + await page.goto('/src/components/modal/test/safe-area', config); + }); + + test('card modal should inherit top and bottom safe-area', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30900', + }); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + await page.click('#card-modal'); + await ionModalDidPresent.next(); + + const modal = page.locator('ion-modal'); + + // Card modals need top safe-area for height calculation + const safeAreaTop = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-top'); + }); + const safeAreaBottom = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-bottom'); + }); + const safeAreaLeft = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-left'); + }); + const safeAreaRight = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-right'); + }); + + expect(safeAreaTop).toBe('inherit'); + expect(safeAreaBottom).toBe('inherit'); + expect(safeAreaLeft).toBe('0px'); + expect(safeAreaRight).toBe('0px'); + }); + + test('card modal on tablet should still inherit safe-area values', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/30900', + }); + + await page.setViewportSize(Viewports.tablet.portrait); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + await page.click('#card-modal'); + await ionModalDidPresent.next(); + + const modal = page.locator('ion-modal'); + + // Card modals use safe-area values in CSS calculations regardless of viewport, + // so they should inherit even on tablet where regular modals become centered dialogs. + const safeAreaTop = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-top'); + }); + const safeAreaBottom = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-bottom'); + }); + const safeAreaLeft = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-left'); + }); + const safeAreaRight = await modal.evaluate((el: HTMLIonModalElement) => { + return el.style.getPropertyValue('--ion-safe-area-right'); + }); + + expect(safeAreaTop).toBe('inherit'); + expect(safeAreaBottom).toBe('inherit'); + expect(safeAreaLeft).toBe('0px'); + expect(safeAreaRight).toBe('0px'); + }); + }); +}); diff --git a/core/src/components/popover/animations/ios.enter.ts b/core/src/components/popover/animations/ios.enter.ts index aa4e0568143..02a078a2f71 100644 --- a/core/src/components/popover/animations/ios.enter.ts +++ b/core/src/components/popover/animations/ios.enter.ts @@ -7,11 +7,22 @@ import { getArrowDimensions, getPopoverDimensions, getPopoverPosition, + getSafeAreaInsets, shouldShowArrow, } from '../utils'; const POPOVER_IOS_BODY_PADDING = 5; +/** + * Minimum edge margin for iOS popovers ensures visual spacing from screen + * edges on devices without safe areas (e.g., older iPhones without notches). + * Previously this was a hardcoded `safeAreaMargin = 25` that served dual + * purpose: safe-area avoidance AND visual spacing. Now that actual safe-area + * insets are read dynamically, this floor preserves the visual spacing when + * safe-area values are 0. + */ +const POPOVER_IOS_MIN_EDGE_MARGIN = 25; + /** * iOS Popover Enter Animation */ @@ -53,7 +64,16 @@ export const iosEnterAnimation = (baseEl: HTMLElement, opts?: any): Animation => ); const padding = size === 'cover' ? 0 : POPOVER_IOS_BODY_PADDING; - const margin = size === 'cover' ? 0 : 25; + const rawSafeArea = getSafeAreaInsets(doc as Document); + const safeArea = + size === 'cover' + ? { top: 0, bottom: 0, left: 0, right: 0 } + : { + top: Math.max(rawSafeArea.top, POPOVER_IOS_MIN_EDGE_MARGIN), + bottom: Math.max(rawSafeArea.bottom, POPOVER_IOS_MIN_EDGE_MARGIN), + left: Math.max(rawSafeArea.left, POPOVER_IOS_MIN_EDGE_MARGIN), + right: Math.max(rawSafeArea.right, POPOVER_IOS_MIN_EDGE_MARGIN), + }; const { originX, @@ -63,9 +83,12 @@ export const iosEnterAnimation = (baseEl: HTMLElement, opts?: any): Animation => bottom, checkSafeAreaLeft, checkSafeAreaRight, + checkSafeAreaTop, + checkSafeAreaBottom, arrowTop, arrowLeft, addPopoverBottomClass, + hideArrow, } = calculateWindowAdjustment( side, results.top, @@ -75,7 +98,7 @@ export const iosEnterAnimation = (baseEl: HTMLElement, opts?: any): Animation => bodyHeight, contentWidth, contentHeight, - margin, + safeArea, results.originX, results.originY, results.referenceCoordinates, @@ -119,11 +142,15 @@ export const iosEnterAnimation = (baseEl: HTMLElement, opts?: any): Animation => } if (bottom !== undefined) { - contentEl.style.setProperty('bottom', `${bottom}px`); + let bottomValue = `${bottom}px`; + if (checkSafeAreaBottom) { + bottomValue = `${bottom}px + var(--ion-safe-area-bottom, 0px)`; + } + contentEl.style.setProperty('bottom', `calc(${bottomValue})`); } - const safeAreaLeft = ' + var(--ion-safe-area-left, 0)'; - const safeAreaRight = ' - var(--ion-safe-area-right, 0)'; + const safeAreaLeft = ' + var(--ion-safe-area-left, 0px)'; + const safeAreaRight = ' - var(--ion-safe-area-right, 0px)'; let leftValue = `${left}px`; @@ -134,13 +161,18 @@ export const iosEnterAnimation = (baseEl: HTMLElement, opts?: any): Animation => leftValue = `${left}px${safeAreaRight}`; } - contentEl.style.setProperty('top', `calc(${top}px + var(--offset-y, 0))`); + let topValue = `${top}px`; + if (checkSafeAreaTop) { + topValue = `${top}px + var(--ion-safe-area-top, 0px)`; + } + + contentEl.style.setProperty('top', `calc(${topValue} + var(--offset-y, 0))`); contentEl.style.setProperty('left', `calc(${leftValue} + var(--offset-x, 0))`); contentEl.style.setProperty('transform-origin', `${originY} ${originX}`); if (arrowEl !== null) { const didAdjustBounds = results.top !== top || results.left !== left; - const showArrow = shouldShowArrow(side, didAdjustBounds, ev, trigger); + const showArrow = !hideArrow && shouldShowArrow(side, didAdjustBounds, ev, trigger); if (showArrow) { arrowEl.style.setProperty('top', `calc(${arrowTop}px + var(--offset-y, 0))`); diff --git a/core/src/components/popover/animations/md.enter.ts b/core/src/components/popover/animations/md.enter.ts index e25f745cec4..8de9976e86c 100644 --- a/core/src/components/popover/animations/md.enter.ts +++ b/core/src/components/popover/animations/md.enter.ts @@ -2,7 +2,7 @@ import { createAnimation } from '@utils/animation/animation'; import { getElementRoot } from '@utils/helpers'; import type { Animation } from '../../../interface'; -import { calculateWindowAdjustment, getPopoverDimensions, getPopoverPosition } from '../utils'; +import { calculateWindowAdjustment, getPopoverDimensions, getPopoverPosition, getSafeAreaInsets } from '../utils'; const POPOVER_MD_BODY_PADDING = 12; @@ -46,8 +46,22 @@ export const mdEnterAnimation = (baseEl: HTMLElement, opts?: any): Animation => ); const padding = size === 'cover' ? 0 : POPOVER_MD_BODY_PADDING; - - const { originX, originY, top, left, bottom } = calculateWindowAdjustment( + // MD mode now applies safe-area insets (previously passed 0, ignoring all safe areas). + // This is needed for Android edge-to-edge (API 36+) where system bars overlap content. + const safeArea = size === 'cover' ? { top: 0, bottom: 0, left: 0, right: 0 } : getSafeAreaInsets(doc as Document); + + const { + originX, + originY, + top, + left, + bottom, + checkSafeAreaLeft, + checkSafeAreaRight, + checkSafeAreaTop, + checkSafeAreaBottom, + addPopoverBottomClass, + } = calculateWindowAdjustment( side, results.top, results.left, @@ -56,12 +70,28 @@ export const mdEnterAnimation = (baseEl: HTMLElement, opts?: any): Animation => bodyHeight, contentWidth, contentHeight, - 0, + safeArea, results.originX, results.originY, results.referenceCoordinates ); + const safeAreaLeftCalc = ' + var(--ion-safe-area-left, 0px)'; + const safeAreaRightCalc = ' - var(--ion-safe-area-right, 0px)'; + + let leftValue = `${left}px`; + if (checkSafeAreaLeft) { + leftValue = `${left}px${safeAreaLeftCalc}`; + } + if (checkSafeAreaRight) { + leftValue = `${left}px${safeAreaRightCalc}`; + } + + let topValue = `${top}px`; + if (checkSafeAreaTop) { + topValue = `${top}px + var(--ion-safe-area-top, 0px)`; + } + const baseAnimation = createAnimation(); const backdropAnimation = createAnimation(); const wrapperAnimation = createAnimation(); @@ -81,13 +111,17 @@ export const mdEnterAnimation = (baseEl: HTMLElement, opts?: any): Animation => contentAnimation .addElement(contentEl) .beforeStyles({ - top: `calc(${top}px + var(--offset-y, 0px))`, - left: `calc(${left}px + var(--offset-x, 0px))`, + top: `calc(${topValue} + var(--offset-y, 0px))`, + left: `calc(${leftValue} + var(--offset-x, 0px))`, 'transform-origin': `${originY} ${originX}`, }) .beforeAddWrite(() => { if (bottom !== undefined) { - contentEl.style.setProperty('bottom', `${bottom}px`); + let bottomValue = `${bottom}px`; + if (checkSafeAreaBottom) { + bottomValue = `${bottom}px + var(--ion-safe-area-bottom, 0px)`; + } + contentEl.style.setProperty('bottom', `calc(${bottomValue})`); } }) .fromTo('transform', 'scale(0.8)', 'scale(1)'); @@ -101,7 +135,7 @@ export const mdEnterAnimation = (baseEl: HTMLElement, opts?: any): Animation => if (size === 'cover') { baseEl.style.setProperty('--width', `${contentWidth}px`); } - if (originY === 'bottom') { + if (addPopoverBottomClass) { baseEl.classList.add('popover-bottom'); } }) diff --git a/core/src/components/popover/test/safe-area/index.html b/core/src/components/popover/test/safe-area/index.html new file mode 100644 index 00000000000..c9ee522b986 --- /dev/null +++ b/core/src/components/popover/test/safe-area/index.html @@ -0,0 +1,154 @@ + + + + + Popover - Safe Area + + + + + + + + + + + +
+
+
+
+ + + +

Popover safe area test. Triggers are positioned near screen edges.

+
+
+ + + + + + + + + diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts b/core/src/components/popover/test/safe-area/popover.e2e.ts new file mode 100644 index 00000000000..58cca8baa7c --- /dev/null +++ b/core/src/components/popover/test/safe-area/popover.e2e.ts @@ -0,0 +1,81 @@ +import { expect } from '@playwright/test'; +import { configs, test } from '@utils/test/playwright'; + +/** + * Safe-area behavior applies to both iOS and MD modes. + * Left/right safe areas are tested in landscape viewport. + */ +configs({ modes: ['ios', 'md'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => { + test.describe(title('popover: safe-area'), () => { + test.beforeEach(async ({ page }) => { + await page.goto('/src/components/popover/test/safe-area', config); + }); + + test('should not overlap the bottom safe area when trigger is near the bottom edge', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/28411', + }); + + /** + * Use a landscape-style viewport with bottom safe area. + * The bottom trigger is positioned at the very bottom of the screen. + */ + await page.setViewportSize({ + width: 414, + height: 400, + }); + + const ionPopoverDidPresent = await page.spyOnEvent('ionPopoverDidPresent'); + + await page.locator('#bottom-trigger').click(); + await ionPopoverDidPresent.next(); + + await expect(page).toHaveScreenshot(screenshot('popover-safe-area-bottom')); + }); + + test('should not overlap the right safe area when trigger is near the right edge', async ({ page }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/28411', + }); + + /** + * Use a landscape viewport with left/right safe areas + * to simulate a device rotated to landscape with notch on left. + */ + await page.setViewportSize({ + width: 600, + height: 400, + }); + + const ionPopoverDidPresent = await page.spyOnEvent('ionPopoverDidPresent'); + + await page.locator('#right-trigger').click(); + await ionPopoverDidPresent.next(); + + await expect(page).toHaveScreenshot(screenshot('popover-safe-area-right')); + }); + + test('should handle a large popover near the bottom-right corner without overlapping safe areas', async ({ + page, + }, testInfo) => { + testInfo.annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/28411', + }); + + await page.setViewportSize({ + width: 600, + height: 400, + }); + + const ionPopoverDidPresent = await page.spyOnEvent('ionPopoverDidPresent'); + + await page.locator('#large-popover-trigger').click(); + await ionPopoverDidPresent.next(); + + await expect(page).toHaveScreenshot(screenshot('popover-safe-area-large')); + }); + }); +}); diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-ios-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..7380d98ef50fe490662070bfd6d29895210fe02b GIT binary patch literal 14448 zcmeHuWl$X7*Cr4k3Iq?X0TL{@LxMZO9fA!q4DL1|K|_GR;O;&UWCnM4hcJT$cV}=| ze*fKftG0IEm3sHXe%P++s_xU(w{Ks0&U4RmZun_(U-*XlSp|6r?|Cd8O?w;2CM2uSne2(j#xHX+u8%I&Qtl64=y-J~k(6>+--% zZDzV11d4f&Lu9Oe7|5dJe%B<&6}hMDC?fTX>A$$S1U$SDvJOQL5%UdeG{$*Gi}o?%-pZFX;ZCF$oZW_~Na3|tze6y8eDhDK;DFfmo*s+TzZ5qSz+*kZhBf2*df^x_5Q*zuC>nmoWu^x1F2f;mN9NBi1?e6Bm9W5qvXNl?^&QT_#Xl%Qn4 z{F3Z?oL(YrdNy7~ife42-{m@ArIzQKLSxF7!6HqhH{593LfZK0)cuc( z#rY9ATn9K6ypv7hviWhvL4cq3obt`l1JvivIYw-tEMB62Mxho&j0?7choPLR<4B7* zUqvQ~@p1oD@(}}i2O#8r9R2Dmmo_YXe;lsouUCn>8#XhQ?+@{tQdVfHs$3!l@3$m=9`cNRH#$8jDNQBY z_xGf|aT*yneP7{q6MX~+QEMvb_@HbPoU}S)rcbB~SraIV#IDJK*`*6id&5+BY~hxOZxs_QLqa+(_a{~bFs2H1P(``U zY{;o1!gKq~^TtKRf+poH%A+C49;f>4sH;pzPxKn4sMm7e=w^l2(#B1puAPh(*9{-O%9)HXiK_F;7P%oX6{GcyYHgTr#$`msw&$69co>cFci$rX2Jop$4A zYwfa7jd!-86-!WrUJZa^-Q{ol-U$*Qi{8Xn zF6dLWcvF7uq9{u7GmHGC^lbE6FFmjXlhT5&NB&A~#=(d|UZbEOQW6tMZCweP8{2GC=^I_@iKv)oriKC-^M>;)mRD+B=ll z%x`h9)NQOMibTh#+=33v53;m)phL4-j-huSM3&lmPItkoME4vZEFEaE!$GgH1=D&P&OqIJH@(Rz-h|6 zlhRxngoGW(v;l`MWI3!cXlP`;44qx5)Z^o>in{^y)F-7rN89f{zbP9=?Wr8~hO6&t z$Ic%VWc1D+8jD-cfhac}sw{i(zw8+~&Dp+)B45+{-973kemmH$6fcvEZ2fE`nAxiK z*ZFWL9KJvAVQcO2#KdYB*_;a3jW9^IU0QU$9=NJlT*`30@3@-pyt$wj8jVh3D=}13 zjrxW@;-RaNUt}06*?Dd_pPM}e4@uWKu$dlhT@Qf2)dV$V-J2a2HU@A*lb4aL9YAcX$o-f`t9Sjc_k!mB!=)9E9R_!cvR&i(I_lj|CK!9?rdJZ-$(th_*8<( zPT5>t+srI}>-Zv}SLX7M+E0!Mu%qGi-jQIX*J3J#lmxLbky6`;&Z5>l7TVB%+;*!#9MaK>i+9-N@dj%CZ3r*_S!?Vl(Mx% z-OQpZrBFqYYKkN+5yOQ8_Jk2_WNEy+j`8u*-j43fzL~h)%g~F2=GZh*CV64bI%w|4 zWqZ%JAcx}urKuh|fTMN{poG_=dSCe^As`}=YF_sZ6-htHV!^H&0;z(6!EYn$GkQSv z>hn;EdO8?iD^QgrovrH5lMUE-R*f-Q$#Y27Pmk^HU<LWb@=Q;Z9IW zT&3QXByYAMt;M}#D0j~g%pJG;{y@RhvPqf&x~d~*VxzLw=k0$+R?jf(Sd5!m_@+hFGlgA-s!N0i^N zROg0D;EQFrFAZiNWw;2;x&`sIP!Y%rQ0fmdc0?4y-FN zod2-Es;s>;6px-cptOnrtmz%^9`?BpxaV_(@!czLZ4Zm}`9@?WnWT7MXQQ8*(bR}Mrp8FFd~>;;aDzH*k@7|PUd04?oY`Rd?Nb8*nGIPz=`RbF82 zTT_cmB<0TNXd4&R=}CoUf_L3(=DzL%7Cc}oDF{^ zfM)OTB}<~T`k6cRdTp0Y3OaCtGP-%fXrn%>|E zuzRD>ufr1dBd9yF7-_Mm8FOowz*2T^@(Kc%wlH^J||1-+BCcf zEV0NOz-3XQv@)zd7bh%4eE&hg?W!v8j>6tPxFv{$GfLbwUx-WWO1OIjwQ;47zF|V1 zJmNUBnP#tmA1R`Mz*w;EZ?jwcVjgGzTr=Rf_5RMpLt744T6237cz<_xs<4e^0O{7s z>C@3Zl}e(r4{MD+H&R8Q7f`*$(tqb@-&bDbZlDlK(dMEKOD_rSCU)wd>-c{4)&M|; zw1+}q?JX??NU8(1g^O7^{c;xVhu_7c;`gIm->FRBW;BJ#7|?2OLqgz zyMX6ux`QBpP>s&>ZR)*cZ^v?mexUe#-R&6E^H$8~ey13#zkJVD#i$&|-?i z9L}Cz0NC^ccnc3m;!tyE-|1*Hb#fW(F4AzC+ct-7=M#T*9oY?>>ziS9-2Gx}F_e7JQW5ED2!0v-lLZl1o3qde+$X^SB{crh=WhiK({VfOq>??eNGHBvRT=q=TQ4 zRem&3q^`oms~eZj(DEsOa)N9~E1q%*tztyQ%DRk&#}}(6DYH^p8*q%X)3X-;<~wz;M{Pld8DhKIGr1rGBH0B#WCURUYrRAj}sSDKzJzdYg*5D)MXx)4^g*926bo!28)&(*oB=3Z{ zME+f$9f(>XrX}$#A)^9*EiKu16Qe3k5Y(p-%cl4LOV!!SJ`d$4FwCP|YIa!29{Bp4 z5JPZ3k$-E*VJznDe!)W4arMZKM*vaXmnZetuU9XzRFYn=Wi0d*Q~MR+`#$5eY5D`U zaePn_staBEsk=1nZ~oWy0wB8S^<89x#t~$|KUexB-~Z_*$I?-$Sg1((b0iO9?-OKf$mf@_o zE8_BTTzsx&{^fVW<_n}z_P{ka$TLdAP^t+Nqaws$*s9)iKf&Kw{z_^3D?S636eX6d zc0*aba55ga(hy$J9lE<~n_pC(G5&q9<=SnKw0>4?CMSMmSD*wpKY#yzr%T_=&Z{mST z!%?JBML$o6->{6_MAQvCvikJuxk-@LTDkXzY3fNI$O5D3XFl`jjcjwP^<)!m)ZHc< z`)-+F)lPV@;mc&ao7joTP5;8yYM!^U_N^iV`Z3UqQ2y9{bSpW>SVg(<*J^Y+ZPSe{o%0FD_D{jEwBJ69}&~R^EPokMWn=@pp_O9hB&#IhDEQNk9 zL5k4_IRbKo1_19y)cA*6@>y!9Y@&mL4F?W<9~udn*Ic{@1rRyiwlV&w&FI9C{4~M*Up&FKqd!>`A?rFuwTg%`@X|#7 z4V(Jm<{YA!<#uBlzvOUqR^sirQA$r-EZDxkdNlj<{Z80wa-qt;?yfxytu0d4a5Ix{ zeq=Riu698H4F97K?vxx#sG9ee+iRs+!yMLs=;t@w%saVk!8i?)8J$+?d!BT9a6beZ z4fcZRSg#*TVOhHDarcT)w)RJ4r2aL$UZC4}Z$%-4@(EdJWML{h*c2x`NM8nWutJ*- zUVKEJlXC4F@r(40k7SXJN`Ucd57bRIT$SG?zrMNsNvmqSUDY$ekKC|)tQ?N1?ABg& z2ok)(Z%VUd%5Bjv3&Vnj3H}myxWUn?G}_7zYu>`yAE4@3)A`LNlw){!SS(;|%wevS zEcAzmWsAtS=adoM9bI~I4e#x7Q$=jm2dZvT0+RMAR^$fKNMj`Aw1eddQ-->&%2{@@2zZy6+e0pA zzsulHK<-YXe{Up12UGO2SFlX4@&`auCGYvKk}_p?X}I0rSU%f)dsSd4e7|#LphmmY zvX}KIafwv1GoAvq0jy$T0-)Xt(+2l7dDF#bR`|R<56exjC_{KQ^apWqLD(~U#qbk- zw)*e^4c0pA_v1&O@BY=&VaJy}HxG_pmn96un9G251bQ)$+IJy#$=@-*NoG;rm=p#P zTIIE$602UiTbsVIH>PwRDgY%2EP8?On=26FedL7aGfX$hXF3O`n;&RYi;Z9o!%yf? zr#iI@)t1P{!M(zTbW-<~3k=ZIA)lH0K*2!1V-r3I$PAo1lNrpobTIzZ8B~e%h|PC) zY!ZGrHCxRk5zFKj@!am1_b5Ggfg3o*5M?z|+gbX46ij7ahQFEQTGfQcGuvOCEkub= z^=;=uDtx~>8zQ{ATuCz|7h@EK{|t?YlQ&+7o=~*mjsiOUkd)LGnD`b-*fnPXC% zsfWRZy#_d_BXM}!H9fKeb;pAGKVhO7J^9BG{mW;)2BCeVlcqrX{Otdm{(npS*D=wI z_=@g-NV|Xd_mj^+JgcsOKh6Kv_$ZP+kxNEnZ!z>|RE{ z48u|TAqdwkS*Un$)j0@xLL*8^n{xUIg{ky4%vI_^yZGo%(K$)&T#Q3v8 zH}21$&m2rF$4l0PP&r}p3R$owANj1Y!g2{~jZLd{;snBnUkWk!^qCx}6Q^>Vuafqt zXPo?%diLJ1t0gsN8t4}SIoQ>4tEw+obDxb)enpbV#dhyzOOlBW_}j2X1F-wY)M`9n zb$qQJoO+WnV53Dd*L3w|n?^=1ufM-BO4q}F1YUo8S`0HKO=f#L2h=SeoiNyqVB1;X zlt4`(*kDkbJJ(UDL4zg8qyA1bP3H7`qBop^ztMEn@!*=L< z48R{%IA4(<{X+Tu&C@v=Q2>P`d31}o=K+}9R~Aq$WOLk0Gh(S4pFI7^m1Z8MbT@_Q zrU4IShzR&^6wczwQ&kH!T%FJE-ni6a4twoYHum9f1LBXmp@*Y{T=Bc7Grb(z$CNZ< zn}eu~c1KPgA)JzvD2#dPa$J!nw31B>0YW5l%O`zwH);-}76!ICDks_@4FzO~{$ z3#s(n_ZNHTztJ1bMZVW zr`;#`CuOFjX?zNPd+D%}*dF@8&$O@Ad~fbTjXfitVdtUMJWnEfuxxWKK9iS$2nc=B z1YpPS`-s`j*2+Z(_&S~LPB@OjdWc^~FS4`VNK$w^?j#*(;TqD5YimCo7V9A2+^&;T5GqJ;Y@Tpxcn9{B8M04dRn6$f3}NP4s}^4U8OrbV(M z2t_=*&<7BOo6k(JjSpeu1ggvV85}%=L;NDYwRN3i;50p`5|_9Iq}vs zi)X43^`h=PD7`3pEn%m|EeP{#YU-Sq^7Yw3)w{vfP0U|a49I*Ws|-Z}W}WCPWt}*N zLqu&7dWrpd$jNW(4YgC|^{efwW^D%Dpeun$E`D8F+VVgXijNf=1FbezY$B-r#r;OS zc=G2+B~j*pD+|rr1_nfuiQz656ZAbN@UT6tnrQ=3Y=gKBuI^~KE`4I%%rE`;`V8}f zUS_q;F7}&W7;P$;|30Lj*@5q`n74tVY4g9vA^$E(NZoa=H&Rm@y}vt7QnOi_F4YAB zfhq+Ycj1I})H%cPf9&}oK+LSpq>7JlDu@G#66phqiC40w{%38ir>Wolt22V3MEcN9 zE^_0CLOlo7H@x-OE;tQQLecGe@|Z^G;~N-5HW>BT9FMm{2hv%CuR$DNPl3ylf6|RG z#%Hv@W8=`HaRjHA?7jvW2mgIiN9j>g-bt2IesXj~`)?2aCvN=$Rv-8&_ZKT4U}E(Z zdA_82nQLd7BlYz3^!obxY`HPRvQ8L0!}>E*w{&;jdmK0^Al-;5zQ0kz;nk0+qOq7& z`hs5Too8;TrriUTR=p;)8%CTi47g$H*&1NgIV5%a+79Zz|b2}m6lDj$VPl-UVe5>5|J68 zeVKB3UmQZRzbvM^Cy%_qQ6hVsB_e`viIa3-)dE6<-OCtK{i5JOyG;Fk1Tm6^euED-Elo(<*%WZ+m4cU&fQRlm z84WAAzqEZtAPhwNb2sS_J`_xiP4uf);ghN244IvHR@kN382-KaN{Omzg6(VM(Y+LW zc0`ZG+w2mPHyBWwu@IUkW2+WPYb1iOH_}oAzq?xb53CO+Qq^y)u6`eU<`Bqt0HAct z7I>F1$Q@4}8K@w5c$D<#b2^*2xOO(rRvg*H8-*f9ahz7#EvX>@4+N-FIz2lpz{rSM zzd@q6?a+fS`<6-8m3t%dW#sU0tT(Q6T1*i%Q01_r)@ktk9_iZcpPHI3r`zYX;vF$S zl8E4bzWJ#Q**gxFd2q#Ke2X8`H!|m64rVj9Zj>!!6jI~jGR0aZO;Db*%LT zv%3nJ>(1A_&H`z`U09MHA;A_>tyQU74n*T(-~Y6m<6m7DVw zt;TxF6yv!YdJeR3fr?rd4KZ0rBQrU)Y} zln4o9C*new-g4VYN=nA^s*L~1=3$x4D^4c=u1cq5K42L|Z`e9|uW`UeGb|h|*_lZ# z;$LHdxkp7!NTv8=U6Bf1*TMxfU*~Mk-&j>e@L0a!?1pNHdA*UoJ!6k~e%hNbMkWNR zoP$UFz0YbiqZ3;u5p%^a@fsm15{ey=Qqfc%BYmPRk+7rqI3u&tWCHUu9>U32l5}#3 zX=yCRaWTol=}RvBY2(K(QhpGDA?(QZAu}IR%!WXQg-57Lc5C!G-$~-KxW161$tnEb zz>DO{RhMj0asJ}_uB5+ZlBDrEWo9AqKlbrr9AhDF$1l?N^G}ZG&784aXUZ4m$k!B} z+op`Ga}kIK9&kA=e`Hz^6%#x6@mE*JCv?K}A<2Ozj=$q3k|xM}LuJ?at^cpm3SrLW zQ2ubksX1k9(Pfg8Z_H-`;+;)W>bK6Xc&@T1rLF+!?eingd5vZLl&dt}q{h*<^GzJ^ z+Kkc4HE3&V7f;(^h`oF=u^3GDe&-dj1V@Yi@=Af@&Gswz1%A~|me_wm$ZFBVeFZ-x zvi>tUVd~#IzmVLBXA2H(U(sPO7&SHZziL)%RyD}VZIU3^Y@7Mx5l~`_B0Paf@x@%@ z;SDVMvIH*B8{-DI?XGY_^%CiPrd{4M=3xJh<)X*YfdH(i45a**OqZ^S?7l09gB zJKW99G|LM&iXd1y`Q+K?cU8qO>*wd^MApv!yJz9&D*G8zw~Ky(MyC<1W+@4uq6E_2 zTln4$JDppKoZ)$VSE2iUf=M+KJO6wBNfF_IhFV#=irlH?f&~XN{?ufnY6ECXOA8$x zT_0cV$BN-$!H%LXX&K3hCTH6VM_oYIv*f`7?qm*eF1n7TfCl!X`*qvma5(Ezfiwqz zimctEqAkfUe%02~Q~N#h!Gx|GhDqwWmeOr*=CU6pa?mykozGvw3jS7y{O^z{xA%X7 zOlJrmcBYvi%^$)!hVfUM zU0cu4Q2ei`vu!zb6!w3x@P8%7xjy+Wo6URFDHTjP0U08fku5MP=JJY8kd{%Q*;i>h zFDWfmVIs^NJ)EteLBH5m%PJ&`Q{YnPDpvfyAFR)us9@!ip6tf@U4w*5nA_aM&kg_p z*xf#<4V6_O#>U{d*sW+KAtgyKkn1YIg0t}i8~ z@+szPX!?2KGxN~VLF-bVoCA1$&TMc)HBC$ccBbCtrBcu#=KIQG3Yiqv$#Z2nRFvfv zHOW)r`tqJXf37gWD`OEllBEnO0NA|}4rU8~2NC*Ve9zTu)=9!Vh(H4MxaYgdjx%_en@>jvND`p}#HgNwVAN+1b?Yxr~gAa@&8N&$5MmpIFk66MPvM&D%K<)Yc>UX(Aw*S3nI$m)?)@-vsYVRA}3LVHPla#uQYAEGL#uhIV!tQg(r0AEJx$pnqb z#K?)B6DSzighcSl`dDMACZf9Zw$Dkix@d4adU7E)_W;E0=W_a~^;M=@T&I#mn`nfQ*WY^;060 z;)5xLa=AWK$JBJ`*RR)WDTZJ28_DF}#3#KO?oSfn;N|Zm`7&gsnambY!%f%mp!48d zZTjofVse6@v+=ByWn@cF-@x3al6M1Tcyqoh;Iw8>7OpTTAG=(u!?D@N_Za?PLr{6n z2WA@9E499Sf#qDw>VKt-$+JSc&`~zICFqw8>?H&d% zH}ApaC~4-Eq-JS&zznENC1W^tX#zF$qe%9}gcN4?BW_+Kw~*zTp@3GgPlZ z%K`ta)*e@UgU^=D1)Nxi9%=TouS#@?w(ca>Zt(4~T(89FD;Z~JG9%n^?DAeC)$K10 zTr{0lpSEzr__s)?6a+S&4D~+yDDbi7lc%l7!Y|+$^fhQKGU>?fJaMs)Z_APbW5 zDv1O~BJv2A(BmId7{B6KEkpCfV}SG(w$!92_N%RYkwtBh39DugbYEF89^QmznpiT% zf71ck=y!ty&(8cGa|(56crnr^4iT_`a>3ad2y?1W_PzCJY=+BlKT5LVzt4gWu)*?= zkg3oqJ}1E#V>&}P@cUd{^NIY}0nhfI;HC0$UVo}oOP$m^BR>zOqmRLBge5Lae4udn z(=qJ~Nf8*<$Y>78H>%pc^Oj5;Szu3+Q5_)dZobSiOvqo)c+Cx5yhWjc#4*P`AeCB) zr4NM{rd2Cu$iJ538;A1xjGR6K?%j-=H#Pa9*82lxA%eEYRfgn%-W4pD=iT-ZWg3+W zXRZhm-)|=IEuif|>!kn*j-OHSQ8tawE9)_w^^*D$XwB#_N`1x;(y9v-#8G01y#B#h z(gfX83*Az~njIHzH+k;>oqPQii2y{I zLQ}~%He^KGF@(OuVE2^IR*z@MnR%3h1#13ORu;3CW#YdLuKsQTK!iD2D}JY4hARK~ z>EujP-I&aa<&9OMK`0_m$yMwS$*-SZVwY_hCEa(hvLayocj&>^ToXki9jf3*$?jC8 za(4%PZ}_}g{p}>v^LiBuV*!P}2dqUgz~vXoviKC9#3tDnj#fhAW>C@G$L_)PY$_j5 z6ZBbGJM0p$nKxeD5!ci#zDoDPDbd;};l#-lbYB6nxmbu2P!zSrgcx)QYv&gy*_!Qh;_`aCO(-^xnY%4N$z7E zRh>)Ap19K~76PMUzwjQC>O&IEAVFm_1q3dfqhaNxK>MnwQ1CSzme|M%~F(qbRME3g#ksO_|yBlGTO!Mv*1`i%opsvAjN! zCXo}BgV@$jli6~_g2tB3qRwWw2i4ziZ_90n8zsd36xg1hTM$A(@%PNYhYU7%cZtBu zidx-5PqX8S)W*=_tu}Pna>moHCRWwj?Fror(hVAMyEk3caRB>8x2zMC?}M=UYaaLN z^vzxnvK9Iw$!YV5wNOG~(P){1+8OzAgJD(&`c*t2y=%;j<`S*c5x_piqiDrb1^aU$+BS&ozJDJmS(`KYM3 zJ43%504o$Qhe&J1P2p0+O_HdDyQyf~nS*@R+Jg-EdcL<~^RSPDLc-cY1HR2^qK`LF zGq{-#rYL#+Fk z@uMIJu{4wF4xx3d^0c(*;l4FMrOJ`m+uVKteY$f+Au0eObBRbq9(u-=xvj74M!38v z@uH&#dl(|8@>nZ-`ZV^x|GAo+>1k=%Z|gMUqW3sW-#iJzgYf$Wd>Ke8l)eb@a_DDo z_PXdY3_rhsNTgq+UtY==hS?5-z?xP6i|UQ6FVm0RzPPp#uH+3?{^yJUY|yLD7X zll)%4jyEzc90R~vG)|IUOtz;Kz$xqFDX!&`;|ETCtFS`085J>+`#e76<;!#eo6y%-kBY>BpQ2_=Nrx8FlJ9{3^g zp7C45H9OPvB97sy8;;EXK+0HZN^%gnMN{-czCPKRaw zTK0;dE(%^%+%nx2Di-w5M9ADM8l6ofbVPIoj{zH>Co6j1x(-A&kV;7bdYaNdgbK~7 z)!{KWfe^pNkF($Lp)L}eP_bPt5-;gDy4Na9uf`aiJ2(oM$5yO%H5cRyq57RkmC9W^ z#)lFtX{U%6`@6fQ0W6Wl;^qNH%3V=@azci@hYQAZ-rLBTo{inhm{D<_TEEhg@_!VQ z@wgg~gE(EgWO2#msYH{A$1NzY4cNHBsypSx_*~8qotFE)I6k-l{igB@JAY%3rIqS* z$H!UZ_lDDPTS_F!=jl@wV+~WsQ-vOEnS0iQ;>KOqAr1n*IVSe;uXVr(*|DOMi!rXSZKO8 z`83aTkX$;Yj%q+FafzoF`mHperZp#fovDkq+^?#WYP5rxmpy8<9~q)+|B~#{*2yU% zDW(?Dg|b!!3xOJUNgu9-c##DKO)xcw-(C4FL>ka{%=h$WtcFPOeh^;+?nt|VrY-Ga z%Xi1yl6GRz3LN1dtgq+WaJB{bwR=l1>dSoq%8Z8f*`j;NSCh92-T@8vj?;a_X7?(1 z0{oNjCzzdsSAN4K#-BtSTBf@A2dRR8ttaJmrgP4GF*TiF9|Pugsa(eyLv-R3VHaOU z^a)-4Re3@89r|X*I|8T-6T{FtpJSxi_y$#9ZOCwJji++~b7s|U*=&eSE+#eY0f9do z!l!icHRw^+K@0wO)f$SoMlORGb^qx3eJXnfoPQ|r|5w=`*WkzPf)5YAiPI5}7uf%h bfhTBiJ!;K?3*pK~3z~wAs&u*Jmv8?GW=Jq& literal 0 HcmV?d00001 diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-ios-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..fa56c8b3d614a6c6feb7d0912ba24766aec95273 GIT binary patch literal 23407 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

; + return ( +
+ {this.renderHintText()} +
+ ); } render() { @@ -1246,9 +1253,9 @@ export class Select implements ComponentInterface { [`select-label-placement-${labelPlacement}`]: true, })} > -
+
(this.nativeWrapperEl = el)} part="container"> {this.renderSelectText()} diff --git a/core/src/components/select/test/custom/select.e2e.ts b/core/src/components/select/test/custom/select.e2e.ts index 884fcda47ca..c21f83decab 100644 --- a/core/src/components/select/test/custom/select.e2e.ts +++ b/core/src/components/select/test/custom/select.e2e.ts @@ -73,6 +73,57 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => { await expect(wrapper).toHaveScreenshot(screenshot(`select-custom-parts-diff`)); }); + test('should be able to customize wrapper and bottom using css parts', async ({ page }) => { + test.info().annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/29918', + }); + + await page.setContent( + ` + + + + Apple + + `, + config + ); + + const select = page.locator('ion-select'); + const wrapper = select.locator('.select-wrapper'); + const wrapperInner = select.locator('.select-wrapper-inner'); + const bottom = select.locator('.select-bottom'); + + const wrapperBackgroundColor = await wrapper.evaluate((el) => { + return window.getComputedStyle(el).backgroundColor; + }); + + const wrapperInnerBackgroundColor = await wrapperInner.evaluate((el) => { + return window.getComputedStyle(el).backgroundColor; + }); + + const bottomBackgroundColor = await bottom.evaluate((el) => { + return window.getComputedStyle(el).backgroundColor; + }); + + expect(wrapperBackgroundColor).toBe('rgb(255, 0, 0)'); + expect(wrapperInnerBackgroundColor).toBe('rgb(255, 165, 0)'); + expect(bottomBackgroundColor).toBe('rgb(0, 128, 0)'); + }); + test('should render custom cancel text when prop is provided with alert interface', async ({ page }) => { await page.setContent( ` From 70b1237823dd0cdab852486a6b2cbbfe0d0aaae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bengt=20Wei=C3=9Fe?= Date: Wed, 18 Feb 2026 11:25:43 +0100 Subject: [PATCH 31/55] fix(many): clear timeouts (#30851) Issue number: resolves #30860 ## What is the current behavior? We have flaky tests in an ionic angular project that root cause are not cleaned up timeouts. I commented out the timeout in the searchbar componentWillLoad method. and after several runs no flaky tests at all. My guess -> test runs faster than the 300ms it takes til the timeout runs. Everything is cleaned up, but not the ionic timeouts (i think i saw something similar in other components) ## What is the new behavior? Timeouts are cleaned on disconnect. ## Does this introduce a breaking change? - [ ] Yes - [x] No ## Other information Testrunner is vitest + angular 20 and latest ionic version 8.x --- core/src/components/app/app.tsx | 25 +++++++++++++-------- core/src/components/content/content.tsx | 5 +++++ core/src/components/datetime/datetime.tsx | 6 ++++- core/src/components/fab-list/fab-list.tsx | 11 ++++++++- core/src/components/img/img.tsx | 13 ++++++++++- core/src/components/label/label.tsx | 9 +++++++- core/src/components/searchbar/searchbar.tsx | 18 +++++++++++++-- 7 files changed, 72 insertions(+), 15 deletions(-) diff --git a/core/src/components/app/app.tsx b/core/src/components/app/app.tsx index f7aba5fb152..c1c7e5366d9 100644 --- a/core/src/components/app/app.tsx +++ b/core/src/components/app/app.tsx @@ -14,12 +14,13 @@ import { getIonMode } from '../../global/ionic-global'; }) export class App implements ComponentInterface { private focusVisible?: FocusVisibleUtility; + private loadTimeout?: ReturnType | undefined; @Element() el!: HTMLElement; componentDidLoad() { if (Build.isBrowser) { - rIC(async () => { + this.rIC(async () => { const isHybrid = isPlatform(window, 'hybrid'); if (!config.getBoolean('_testing')) { import('../../utils/tap-click').then((module) => module.startTapClick(config)); @@ -60,6 +61,12 @@ export class App implements ComponentInterface { } } + disconnectedCallback() { + if (this.loadTimeout) { + clearTimeout(this.loadTimeout); + } + } + /** * Used to set focus on an element that uses `ion-focusable`. * Do not use this if focusing the element as a result of a keyboard @@ -78,6 +85,14 @@ export class App implements ComponentInterface { } } + private rIC(callback: () => void) { + if ('requestIdleCallback' in window) { + (window as any).requestIdleCallback(callback); + } else { + this.loadTimeout = setTimeout(callback, 32); + } + } + render() { const mode = getIonMode(this); return ( @@ -113,11 +128,3 @@ const needInputShims = () => { return false; }; - -const rIC = (callback: () => void) => { - if ('requestIdleCallback' in window) { - (window as any).requestIdleCallback(callback); - } else { - setTimeout(callback, 32); - } -}; diff --git a/core/src/components/content/content.tsx b/core/src/components/content/content.tsx index 361939f7c27..507d05d5450 100644 --- a/core/src/components/content/content.tsx +++ b/core/src/components/content/content.tsx @@ -188,6 +188,11 @@ export class Content implements ComponentInterface { this.tabsElement = null; this.tabsLoadCallback = undefined; } + + if (this.resizeTimeout) { + clearTimeout(this.resizeTimeout); + this.resizeTimeout = null; + } } /** diff --git a/core/src/components/datetime/datetime.tsx b/core/src/components/datetime/datetime.tsx index 3411f28eb57..37d8a490723 100644 --- a/core/src/components/datetime/datetime.tsx +++ b/core/src/components/datetime/datetime.tsx @@ -124,6 +124,7 @@ export class Datetime implements ComponentInterface { private maxParts?: any; private todayParts!: DatetimeParts; private defaultParts!: DatetimeParts; + private loadTimeout: ReturnType | undefined; private prevPresentation: string | null = null; @@ -1077,6 +1078,9 @@ export class Datetime implements ComponentInterface { this.clearFocusVisible(); this.clearFocusVisible = undefined; } + if (this.loadTimeout) { + clearTimeout(this.loadTimeout); + } } /** @@ -1175,7 +1179,7 @@ export class Datetime implements ComponentInterface { * * We schedule this after everything has had a chance to run. */ - setTimeout(() => { + this.loadTimeout = setTimeout(() => { this.ensureReadyIfVisible(); }, 100); diff --git a/core/src/components/fab-list/fab-list.tsx b/core/src/components/fab-list/fab-list.tsx index 1273673a917..1803f7f2c30 100644 --- a/core/src/components/fab-list/fab-list.tsx +++ b/core/src/components/fab-list/fab-list.tsx @@ -10,6 +10,7 @@ import { getIonMode } from '../../global/ionic-global'; }) export class FabList implements ComponentInterface { @Element() el!: HTMLIonFabElement; + private activateTimeouts: ReturnType[] = []; /** * If `true`, the fab list will show all fab buttons in the list. @@ -18,12 +19,15 @@ export class FabList implements ComponentInterface { @Watch('activated') protected activatedChanged(activated: boolean) { + this.activateTimeouts.forEach(clearTimeout); + this.activateTimeouts = []; + const fabs = Array.from(this.el.querySelectorAll('ion-fab-button')); // if showing the fabs add a timeout, else show immediately const timeout = activated ? 30 : 0; fabs.forEach((fab, i) => { - setTimeout(() => (fab.show = activated), i * timeout); + this.activateTimeouts.push(setTimeout(() => (fab.show = activated), i * timeout)); }); } @@ -32,6 +36,11 @@ export class FabList implements ComponentInterface { */ @Prop() side: 'start' | 'end' | 'top' | 'bottom' = 'bottom'; + disconnectedCallback() { + this.activateTimeouts.forEach(clearTimeout); + this.activateTimeouts = []; + } + render() { const mode = getIonMode(this); return ( diff --git a/core/src/components/img/img.tsx b/core/src/components/img/img.tsx index c83f0fab3cf..0afce19d1d2 100644 --- a/core/src/components/img/img.tsx +++ b/core/src/components/img/img.tsx @@ -16,6 +16,7 @@ import { getIonMode } from '../../global/ionic-global'; export class Img implements ComponentInterface { private io?: IntersectionObserver; private inheritedAttributes: Attributes = {}; + private loadTimeout: ReturnType | undefined; @Element() el!: HTMLElement; @@ -56,7 +57,17 @@ export class Img implements ComponentInterface { this.addIO(); } + disconnectedCallback() { + if (this.loadTimeout) { + clearTimeout(this.loadTimeout); + } + } + private addIO() { + if (this.loadTimeout) { + clearTimeout(this.loadTimeout); + this.loadTimeout = undefined; + } if (this.src === undefined) { return; } @@ -82,7 +93,7 @@ export class Img implements ComponentInterface { this.io.observe(this.el); } else { // fall back to setTimeout for Safari and IE - setTimeout(() => this.load(), 200); + this.loadTimeout = setTimeout(() => this.load(), 200); } } diff --git a/core/src/components/label/label.tsx b/core/src/components/label/label.tsx index 6f8ad05a4a7..cea7a844ec4 100644 --- a/core/src/components/label/label.tsx +++ b/core/src/components/label/label.tsx @@ -18,6 +18,7 @@ import type { Color, StyleEventDetail } from '../../interface'; }) export class Label implements ComponentInterface { private inRange = false; + private loadTimeout: ReturnType | undefined; @Element() el!: HTMLElement; @@ -56,12 +57,18 @@ export class Label implements ComponentInterface { componentDidLoad() { if (this.noAnimate) { - setTimeout(() => { + this.loadTimeout = setTimeout(() => { this.noAnimate = false; }, 1000); } } + disconnectedCallback() { + if (this.loadTimeout) { + clearTimeout(this.loadTimeout); + } + } + @Watch('color') colorChanged() { this.emitColor(); diff --git a/core/src/components/searchbar/searchbar.tsx b/core/src/components/searchbar/searchbar.tsx index 0c038962a53..2830d75b73c 100644 --- a/core/src/components/searchbar/searchbar.tsx +++ b/core/src/components/searchbar/searchbar.tsx @@ -30,6 +30,8 @@ export class Searchbar implements ComponentInterface { private originalIonInput?: EventEmitter; private inputId = `ion-searchbar-${searchbarIds++}`; private inheritedAttributes: Attributes = {}; + private loadTimeout: ReturnType | undefined; + private clearTimeout: ReturnType | undefined; /** * The value of the input when the textarea is focused. @@ -288,11 +290,20 @@ export class Searchbar implements ComponentInterface { this.positionElements(); this.debounceChanged(); - setTimeout(() => { + this.loadTimeout = setTimeout(() => { this.noAnimate = false; }, 300); } + disconnectedCallback() { + if (this.loadTimeout) { + clearTimeout(this.loadTimeout); + } + if (this.clearTimeout) { + clearTimeout(this.clearTimeout); + } + } + private emitStyle() { this.ionStyle.emit({ searchbar: true, @@ -358,12 +369,15 @@ export class Searchbar implements ComponentInterface { * Clears the input field and triggers the control change. */ private onClearInput = async (shouldFocus?: boolean) => { + if (this.clearTimeout) { + clearTimeout(this.clearTimeout); + } this.ionClear.emit(); return new Promise((resolve) => { // setTimeout() fixes https://github.com/ionic-team/ionic-framework/issues/7527 // wait for 4 frames - setTimeout(() => { + this.clearTimeout = setTimeout(() => { const value = this.getValue(); if (value !== '') { this.value = ''; From 814c2e5ccd6d5bfda12bdf13a566cd66ff830d5b Mon Sep 17 00:00:00 2001 From: Shane Date: Thu, 19 Feb 2026 08:57:48 -0800 Subject: [PATCH 32/55] feat(refresher): add ionPullStart and ionPullEnd events (#30946) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue number: resolves #24524 --------- ## What is the current behavior? There is no way to know when the refresher has fully returned to its inactive state after a pull gesture. The existing `ionStart` event fires when pulling begins, but there is no corresponding end event. Watching the progress property is insufficient because hitting zero doesn’t necessarily mean the user has completed the pull gesture. ## What is the new behavior? Two new events are added to the refresher component: - `ionPullStart`: Emitted when the user begins pulling down (same as `ionStart`, which is now deprecated) - `ionPullEnd`: Emitted when the refresher returns to inactive state, with a `reason` property of `'complete'` or `'cancel'` indicating whether the refresh operation completed successfully or was cancelled This allows you to know both when the user is no longer touching the screen AND when the refresher is ready to be pulled again. ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information Test page: https://ionic-framework-git-fw-6591-ionic1.vercel.app/src/components/refresher/test/basic/index.html Current dev build: ``` 8.7.17-dev.11770319814.172b4f50 ``` --------- Co-authored-by: Patrick McDonald <764290+WhatsThatItsPat@users.noreply.github.com> --- core/api.txt | 2 + core/src/components.d.ts | 21 +++++-- .../refresher/refresher-interface.ts | 9 +++ core/src/components/refresher/refresher.tsx | 50 ++++++++++++++++- .../refresher/test/basic/index.html | 11 ++++ .../refresher/test/basic/refresher.e2e.ts | 55 ++++++++++++++++++- core/src/interface.d.ts | 2 +- packages/angular/src/directives/proxies.ts | 14 ++++- .../standalone/src/directives/proxies.ts | 14 ++++- packages/vue/src/proxies.ts | 8 ++- 10 files changed, 172 insertions(+), 14 deletions(-) diff --git a/core/api.txt b/core/api.txt index 33582d0fe55..1a74b49cbe5 100644 --- a/core/api.txt +++ b/core/api.txt @@ -1493,6 +1493,8 @@ ion-refresher,method,cancel,cancel() => Promise ion-refresher,method,complete,complete() => Promise ion-refresher,method,getProgress,getProgress() => Promise ion-refresher,event,ionPull,void,true +ion-refresher,event,ionPullEnd,RefresherPullEndEventDetail,true +ion-refresher,event,ionPullStart,void,true ion-refresher,event,ionRefresh,RefresherEventDetail,true ion-refresher,event,ionStart,void,true diff --git a/core/src/components.d.ts b/core/src/components.d.ts index d690184aff6..582cbfcd3ae 100644 --- a/core/src/components.d.ts +++ b/core/src/components.d.ts @@ -29,7 +29,7 @@ import { PickerButton, PickerColumn } from "./components/picker-legacy/picker-in import { PopoverSize, PositionAlign, PositionReference, PositionSide, TriggerAction } from "./components/popover/popover-interface"; import { RadioGroupChangeEventDetail, RadioGroupCompareFn } from "./components/radio-group/radio-group-interface"; import { PinFormatter, RangeChangeEventDetail, RangeKnobMoveEndEventDetail, RangeKnobMoveStartEventDetail, RangeValue } from "./components/range/range-interface"; -import { RefresherEventDetail } from "./components/refresher/refresher-interface"; +import { RefresherEventDetail, RefresherPullEndEventDetail } from "./components/refresher/refresher-interface"; import { ItemReorderEventDetail, ReorderEndEventDetail, ReorderMoveEventDetail } from "./components/reorder-group/reorder-group-interface"; import { NavigationHookCallback } from "./components/route/route-interface"; import { SearchbarChangeEventDetail, SearchbarInputEventDetail } from "./components/searchbar/searchbar-interface"; @@ -67,7 +67,7 @@ export { PickerButton, PickerColumn } from "./components/picker-legacy/picker-in export { PopoverSize, PositionAlign, PositionReference, PositionSide, TriggerAction } from "./components/popover/popover-interface"; export { RadioGroupChangeEventDetail, RadioGroupCompareFn } from "./components/radio-group/radio-group-interface"; export { PinFormatter, RangeChangeEventDetail, RangeKnobMoveEndEventDetail, RangeKnobMoveStartEventDetail, RangeValue } from "./components/range/range-interface"; -export { RefresherEventDetail } from "./components/refresher/refresher-interface"; +export { RefresherEventDetail, RefresherPullEndEventDetail } from "./components/refresher/refresher-interface"; export { ItemReorderEventDetail, ReorderEndEventDetail, ReorderMoveEventDetail } from "./components/reorder-group/reorder-group-interface"; export { NavigationHookCallback } from "./components/route/route-interface"; export { SearchbarChangeEventDetail, SearchbarInputEventDetail } from "./components/searchbar/searchbar-interface"; @@ -2745,7 +2745,7 @@ export namespace Components { */ "mode"?: "ios" | "md"; /** - * How much to multiply the pull speed by. To slow the pull animation down, pass a number less than `1`. To speed up the pull, pass a number greater than `1`. The default value is `1` which is equal to the speed of the cursor. If a negative value is passed in, the factor will be `1` instead. For example: If the value passed is `1.2` and the content is dragged by `10` pixels, instead of `10` pixels the content will be pulled by `12` pixels (an increase of 20 percent). If the value passed is `0.8`, the dragged amount will be `8` pixels, less than the amount the cursor has moved. Does not apply when the refresher content uses a spinner, enabling the native refresher. + * How much to multiply the pull speed by. To slow the pull animation down, pass a number less than `1`. To speed up the pull, pass a number greater than `1`. The default value is `1` which is equal to the speed of the cursor. If a negative value is passed in, the factor will be `1` instead. For example, If the value passed is `1.2` and the content is dragged by `10` pixels, instead of `10` pixels, the content will be pulled by `12` pixels (an increase of 20 percent). If the value passed is `0.8`, the dragged amount will be `8` pixels, less than the amount the cursor has moved. Does not apply when the refresher content uses a spinner, enabling the native refresher. * @default 1 */ "pullFactor": number; @@ -4754,6 +4754,8 @@ declare global { "ionRefresh": RefresherEventDetail; "ionPull": void; "ionStart": void; + "ionPullStart": void; + "ionPullEnd": RefresherPullEndEventDetail; } interface HTMLIonRefresherElement extends Components.IonRefresher, HTMLStencilElement { addEventListener(type: K, listener: (this: HTMLIonRefresherElement, ev: IonRefresherCustomEvent) => any, options?: boolean | AddEventListenerOptions): void; @@ -8014,16 +8016,25 @@ declare namespace LocalJSX { * Emitted while the user is pulling down the content and exposing the refresher. */ "onIonPull"?: (event: IonRefresherCustomEvent) => void; + /** + * Emitted when the refresher has returned to the inactive state after a pull gesture. This fires whether the refresh completed successfully or was canceled. + */ + "onIonPullEnd"?: (event: IonRefresherCustomEvent) => void; + /** + * Emitted when the user begins to start pulling down. + */ + "onIonPullStart"?: (event: IonRefresherCustomEvent) => void; /** * Emitted when the user lets go of the content and has pulled down further than the `pullMin` or pulls the content down and exceeds the pullMax. Updates the refresher state to `refreshing`. The `complete()` method should be called when the async operation has completed. */ "onIonRefresh"?: (event: IonRefresherCustomEvent) => void; /** - * Emitted when the user begins to start pulling down. + * Emitted when the user begins to start pulling down. TODO(FW-7044): Remove this in a major release + * @deprecated Use `ionPullStart` instead. */ "onIonStart"?: (event: IonRefresherCustomEvent) => void; /** - * How much to multiply the pull speed by. To slow the pull animation down, pass a number less than `1`. To speed up the pull, pass a number greater than `1`. The default value is `1` which is equal to the speed of the cursor. If a negative value is passed in, the factor will be `1` instead. For example: If the value passed is `1.2` and the content is dragged by `10` pixels, instead of `10` pixels the content will be pulled by `12` pixels (an increase of 20 percent). If the value passed is `0.8`, the dragged amount will be `8` pixels, less than the amount the cursor has moved. Does not apply when the refresher content uses a spinner, enabling the native refresher. + * How much to multiply the pull speed by. To slow the pull animation down, pass a number less than `1`. To speed up the pull, pass a number greater than `1`. The default value is `1` which is equal to the speed of the cursor. If a negative value is passed in, the factor will be `1` instead. For example, If the value passed is `1.2` and the content is dragged by `10` pixels, instead of `10` pixels, the content will be pulled by `12` pixels (an increase of 20 percent). If the value passed is `0.8`, the dragged amount will be `8` pixels, less than the amount the cursor has moved. Does not apply when the refresher content uses a spinner, enabling the native refresher. * @default 1 */ "pullFactor"?: number; diff --git a/core/src/components/refresher/refresher-interface.ts b/core/src/components/refresher/refresher-interface.ts index 20fd97e1823..9866a4cc86f 100644 --- a/core/src/components/refresher/refresher-interface.ts +++ b/core/src/components/refresher/refresher-interface.ts @@ -2,7 +2,16 @@ export interface RefresherEventDetail { complete(): void; } +export interface RefresherPullEndEventDetail { + reason: 'complete' | 'cancel'; +} + export interface RefresherCustomEvent extends CustomEvent { detail: RefresherEventDetail; target: HTMLIonRefresherElement; } + +export interface RefresherPullEndCustomEvent extends CustomEvent { + detail: RefresherPullEndEventDetail; + target: HTMLIonRefresherElement; +} diff --git a/core/src/components/refresher/refresher.tsx b/core/src/components/refresher/refresher.tsx index 77f72f1a68b..2b933bc5f77 100644 --- a/core/src/components/refresher/refresher.tsx +++ b/core/src/components/refresher/refresher.tsx @@ -14,7 +14,7 @@ import { ImpactStyle, hapticImpact } from '@utils/native/haptic'; import { getIonMode } from '../../global/ionic-global'; import type { Animation, Gesture, GestureDetail } from '../../interface'; -import type { RefresherEventDetail } from './refresher-interface'; +import type { RefresherEventDetail, RefresherPullEndEventDetail } from './refresher-interface'; import { createPullingAnimation, createSnapBackAnimation, @@ -107,8 +107,8 @@ export class Refresher implements ComponentInterface { * than `1`. The default value is `1` which is equal to the speed of the cursor. * If a negative value is passed in, the factor will be `1` instead. * - * For example: If the value passed is `1.2` and the content is dragged by - * `10` pixels, instead of `10` pixels the content will be pulled by `12` pixels + * For example, If the value passed is `1.2` and the content is dragged by + * `10` pixels, instead of `10` pixels, the content will be pulled by `12` pixels * (an increase of 20 percent). If the value passed is `0.8`, the dragged amount * will be `8` pixels, less than the amount the cursor has moved. * @@ -143,9 +143,24 @@ export class Refresher implements ComponentInterface { /** * Emitted when the user begins to start pulling down. + * TODO(FW-7044): Remove this in a major release + * + * @deprecated Use `ionPullStart` instead. */ @Event() ionStart!: EventEmitter; + /** + * Emitted when the user begins to start pulling down. + */ + @Event() ionPullStart!: EventEmitter; + + /** + * Emitted when the refresher has returned to the inactive state + * after a pull gesture. This fires whether the refresh completed + * successfully or was canceled. + */ + @Event() ionPullEnd!: EventEmitter; + private async checkNativeRefresher() { const useNativeRefresher = await shouldUseNativeRefresher(this.el, getIonMode(this)); if (useNativeRefresher && !this.nativeRefresher) { @@ -182,6 +197,10 @@ export class Refresher implements ComponentInterface { this.progress = 0; this.state = RefresherState.Inactive; + + this.ionPullEnd.emit({ + reason: state === RefresherState.Completing ? 'complete' : 'cancel', + }); } private async setupiOSNativeRefresher( @@ -224,6 +243,7 @@ export class Refresher implements ComponentInterface { if (!this.didStart) { this.didStart = true; this.ionStart.emit(); + this.ionPullStart.emit(); } // emit "pulling" on every move @@ -308,6 +328,7 @@ export class Refresher implements ComponentInterface { this.lastVelocityY = ev.velocityY; }, onEnd: () => { + const hadStarted = this.didStart; this.pointerDown = false; this.didStart = false; @@ -316,6 +337,12 @@ export class Refresher implements ComponentInterface { this.needsCompletion = false; } else if (this.didRefresh) { readTask(() => translateElement(this.elementToTransform, `${this.el.clientHeight}px`)); + } else if (hadStarted) { + /** + * User started pulling but released before reaching the refresh threshold. + * Emit ionPullEnd to complete the event pair. + */ + this.ionPullEnd.emit({ reason: 'cancel' }); } }, }); @@ -378,6 +405,7 @@ export class Refresher implements ComponentInterface { ev.data.animation = animation; animation.progressStart(false, 0); this.ionStart.emit(); + this.ionPullStart.emit(); this.animations.push(animation); return; @@ -405,6 +433,7 @@ export class Refresher implements ComponentInterface { this.animations = []; this.gesture!.enable(true); this.state = RefresherState.Inactive; + this.ionPullEnd.emit({ reason: 'cancel' }); }); return; } @@ -684,6 +713,7 @@ export class Refresher implements ComponentInterface { if (!this.didStart) { this.didStart = true; this.ionStart.emit(); + this.ionPullStart.emit(); } // emit "pulling" on every move @@ -731,6 +761,16 @@ export class Refresher implements ComponentInterface { * available right away. */ this.restoreOverflowStyle(); + + /** + * If ionPullStart was emitted, we need to emit ionPullEnd + * even though the gesture was aborted before reaching the + * pulling threshold. + */ + if (this.didStart) { + this.didStart = false; + this.ionPullEnd.emit({ reason: 'cancel' }); + } } } @@ -783,6 +823,10 @@ export class Refresher implements ComponentInterface { if (this.contentFullscreen && this.backgroundContentEl) { this.backgroundContentEl?.style.removeProperty('--offset-top'); } + + this.ionPullEnd.emit({ + reason: state === RefresherState.Completing ? 'complete' : 'cancel', + }); }, 600); // reset the styles on the scroll element diff --git a/core/src/components/refresher/test/basic/index.html b/core/src/components/refresher/test/basic/index.html index 60982df8670..fdc65b20983 100644 --- a/core/src/components/refresher/test/basic/index.html +++ b/core/src/components/refresher/test/basic/index.html @@ -56,6 +56,17 @@ window.dispatchEvent(new CustomEvent('ionRefreshComplete')); }); + // Event listeners for new ionPullStart and ionPullEnd events + refresher.addEventListener('ionPullStart', function () { + console.log('ionPullStart fired'); + window.dispatchEvent(new CustomEvent('ionPullStartFired')); + }); + + refresher.addEventListener('ionPullEnd', function (event) { + console.log('ionPullEnd fired', event.detail); + window.dispatchEvent(new CustomEvent('ionPullEndFired', { detail: event.detail })); + }); + function render() { let html = ''; for (let item of items) { diff --git a/core/src/components/refresher/test/basic/refresher.e2e.ts b/core/src/components/refresher/test/basic/refresher.e2e.ts index 70f38bc88e7..10d6e62d32e 100644 --- a/core/src/components/refresher/test/basic/refresher.e2e.ts +++ b/core/src/components/refresher/test/basic/refresher.e2e.ts @@ -1,5 +1,5 @@ import { expect } from '@playwright/test'; -import { configs, test } from '@utils/test/playwright'; +import { configs, dragElementByYAxis, test } from '@utils/test/playwright'; import { pullToRefresh } from '../test.utils'; @@ -22,6 +22,37 @@ configs({ directions: ['ltr'] }).forEach(({ title, config }) => { expect(await items.count()).toBe(60); }); + + test('should emit ionPullStart and ionPullEnd with reason complete', async ({ page }) => { + const ionPullStartEvent = await page.spyOnEvent('ionPullStartFired'); + const ionPullEndEvent = await page.spyOnEvent('ionPullEndFired'); + + await pullToRefresh(page); + + // Wait for the close animation to complete + await page.waitForTimeout(700); + + expect(ionPullStartEvent).toHaveReceivedEventTimes(1); + expect(ionPullEndEvent).toHaveReceivedEventTimes(1); + expect(ionPullEndEvent).toHaveReceivedEventDetail({ reason: 'complete' }); + }); + + test('should emit ionPullEnd with reason cancel when pull is released early', async ({ page }) => { + const target = page.locator('body'); + + const ionPullStartEvent = await page.spyOnEvent('ionPullStartFired'); + const ionPullEndEvent = await page.spyOnEvent('ionPullEndFired'); + + // Pull down only 40px (less than pullMin of 60px) to trigger cancel + await dragElementByYAxis(target, page, 40); + + // Wait for the cancel animation to complete + await page.waitForTimeout(700); + + expect(ionPullStartEvent).toHaveReceivedEventTimes(1); + expect(ionPullEndEvent).toHaveReceivedEventTimes(1); + expect(ionPullEndEvent).toHaveReceivedEventDetail({ reason: 'cancel' }); + }); }); test.describe('native refresher', () => { @@ -41,6 +72,28 @@ configs({ directions: ['ltr'] }).forEach(({ title, config }) => { expect(await items.count()).toBe(60); }); + + test('should emit ionPullStart and ionPullEnd with reason complete', async ({ page }) => { + const refresherContent = page.locator('ion-refresher-content'); + refresherContent.evaluateHandle((el: any) => { + // Resets the pullingIcon to enable the native refresher + el.pullingIcon = undefined; + }); + + await page.waitForChanges(); + + const ionPullStartEvent = await page.spyOnEvent('ionPullStartFired'); + const ionPullEndEvent = await page.spyOnEvent('ionPullEndFired'); + + await pullToRefresh(page); + + // Wait for the reset animation to complete (native refresher takes longer due to CSS transitions) + await page.waitForTimeout(1500); + + expect(ionPullStartEvent).toHaveReceivedEventTimes(1); + expect(ionPullEndEvent).toHaveReceivedEventTimes(1); + expect(ionPullEndEvent).toHaveReceivedEventDetail({ reason: 'complete' }); + }); }); }); }); diff --git a/core/src/interface.d.ts b/core/src/interface.d.ts index 70be4af1431..61489837cf7 100644 --- a/core/src/interface.d.ts +++ b/core/src/interface.d.ts @@ -24,7 +24,7 @@ export { PopoverOptions } from './components/popover/popover-interface'; export { RadioGroupCustomEvent } from './components/radio-group/radio-group-interface'; export { RangeCustomEvent, PinFormatter } from './components/range/range-interface'; export { RouterCustomEvent } from './components/router/utils/interface'; -export { RefresherCustomEvent } from './components/refresher/refresher-interface'; +export { RefresherCustomEvent, RefresherPullEndCustomEvent } from './components/refresher/refresher-interface'; export { ItemReorderCustomEvent, ReorderEndCustomEvent, diff --git a/packages/angular/src/directives/proxies.ts b/packages/angular/src/directives/proxies.ts index d5b1a91baca..3d17a936026 100644 --- a/packages/angular/src/directives/proxies.ts +++ b/packages/angular/src/directives/proxies.ts @@ -1810,12 +1810,13 @@ export class IonRefresher { constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) { c.detach(); this.el = r.nativeElement; - proxyOutputs(this, this.el, ['ionRefresh', 'ionPull', 'ionStart']); + proxyOutputs(this, this.el, ['ionRefresh', 'ionPull', 'ionStart', 'ionPullStart', 'ionPullEnd']); } } import type { RefresherEventDetail as IIonRefresherRefresherEventDetail } from '@ionic/core'; +import type { RefresherPullEndEventDetail as IIonRefresherRefresherPullEndEventDetail } from '@ionic/core'; export declare interface IonRefresher extends Components.IonRefresher { /** @@ -1831,8 +1832,19 @@ called when the async operation has completed. ionPull: EventEmitter>; /** * Emitted when the user begins to start pulling down. +TODO(FW-7044): Remove this in a major release @deprecated Use `ionPullStart` instead. */ ionStart: EventEmitter>; + /** + * Emitted when the user begins to start pulling down. + */ + ionPullStart: EventEmitter>; + /** + * Emitted when the refresher has returned to the inactive state +after a pull gesture. This fires whether the refresh completed +successfully or was canceled. + */ + ionPullEnd: EventEmitter>; } diff --git a/packages/angular/standalone/src/directives/proxies.ts b/packages/angular/standalone/src/directives/proxies.ts index 3d2693c0b83..d92609b5501 100644 --- a/packages/angular/standalone/src/directives/proxies.ts +++ b/packages/angular/standalone/src/directives/proxies.ts @@ -1664,12 +1664,13 @@ export class IonRefresher { constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) { c.detach(); this.el = r.nativeElement; - proxyOutputs(this, this.el, ['ionRefresh', 'ionPull', 'ionStart']); + proxyOutputs(this, this.el, ['ionRefresh', 'ionPull', 'ionStart', 'ionPullStart', 'ionPullEnd']); } } import type { RefresherEventDetail as IIonRefresherRefresherEventDetail } from '@ionic/core/components'; +import type { RefresherPullEndEventDetail as IIonRefresherRefresherPullEndEventDetail } from '@ionic/core/components'; export declare interface IonRefresher extends Components.IonRefresher { /** @@ -1685,8 +1686,19 @@ called when the async operation has completed. ionPull: EventEmitter>; /** * Emitted when the user begins to start pulling down. +TODO(FW-7044): Remove this in a major release @deprecated Use `ionPullStart` instead. */ ionStart: EventEmitter>; + /** + * Emitted when the user begins to start pulling down. + */ + ionPullStart: EventEmitter>; + /** + * Emitted when the refresher has returned to the inactive state +after a pull gesture. This fires whether the refresh completed +successfully or was canceled. + */ + ionPullEnd: EventEmitter>; } diff --git a/packages/vue/src/proxies.ts b/packages/vue/src/proxies.ts index 31d13970a4c..735a7906974 100644 --- a/packages/vue/src/proxies.ts +++ b/packages/vue/src/proxies.ts @@ -783,11 +783,15 @@ export const IonRefresher: StencilVueComponent = /*@__PURE__*/ 'disabled', 'ionRefresh', 'ionPull', - 'ionStart' + 'ionStart', + 'ionPullStart', + 'ionPullEnd' ], [ 'ionRefresh', 'ionPull', - 'ionStart' + 'ionStart', + 'ionPullStart', + 'ionPullEnd' ]); From 682a17ebb754da7714989623cf84b75e715e20e1 Mon Sep 17 00:00:00 2001 From: OS-jacobbell <228905018+OS-jacobbell@users.noreply.github.com> Date: Thu, 19 Feb 2026 10:03:48 -0700 Subject: [PATCH 33/55] fix(radio-group): prevent DOMException and NotFoundError when filtering radios (#30958) resolves #30279 resolves #30359 ## What is the current behavior? While Ionic's `stencil.config.ts` sets `experimentalSlotFixes: true`, the fixes never get applied at runtime. Ionic is using an external runtime, so Ionic components import `defineCustomElement` from `@stencil/core/internal/client` at runtime and this code has no awareness of the project's stencil configuration. This leads to a `NotFoundError` (Failed to execute 'removeChild' on 'Node') when filtering or dynamically removing radios in an `ion-radio-group`. The error occurs because `ion-radio-group` wraps its slotted content in an internal `
`. ## What is the new behavior? By setting `externalRuntime: false`, Stencil generates a project-specific file with `defineCustomElement` that components import. This file has the project's build settings baked in, correctly applying slot fixes. Additionally, the internal wrapper `
` around the slotted content in `ion-radio-group` is removed. With slot fixes correctly applied and the wrapper removed, radios can be filtered or dynamically removed without triggering `NotFoundError` or `DOMExceptions`. ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information External Runtime is enabled by default and designed for projects that import Stencil components from multiple sources. This is flawed because those components will not be running with the runtime settings for which they were made. --- core/src/components/radio-group/radio-group.scss | 4 ---- core/src/components/radio-group/radio-group.tsx | 9 +-------- core/stencil.config.ts | 3 ++- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/core/src/components/radio-group/radio-group.scss b/core/src/components/radio-group/radio-group.scss index 3eceab4405d..817db37c4ea 100644 --- a/core/src/components/radio-group/radio-group.scss +++ b/core/src/components/radio-group/radio-group.scss @@ -8,10 +8,6 @@ ion-radio-group { vertical-align: top; } -.radio-group-wrapper { - display: inline; -} - // Radio Group: Top // -------------------------------------------------- diff --git a/core/src/components/radio-group/radio-group.tsx b/core/src/components/radio-group/radio-group.tsx index e060c2c7201..88ff48e2c4c 100644 --- a/core/src/components/radio-group/radio-group.tsx +++ b/core/src/components/radio-group/radio-group.tsx @@ -353,14 +353,7 @@ export class RadioGroup implements ComponentInterface { class={mode} > {this.renderHintText()} - {/* - TODO(FW-6279): Wrapping the slot in a div is a workaround due to a - Stencil issue. Without the wrapper, the children radio will fire the - blur event on focus, instead of waiting for them to be blurred. - */} -
- -
+ ); } diff --git a/core/stencil.config.ts b/core/stencil.config.ts index f5f824e29a8..1e457e264c6 100644 --- a/core/stencil.config.ts +++ b/core/stencil.config.ts @@ -226,7 +226,8 @@ export const config: Config = { dest: 'components', warn: true }], - includeGlobalScripts: false + includeGlobalScripts: false, + externalRuntime: false, }, { type: 'docs-json', From 23e998b731ccb224062734162d8237d6f9f0fced Mon Sep 17 00:00:00 2001 From: OS-jacobbell <228905018+OS-jacobbell@users.noreply.github.com> Date: Thu, 19 Feb 2026 13:27:25 -0700 Subject: [PATCH 34/55] chore(deps): update stencil/core to 4.43.0 (#30960) Stencil core updated to 4.43.0. --- core/api.txt | 10 +- core/package-lock.json | 43 +- core/package.json | 2 +- core/src/components.d.ts | 1119 +++++++++++++++++++++++++++++++------- 4 files changed, 961 insertions(+), 213 deletions(-) diff --git a/core/api.txt b/core/api.txt index 1a74b49cbe5..fd21aed675a 100644 --- a/core/api.txt +++ b/core/api.txt @@ -704,7 +704,7 @@ ion-infinite-scroll-content,prop,loadingText,IonicSafeString | string | undefine ion-input,scoped ion-input,prop,autocapitalize,string,'off',false,false -ion-input,prop,autocomplete,"name" | "email" | "tel" | "url" | "on" | "off" | "honorific-prefix" | "given-name" | "additional-name" | "family-name" | "honorific-suffix" | "nickname" | "username" | "new-password" | "current-password" | "one-time-code" | "organization-title" | "organization" | "street-address" | "address-line1" | "address-line2" | "address-line3" | "address-level4" | "address-level3" | "address-level2" | "address-level1" | "country" | "country-name" | "postal-code" | "cc-name" | "cc-given-name" | "cc-additional-name" | "cc-family-name" | "cc-number" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-csc" | "cc-type" | "transaction-currency" | "transaction-amount" | "language" | "bday" | "bday-day" | "bday-month" | "bday-year" | "sex" | "tel-country-code" | "tel-national" | "tel-area-code" | "tel-local" | "tel-extension" | "impp" | "photo",'off',false,false +ion-input,prop,autocomplete,"additional-name" | "address-level1" | "address-level2" | "address-level3" | "address-level4" | "address-line1" | "address-line2" | "address-line3" | "bday" | "bday-day" | "bday-month" | "bday-year" | "cc-additional-name" | "cc-csc" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-family-name" | "cc-given-name" | "cc-name" | "cc-number" | "cc-type" | "country" | "country-name" | "current-password" | "email" | "family-name" | "given-name" | "honorific-prefix" | "honorific-suffix" | "impp" | "language" | "name" | "new-password" | "nickname" | "off" | "on" | "one-time-code" | "organization" | "organization-title" | "photo" | "postal-code" | "sex" | "street-address" | "tel" | "tel-area-code" | "tel-country-code" | "tel-extension" | "tel-local" | "tel-national" | "transaction-amount" | "transaction-currency" | "url" | "username",'off',false,false ion-input,prop,autocorrect,"off" | "on",'off',false,false ion-input,prop,autofocus,boolean,false,false,false ion-input,prop,clearInput,boolean,false,false,false @@ -1210,7 +1210,7 @@ ion-nav,shadow ion-nav,prop,animated,boolean,true,false,false ion-nav,prop,animation,((baseEl: any, opts?: any) => Animation) | undefined,undefined,false,false ion-nav,prop,root,Function | HTMLElement | ViewController | null | string | undefined,undefined,false,false -ion-nav,prop,rootParams,undefined | { [key: string]: any; },undefined,false,false +ion-nav,prop,rootParams,T | undefined,undefined,false,false ion-nav,prop,swipeGesture,boolean | undefined,undefined,false,false ion-nav,method,canGoBack,canGoBack(view?: ViewController) => Promise ion-nav,method,getActive,getActive() => Promise @@ -1231,7 +1231,7 @@ ion-nav,event,ionNavWillChange,void,false ion-nav-link,none ion-nav-link,prop,component,Function | HTMLElement | ViewController | null | string | undefined,undefined,false,false -ion-nav-link,prop,componentProps,undefined | { [key: string]: any; },undefined,false,false +ion-nav-link,prop,componentProps,T | undefined,undefined,false,false ion-nav-link,prop,routerAnimation,((baseEl: any, opts?: any) => Animation) | undefined,undefined,false,false ion-nav-link,prop,routerDirection,"back" | "forward" | "root",'forward',false,false @@ -1324,7 +1324,7 @@ ion-popover,prop,animated,boolean,true,false,false ion-popover,prop,arrow,boolean,true,false,false ion-popover,prop,backdropDismiss,boolean,true,false,false ion-popover,prop,component,Function | HTMLElement | null | string | undefined,undefined,false,false -ion-popover,prop,componentProps,undefined | { [key: string]: any; },undefined,false,false +ion-popover,prop,componentProps,T | undefined,undefined,false,false ion-popover,prop,dismissOnSelect,boolean,false,false,false ion-popover,prop,enterAnimation,((baseEl: any, opts?: any) => Animation) | undefined,undefined,false,false ion-popover,prop,event,any,undefined,false,false @@ -1560,7 +1560,7 @@ ion-row,shadow ion-searchbar,scoped ion-searchbar,prop,animated,boolean,false,false,false ion-searchbar,prop,autocapitalize,string,'off',false,false -ion-searchbar,prop,autocomplete,"name" | "email" | "tel" | "url" | "on" | "off" | "honorific-prefix" | "given-name" | "additional-name" | "family-name" | "honorific-suffix" | "nickname" | "username" | "new-password" | "current-password" | "one-time-code" | "organization-title" | "organization" | "street-address" | "address-line1" | "address-line2" | "address-line3" | "address-level4" | "address-level3" | "address-level2" | "address-level1" | "country" | "country-name" | "postal-code" | "cc-name" | "cc-given-name" | "cc-additional-name" | "cc-family-name" | "cc-number" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-csc" | "cc-type" | "transaction-currency" | "transaction-amount" | "language" | "bday" | "bday-day" | "bday-month" | "bday-year" | "sex" | "tel-country-code" | "tel-national" | "tel-area-code" | "tel-local" | "tel-extension" | "impp" | "photo",'off',false,false +ion-searchbar,prop,autocomplete,"additional-name" | "address-level1" | "address-level2" | "address-level3" | "address-level4" | "address-line1" | "address-line2" | "address-line3" | "bday" | "bday-day" | "bday-month" | "bday-year" | "cc-additional-name" | "cc-csc" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-family-name" | "cc-given-name" | "cc-name" | "cc-number" | "cc-type" | "country" | "country-name" | "current-password" | "email" | "family-name" | "given-name" | "honorific-prefix" | "honorific-suffix" | "impp" | "language" | "name" | "new-password" | "nickname" | "off" | "on" | "one-time-code" | "organization" | "organization-title" | "photo" | "postal-code" | "sex" | "street-address" | "tel" | "tel-area-code" | "tel-country-code" | "tel-extension" | "tel-local" | "tel-national" | "transaction-amount" | "transaction-currency" | "url" | "username",'off',false,false ion-searchbar,prop,autocorrect,"off" | "on",'off',false,false ion-searchbar,prop,cancelButtonIcon,string,config.get('backButtonIcon', arrowBackSharp) as string,false,false ion-searchbar,prop,cancelButtonText,string,'Cancel',false,false diff --git a/core/package-lock.json b/core/package-lock.json index 0bd942fdde6..69d5066d1be 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -9,7 +9,7 @@ "version": "8.7.16", "license": "MIT", "dependencies": { - "@stencil/core": "4.38.0", + "@stencil/core": "4.43.0", "ionicons": "^8.0.13", "tslib": "^2.1.0" }, @@ -94,6 +94,7 @@ "version": "7.16.12", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -633,6 +634,7 @@ "integrity": "sha512-250HTVd/W/KdMygoqaedisvNbHbpbQTN2Hy/8ZYGm1nAqE0Fx7sGss4l0nDg33STxEdDhtVRoL2fIaaiukKseA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -870,6 +872,7 @@ "version": "4.33.0", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "4.33.0", "@typescript-eslint/types": "4.33.0", @@ -1805,8 +1808,11 @@ } }, "node_modules/@stencil/core": { - "version": "4.38.0", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.43.0.tgz", + "integrity": "sha512-6Uj2Z3lzLuufYAE7asZ6NLKgSwsB9uxl84Eh34PASnUjfj32GkrP4DtKK7fNeh1WFGGyffsTDka3gwtl+4reUg==", "license": "MIT", + "peer": true, "bin": { "stencil": "bin/stencil" }, @@ -2231,6 +2237,7 @@ "version": "6.7.2", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "6.7.2", "@typescript-eslint/types": "6.7.2", @@ -2456,7 +2463,6 @@ "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.25", @@ -2471,7 +2477,6 @@ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=0.12" }, @@ -2484,8 +2489,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@vue/compiler-dom": { "version": "3.5.25", @@ -2493,7 +2497,6 @@ "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-core": "3.5.25", "@vue/shared": "3.5.25" @@ -2505,7 +2508,6 @@ "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.25", @@ -2523,8 +2525,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@vue/compiler-sfc/node_modules/postcss": { "version": "8.5.6", @@ -2546,7 +2547,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -2562,7 +2562,6 @@ "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.25", "@vue/shared": "3.5.25" @@ -2574,7 +2573,6 @@ "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/shared": "3.5.25" } @@ -2585,7 +2583,6 @@ "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/reactivity": "3.5.25", "@vue/shared": "3.5.25" @@ -2597,7 +2594,6 @@ "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/reactivity": "3.5.25", "@vue/runtime-core": "3.5.25", @@ -2611,7 +2607,6 @@ "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-ssr": "3.5.25", "@vue/shared": "3.5.25" @@ -2625,8 +2620,7 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz", "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@zeit/schemas": { "version": "2.21.0", @@ -2649,6 +2643,7 @@ "version": "7.4.0", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3809,8 +3804,7 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/debug": { "version": "2.6.9", @@ -4104,6 +4098,7 @@ "version": "7.32.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -7299,7 +7294,6 @@ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -7621,7 +7615,6 @@ } ], "license": "MIT", - "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -7976,6 +7969,7 @@ "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "playwright-core": "cli.js" }, @@ -7987,6 +7981,7 @@ "version": "7.0.35", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -8092,6 +8087,7 @@ "version": "0.36.2", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "postcss": ">=5.0.0" } @@ -8140,6 +8136,7 @@ "version": "2.6.1", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -8497,6 +8494,7 @@ "version": "2.35.1", "dev": true, "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -8718,7 +8716,6 @@ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } diff --git a/core/package.json b/core/package.json index dc92468f9c1..0d06bcd0cfd 100644 --- a/core/package.json +++ b/core/package.json @@ -34,7 +34,7 @@ "loader/" ], "dependencies": { - "@stencil/core": "4.38.0", + "@stencil/core": "4.43.0", "ionicons": "^8.0.13", "tslib": "^2.1.0" }, diff --git a/core/src/components.d.ts b/core/src/components.d.ts index 582cbfcd3ae..0097f5628ac 100644 --- a/core/src/components.d.ts +++ b/core/src/components.d.ts @@ -5302,6 +5302,8 @@ declare global { } } declare namespace LocalJSX { + type OneOf = { [P in K]: PropT } & { [P in `attr:${K}` | `prop:${K}`]?: never } | { [P in `attr:${K}`]: AttrT } & { [P in K | `prop:${K}`]?: never } | { [P in `prop:${K}`]: PropT } & { [P in K | `attr:${K}`]?: never }; + interface IonAccordion { /** * If `true`, the accordion cannot be interacted with. @@ -9150,207 +9152,956 @@ declare namespace LocalJSX { */ "mode"?: "ios" | "md"; } + + interface IonAccordionAttributes { + "value": string; + "disabled": boolean; + "readonly": boolean; + "toggleIcon": string; + "toggleIconSlot": 'start' | 'end'; + } + interface IonAccordionGroupAttributes { + "animated": boolean; + "multiple": boolean; + "value": string | string[] | null; + "disabled": boolean; + "readonly": boolean; + "expand": 'compact' | 'inset'; + } + interface IonActionSheetAttributes { + "overlayIndex": number; + "hasController": boolean; + "keyboardClose": boolean; + "cssClass": string | string[]; + "backdropDismiss": boolean; + "header": string; + "subHeader": string; + "translucent": boolean; + "animated": boolean; + "isOpen": boolean; + "trigger": string | undefined; + } + interface IonAlertAttributes { + "overlayIndex": number; + "hasController": boolean; + "keyboardClose": boolean; + "cssClass": string | string[]; + "header": string; + "subHeader": string; + "message": string | IonicSafeString; + "backdropDismiss": boolean; + "translucent": boolean; + "animated": boolean; + "isOpen": boolean; + "trigger": string | undefined; + } + interface IonBackButtonAttributes { + "color": Color; + "defaultHref": string; + "disabled": boolean; + "icon": string | null; + "text": string | null; + "type": 'submit' | 'reset' | 'button'; + } + interface IonBackdropAttributes { + "visible": boolean; + "tappable": boolean; + "stopPropagation": boolean; + } + interface IonBadgeAttributes { + "color": Color; + } + interface IonBreadcrumbAttributes { + "collapsed": boolean; + "last": boolean; + "showCollapsedIndicator": boolean; + "color": Color; + "active": boolean; + "disabled": boolean; + "download": string | undefined; + "href": string | undefined; + "rel": string | undefined; + "separator": boolean | undefined; + "target": string | undefined; + "routerDirection": RouterDirection; + } + interface IonBreadcrumbsAttributes { + "color": Color; + "maxItems": number; + "itemsBeforeCollapse": number; + "itemsAfterCollapse": number; + } + interface IonButtonAttributes { + "color": Color; + "buttonType": string; + "disabled": boolean; + "expand": 'full' | 'block'; + "fill": 'clear' | 'outline' | 'solid' | 'default'; + "routerDirection": RouterDirection; + "download": string | undefined; + "href": string | undefined; + "rel": string | undefined; + "shape": 'round'; + "size": 'small' | 'default' | 'large'; + "strong": boolean; + "target": string | undefined; + "type": 'submit' | 'reset' | 'button'; + "form": string | HTMLFormElement; + } + interface IonButtonsAttributes { + "collapse": boolean; + } + interface IonCardAttributes { + "color": Color; + "button": boolean; + "type": 'submit' | 'reset' | 'button'; + "disabled": boolean; + "download": string | undefined; + "href": string | undefined; + "rel": string | undefined; + "routerDirection": RouterDirection; + "target": string | undefined; + } + interface IonCardHeaderAttributes { + "color": Color; + "translucent": boolean; + } + interface IonCardSubtitleAttributes { + "color": Color; + } + interface IonCardTitleAttributes { + "color": Color; + } + interface IonCheckboxAttributes { + "color": Color; + "name": string; + "checked": boolean; + "indeterminate": boolean; + "disabled": boolean; + "errorText": string; + "helperText": string; + "value": string; + "labelPlacement": 'start' | 'end' | 'fixed' | 'stacked'; + "justify": 'start' | 'end' | 'space-between'; + "alignment": 'start' | 'center'; + "required": boolean; + } + interface IonChipAttributes { + "color": Color; + "outline": boolean; + "disabled": boolean; + } + interface IonColAttributes { + "offset": string; + "offsetXs": string; + "offsetSm": string; + "offsetMd": string; + "offsetLg": string; + "offsetXl": string; + "pull": string; + "pullXs": string; + "pullSm": string; + "pullMd": string; + "pullLg": string; + "pullXl": string; + "push": string; + "pushXs": string; + "pushSm": string; + "pushMd": string; + "pushLg": string; + "pushXl": string; + "size": string; + "sizeXs": string; + "sizeSm": string; + "sizeMd": string; + "sizeLg": string; + "sizeXl": string; + } + interface IonContentAttributes { + "color": Color; + "fullscreen": boolean; + "fixedSlotPlacement": 'after' | 'before'; + "forceOverscroll": boolean; + "scrollX": boolean; + "scrollY": boolean; + "scrollEvents": boolean; + } + interface IonDatetimeAttributes { + "color": Color; + "name": string; + "disabled": boolean; + "readonly": boolean; + "showAdjacentDays": boolean; + "min": string; + "max": string; + "presentation": DatetimePresentation; + "cancelText": string; + "doneText": string; + "clearText": string; + "yearValues": string; + "monthValues": string; + "dayValues": string; + "hourValues": string; + "minuteValues": string; + "locale": string; + "firstDayOfWeek": number; + "multiple": boolean; + "value": string | string[] | null; + "showDefaultTitle": boolean; + "showDefaultButtons": boolean; + "showClearButton": boolean; + "showDefaultTimeLabel": boolean; + "hourCycle": DatetimeHourCycle; + "size": 'cover' | 'fixed'; + "preferWheel": boolean; + } + interface IonDatetimeButtonAttributes { + "color": Color; + "disabled": boolean; + "datetime": string; + } + interface IonFabAttributes { + "horizontal": 'start' | 'end' | 'center'; + "vertical": 'top' | 'bottom' | 'center'; + "edge": boolean; + "activated": boolean; + } + interface IonFabButtonAttributes { + "color": Color; + "activated": boolean; + "disabled": boolean; + "download": string | undefined; + "href": string | undefined; + "rel": string | undefined; + "routerDirection": RouterDirection; + "target": string | undefined; + "show": boolean; + "translucent": boolean; + "type": 'submit' | 'reset' | 'button'; + "size": 'small'; + "closeIcon": string; + } + interface IonFabListAttributes { + "activated": boolean; + "side": 'start' | 'end' | 'top' | 'bottom'; + } + interface IonFooterAttributes { + "collapse": 'fade'; + "translucent": boolean; + } + interface IonGridAttributes { + "fixed": boolean; + } + interface IonHeaderAttributes { + "collapse": 'condense' | 'fade'; + "translucent": boolean; + } + interface IonImgAttributes { + "alt": string; + "src": string; + } + interface IonInfiniteScrollAttributes { + "threshold": string; + "disabled": boolean; + "position": 'top' | 'bottom'; + } + interface IonInfiniteScrollContentAttributes { + "loadingSpinner": SpinnerTypes | null; + "loadingText": string | IonicSafeString; + } + interface IonInputAttributes { + "color": Color; + "autocapitalize": string; + "autocomplete": AutocompleteTypes; + "autocorrect": 'on' | 'off'; + "autofocus": boolean; + "clearInput": boolean; + "clearInputIcon": string; + "clearOnEdit": boolean; + "counter": boolean; + "debounce": number; + "disabled": boolean; + "enterkeyhint": 'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | 'send'; + "errorText": string; + "fill": 'outline' | 'solid'; + "inputmode": 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'; + "helperText": string; + "label": string; + "labelPlacement": 'start' | 'end' | 'floating' | 'stacked' | 'fixed'; + "max": string; + "maxlength": number; + "min": string; + "minlength": number; + "multiple": boolean; + "name": string; + "pattern": string; + "placeholder": string; + "readonly": boolean; + "required": boolean; + "shape": 'round'; + "spellcheck": boolean; + "step": string; + "type": TextFieldTypes; + "value": string; + } + interface IonInputOtpAttributes { + "autocapitalize": string; + "color": Color; + "disabled": boolean; + "fill": 'outline' | 'solid'; + "inputmode": 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'; + "length": number; + "pattern": string; + "readonly": boolean; + "separators": 'all' | string | number[]; + "shape": 'round' | 'rectangular' | 'soft'; + "size": 'small' | 'medium' | 'large'; + "type": 'text' | 'number'; + "value": string; + } + interface IonInputPasswordToggleAttributes { + "color": Color; + "showIcon": string; + "hideIcon": string; + "type": TextFieldTypes; + } + interface IonItemAttributes { + "color": Color; + "button": boolean; + "detail": boolean; + "detailIcon": string; + "disabled": boolean; + "download": string | undefined; + "href": string | undefined; + "rel": string | undefined; + "lines": 'full' | 'inset' | 'none'; + "routerDirection": RouterDirection; + "target": string | undefined; + "type": 'submit' | 'reset' | 'button'; + } + interface IonItemDividerAttributes { + "color": Color; + "sticky": boolean; + } + interface IonItemOptionAttributes { + "color": Color; + "disabled": boolean; + "download": string | undefined; + "expandable": boolean; + "href": string | undefined; + "rel": string | undefined; + "target": string | undefined; + "type": 'submit' | 'reset' | 'button'; + } + interface IonItemOptionsAttributes { + "side": Side; + } + interface IonItemSlidingAttributes { + "disabled": boolean; + } + interface IonLabelAttributes { + "color": Color; + "position": 'fixed' | 'stacked' | 'floating'; + } + interface IonListAttributes { + "lines": 'full' | 'inset' | 'none'; + "inset": boolean; + } + interface IonListHeaderAttributes { + "color": Color; + "lines": 'full' | 'inset' | 'none'; + } + interface IonLoadingAttributes { + "overlayIndex": number; + "hasController": boolean; + "keyboardClose": boolean; + "message": string | IonicSafeString; + "cssClass": string | string[]; + "duration": number; + "backdropDismiss": boolean; + "showBackdrop": boolean; + "spinner": SpinnerTypes | null; + "translucent": boolean; + "animated": boolean; + "isOpen": boolean; + "trigger": string | undefined; + } + interface IonMenuAttributes { + "contentId": string; + "menuId": string; + "type": MenuType; + "disabled": boolean; + "side": Side; + "swipeGesture": boolean; + "maxEdgeStart": number; + } + interface IonMenuButtonAttributes { + "color": Color; + "disabled": boolean; + "menu": string; + "autoHide": boolean; + "type": 'submit' | 'reset' | 'button'; + } + interface IonMenuToggleAttributes { + "menu": string; + "autoHide": boolean; + } + interface IonModalAttributes { + "hasController": boolean; + "overlayIndex": number; + "keyboardClose": boolean; + "expandToScroll": boolean; + "initialBreakpoint": number; + "backdropBreakpoint": number; + "handle": boolean; + "handleBehavior": ModalHandleBehavior; + "component": ComponentRef; + "cssClass": string | string[]; + "backdropDismiss": boolean; + "showBackdrop": boolean; + "animated": boolean; + "isOpen": boolean; + "trigger": string | undefined; + "keepContentsMounted": boolean; + "focusTrap": boolean; + "canDismiss": boolean | ((data?: any, role?: string) => Promise); + } + interface IonNavAttributes { + "swipeGesture": boolean; + "animated": boolean; + "root": NavComponent; + } + interface IonNavLinkAttributes { + "component": NavComponent; + "routerDirection": RouterDirection; + } + interface IonNoteAttributes { + "color": Color; + } + interface IonPickerColumnAttributes { + "disabled": boolean; + "value": string; + "color": Color; + "numericInput": boolean; + } + interface IonPickerColumnOptionAttributes { + "disabled": boolean; + "value": string; + "color": Color; + } + interface IonPickerLegacyAttributes { + "overlayIndex": number; + "hasController": boolean; + "keyboardClose": boolean; + "cssClass": string | string[]; + "duration": number; + "showBackdrop": boolean; + "backdropDismiss": boolean; + "animated": boolean; + "isOpen": boolean; + "trigger": string | undefined; + } + interface IonPopoverAttributes { + "hasController": boolean; + "overlayIndex": number; + "component": ComponentRef; + "keyboardClose": boolean; + "cssClass": string | string[]; + "backdropDismiss": boolean; + "event": string; + "showBackdrop": boolean; + "translucent": boolean; + "animated": boolean; + "triggerAction": TriggerAction; + "trigger": string | undefined; + "size": PopoverSize; + "dismissOnSelect": boolean; + "reference": PositionReference; + "side": PositionSide; + "alignment": PositionAlign; + "arrow": boolean; + "isOpen": boolean; + "keyboardEvents": boolean; + "focusTrap": boolean; + "keepContentsMounted": boolean; + } + interface IonProgressBarAttributes { + "type": 'determinate' | 'indeterminate'; + "reversed": boolean; + "value": number; + "buffer": number; + "color": Color; + } + interface IonRadioAttributes { + "color": Color; + "name": string; + "disabled": boolean; + "value": string; + "labelPlacement": 'start' | 'end' | 'fixed' | 'stacked'; + "justify": 'start' | 'end' | 'space-between'; + "alignment": 'start' | 'center'; + } + interface IonRadioGroupAttributes { + "allowEmptySelection": boolean; + "compareWith": string | RadioGroupCompareFn | null; + "name": string; + "value": string; + "helperText": string; + "errorText": string; + } + interface IonRangeAttributes { + "color": Color; + "debounce": number; + "name": string; + "label": string; + "dualKnobs": boolean; + "min": number; + "max": number; + "pin": boolean; + "snaps": boolean; + "step": number; + "ticks": boolean; + "activeBarStart": number; + "disabled": boolean; + "value": RangeValue; + "labelPlacement": 'start' | 'end' | 'fixed' | 'stacked'; + } + interface IonRefresherAttributes { + "pullMin": number; + "pullMax": number; + "closeDuration": string; + "snapbackDuration": string; + "pullFactor": number; + "disabled": boolean; + } + interface IonRefresherContentAttributes { + "pullingIcon": SpinnerTypes | string | null; + "pullingText": string | IonicSafeString; + "refreshingSpinner": SpinnerTypes | null; + "refreshingText": string | IonicSafeString; + } + interface IonReorderGroupAttributes { + "disabled": boolean; + } + interface IonRippleEffectAttributes { + "type": 'bounded' | 'unbounded'; + } + interface IonRouteAttributes { + "url": string; + "component": string; + } + interface IonRouteRedirectAttributes { + "from": string; + "to": string | undefined | null; + } + interface IonRouterAttributes { + "root": string; + "useHash": boolean; + } + interface IonRouterLinkAttributes { + "color": Color; + "href": string | undefined; + "rel": string | undefined; + "routerDirection": RouterDirection; + "target": string | undefined; + } + interface IonRouterOutletAttributes { + "mode": "ios" | "md"; + "animated": boolean; + } + interface IonSearchbarAttributes { + "color": Color; + "animated": boolean; + "autocapitalize": string; + "autocomplete": AutocompleteTypes; + "autocorrect": 'on' | 'off'; + "cancelButtonIcon": string; + "cancelButtonText": string; + "clearIcon": string; + "debounce": number; + "disabled": boolean; + "inputmode": 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'; + "enterkeyhint": 'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | 'send'; + "maxlength": number; + "minlength": number; + "name": string; + "placeholder": string; + "searchIcon": string; + "showCancelButton": 'never' | 'focus' | 'always'; + "showClearButton": 'never' | 'focus' | 'always'; + "spellcheck": boolean; + "type": 'text' | 'password' | 'email' | 'number' | 'search' | 'tel' | 'url'; + "value": string | null; + } + interface IonSegmentAttributes { + "color": Color; + "disabled": boolean; + "scrollable": boolean; + "swipeGesture": boolean; + "value": string; + "selectOnFocus": boolean; + } + interface IonSegmentButtonAttributes { + "contentId": string; + "disabled": boolean; + "layout": SegmentButtonLayout; + "type": 'submit' | 'reset' | 'button'; + "value": string; + } + interface IonSegmentViewAttributes { + "disabled": boolean; + "swipeGesture": boolean; + } + interface IonSelectAttributes { + "cancelText": string; + "color": Color; + "compareWith": string | SelectCompareFn | null; + "disabled": boolean; + "fill": 'outline' | 'solid'; + "errorText": string; + "helperText": string; + "interface": SelectInterface; + "interfaceOptions": string; + "justify": 'start' | 'end' | 'space-between'; + "label": string; + "labelPlacement": 'start' | 'end' | 'floating' | 'stacked' | 'fixed'; + "multiple": boolean; + "name": string; + "okText": string; + "placeholder": string; + "selectedText": string | null; + "toggleIcon": string; + "expandedIcon": string; + "shape": 'round'; + "value": string; + "required": boolean; + } + interface IonSelectModalAttributes { + "header": string; + "cancelText": string; + "multiple": boolean; + } + interface IonSelectOptionAttributes { + "disabled": boolean; + "value": string; + } + interface IonSelectPopoverAttributes { + "header": string; + "subHeader": string; + "message": string; + "multiple": boolean; + } + interface IonSkeletonTextAttributes { + "animated": boolean; + } + interface IonSpinnerAttributes { + "color": Color; + "duration": number; + "name": SpinnerTypes; + "paused": boolean; + } + interface IonSplitPaneAttributes { + "contentId": string; + "disabled": boolean; + "when": string; + } + interface IonTabAttributes { + "active": boolean; + "tab": string; + "component": ComponentRef; + } + interface IonTabBarAttributes { + "color": Color; + "selectedTab": string; + "translucent": boolean; + } + interface IonTabButtonAttributes { + "disabled": boolean; + "download": string | undefined; + "href": string | undefined; + "rel": string | undefined; + "layout": TabButtonLayout; + "selected": boolean; + "tab": string; + "target": string | undefined; + } + interface IonTabsAttributes { + "useRouter": boolean; + } + interface IonTextAttributes { + "color": Color; + } + interface IonTextareaAttributes { + "color": Color; + "autocapitalize": string; + "autofocus": boolean; + "clearOnEdit": boolean; + "debounce": number; + "disabled": boolean; + "fill": 'outline' | 'solid'; + "inputmode": 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'; + "enterkeyhint": 'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | 'send'; + "maxlength": number; + "minlength": number; + "name": string; + "placeholder": string; + "readonly": boolean; + "required": boolean; + "spellcheck": boolean; + "cols": number; + "rows": number; + "wrap": 'hard' | 'soft' | 'off'; + "autoGrow": boolean; + "value": string | null; + "counter": boolean; + "errorText": string; + "helperText": string; + "label": string; + "labelPlacement": 'start' | 'end' | 'floating' | 'stacked' | 'fixed'; + "shape": 'round'; + } + interface IonTitleAttributes { + "color": Color; + "size": 'large' | 'small'; + } + interface IonToastAttributes { + "overlayIndex": number; + "hasController": boolean; + "color": Color; + "cssClass": string | string[]; + "duration": number; + "header": string; + "layout": ToastLayout; + "message": string | IonicSafeString; + "keyboardClose": boolean; + "position": ToastPosition; + "positionAnchor": HTMLElement | string; + "translucent": boolean; + "animated": boolean; + "icon": string; + "swipeGesture": ToastSwipeGestureDirection; + "isOpen": boolean; + "trigger": string | undefined; + } + interface IonToggleAttributes { + "color": Color; + "name": string; + "checked": boolean; + "disabled": boolean; + "errorText": string; + "helperText": string; + "value": string | null; + "enableOnOffLabels": boolean | undefined; + "labelPlacement": 'start' | 'end' | 'fixed' | 'stacked'; + "justify": 'start' | 'end' | 'space-between'; + "alignment": 'start' | 'center'; + "required": boolean; + } + interface IonToolbarAttributes { + "color": Color; + } + interface IntrinsicElements { - "ion-accordion": IonAccordion; - "ion-accordion-group": IonAccordionGroup; - "ion-action-sheet": IonActionSheet; - "ion-alert": IonAlert; + "ion-accordion": Omit & { [K in keyof IonAccordion & keyof IonAccordionAttributes]?: IonAccordion[K] } & { [K in keyof IonAccordion & keyof IonAccordionAttributes as `attr:${K}`]?: IonAccordionAttributes[K] } & { [K in keyof IonAccordion & keyof IonAccordionAttributes as `prop:${K}`]?: IonAccordion[K] }; + "ion-accordion-group": Omit & { [K in keyof IonAccordionGroup & keyof IonAccordionGroupAttributes]?: IonAccordionGroup[K] } & { [K in keyof IonAccordionGroup & keyof IonAccordionGroupAttributes as `attr:${K}`]?: IonAccordionGroupAttributes[K] } & { [K in keyof IonAccordionGroup & keyof IonAccordionGroupAttributes as `prop:${K}`]?: IonAccordionGroup[K] }; + "ion-action-sheet": Omit & { [K in keyof IonActionSheet & keyof IonActionSheetAttributes]?: IonActionSheet[K] } & { [K in keyof IonActionSheet & keyof IonActionSheetAttributes as `attr:${K}`]?: IonActionSheetAttributes[K] } & { [K in keyof IonActionSheet & keyof IonActionSheetAttributes as `prop:${K}`]?: IonActionSheet[K] } & OneOf<"overlayIndex", IonActionSheet["overlayIndex"], IonActionSheetAttributes["overlayIndex"]>; + "ion-alert": Omit & { [K in keyof IonAlert & keyof IonAlertAttributes]?: IonAlert[K] } & { [K in keyof IonAlert & keyof IonAlertAttributes as `attr:${K}`]?: IonAlertAttributes[K] } & { [K in keyof IonAlert & keyof IonAlertAttributes as `prop:${K}`]?: IonAlert[K] } & OneOf<"overlayIndex", IonAlert["overlayIndex"], IonAlertAttributes["overlayIndex"]>; "ion-app": IonApp; "ion-avatar": IonAvatar; - "ion-back-button": IonBackButton; - "ion-backdrop": IonBackdrop; - "ion-badge": IonBadge; - "ion-breadcrumb": IonBreadcrumb; - "ion-breadcrumbs": IonBreadcrumbs; - "ion-button": IonButton; - "ion-buttons": IonButtons; - "ion-card": IonCard; + "ion-back-button": Omit & { [K in keyof IonBackButton & keyof IonBackButtonAttributes]?: IonBackButton[K] } & { [K in keyof IonBackButton & keyof IonBackButtonAttributes as `attr:${K}`]?: IonBackButtonAttributes[K] } & { [K in keyof IonBackButton & keyof IonBackButtonAttributes as `prop:${K}`]?: IonBackButton[K] }; + "ion-backdrop": Omit & { [K in keyof IonBackdrop & keyof IonBackdropAttributes]?: IonBackdrop[K] } & { [K in keyof IonBackdrop & keyof IonBackdropAttributes as `attr:${K}`]?: IonBackdropAttributes[K] } & { [K in keyof IonBackdrop & keyof IonBackdropAttributes as `prop:${K}`]?: IonBackdrop[K] }; + "ion-badge": Omit & { [K in keyof IonBadge & keyof IonBadgeAttributes]?: IonBadge[K] } & { [K in keyof IonBadge & keyof IonBadgeAttributes as `attr:${K}`]?: IonBadgeAttributes[K] } & { [K in keyof IonBadge & keyof IonBadgeAttributes as `prop:${K}`]?: IonBadge[K] }; + "ion-breadcrumb": Omit & { [K in keyof IonBreadcrumb & keyof IonBreadcrumbAttributes]?: IonBreadcrumb[K] } & { [K in keyof IonBreadcrumb & keyof IonBreadcrumbAttributes as `attr:${K}`]?: IonBreadcrumbAttributes[K] } & { [K in keyof IonBreadcrumb & keyof IonBreadcrumbAttributes as `prop:${K}`]?: IonBreadcrumb[K] } & OneOf<"last", IonBreadcrumb["last"], IonBreadcrumbAttributes["last"]> & OneOf<"showCollapsedIndicator", IonBreadcrumb["showCollapsedIndicator"], IonBreadcrumbAttributes["showCollapsedIndicator"]>; + "ion-breadcrumbs": Omit & { [K in keyof IonBreadcrumbs & keyof IonBreadcrumbsAttributes]?: IonBreadcrumbs[K] } & { [K in keyof IonBreadcrumbs & keyof IonBreadcrumbsAttributes as `attr:${K}`]?: IonBreadcrumbsAttributes[K] } & { [K in keyof IonBreadcrumbs & keyof IonBreadcrumbsAttributes as `prop:${K}`]?: IonBreadcrumbs[K] }; + "ion-button": Omit & { [K in keyof IonButton & keyof IonButtonAttributes]?: IonButton[K] } & { [K in keyof IonButton & keyof IonButtonAttributes as `attr:${K}`]?: IonButtonAttributes[K] } & { [K in keyof IonButton & keyof IonButtonAttributes as `prop:${K}`]?: IonButton[K] }; + "ion-buttons": Omit & { [K in keyof IonButtons & keyof IonButtonsAttributes]?: IonButtons[K] } & { [K in keyof IonButtons & keyof IonButtonsAttributes as `attr:${K}`]?: IonButtonsAttributes[K] } & { [K in keyof IonButtons & keyof IonButtonsAttributes as `prop:${K}`]?: IonButtons[K] }; + "ion-card": Omit & { [K in keyof IonCard & keyof IonCardAttributes]?: IonCard[K] } & { [K in keyof IonCard & keyof IonCardAttributes as `attr:${K}`]?: IonCardAttributes[K] } & { [K in keyof IonCard & keyof IonCardAttributes as `prop:${K}`]?: IonCard[K] }; "ion-card-content": IonCardContent; - "ion-card-header": IonCardHeader; - "ion-card-subtitle": IonCardSubtitle; - "ion-card-title": IonCardTitle; - "ion-checkbox": IonCheckbox; - "ion-chip": IonChip; - "ion-col": IonCol; - "ion-content": IonContent; - "ion-datetime": IonDatetime; - "ion-datetime-button": IonDatetimeButton; - "ion-fab": IonFab; - "ion-fab-button": IonFabButton; - "ion-fab-list": IonFabList; - "ion-footer": IonFooter; - "ion-grid": IonGrid; - "ion-header": IonHeader; - "ion-img": IonImg; - "ion-infinite-scroll": IonInfiniteScroll; - "ion-infinite-scroll-content": IonInfiniteScrollContent; - "ion-input": IonInput; - "ion-input-otp": IonInputOtp; - "ion-input-password-toggle": IonInputPasswordToggle; - "ion-item": IonItem; - "ion-item-divider": IonItemDivider; + "ion-card-header": Omit & { [K in keyof IonCardHeader & keyof IonCardHeaderAttributes]?: IonCardHeader[K] } & { [K in keyof IonCardHeader & keyof IonCardHeaderAttributes as `attr:${K}`]?: IonCardHeaderAttributes[K] } & { [K in keyof IonCardHeader & keyof IonCardHeaderAttributes as `prop:${K}`]?: IonCardHeader[K] }; + "ion-card-subtitle": Omit & { [K in keyof IonCardSubtitle & keyof IonCardSubtitleAttributes]?: IonCardSubtitle[K] } & { [K in keyof IonCardSubtitle & keyof IonCardSubtitleAttributes as `attr:${K}`]?: IonCardSubtitleAttributes[K] } & { [K in keyof IonCardSubtitle & keyof IonCardSubtitleAttributes as `prop:${K}`]?: IonCardSubtitle[K] }; + "ion-card-title": Omit & { [K in keyof IonCardTitle & keyof IonCardTitleAttributes]?: IonCardTitle[K] } & { [K in keyof IonCardTitle & keyof IonCardTitleAttributes as `attr:${K}`]?: IonCardTitleAttributes[K] } & { [K in keyof IonCardTitle & keyof IonCardTitleAttributes as `prop:${K}`]?: IonCardTitle[K] }; + "ion-checkbox": Omit & { [K in keyof IonCheckbox & keyof IonCheckboxAttributes]?: IonCheckbox[K] } & { [K in keyof IonCheckbox & keyof IonCheckboxAttributes as `attr:${K}`]?: IonCheckboxAttributes[K] } & { [K in keyof IonCheckbox & keyof IonCheckboxAttributes as `prop:${K}`]?: IonCheckbox[K] }; + "ion-chip": Omit & { [K in keyof IonChip & keyof IonChipAttributes]?: IonChip[K] } & { [K in keyof IonChip & keyof IonChipAttributes as `attr:${K}`]?: IonChipAttributes[K] } & { [K in keyof IonChip & keyof IonChipAttributes as `prop:${K}`]?: IonChip[K] }; + "ion-col": Omit & { [K in keyof IonCol & keyof IonColAttributes]?: IonCol[K] } & { [K in keyof IonCol & keyof IonColAttributes as `attr:${K}`]?: IonColAttributes[K] } & { [K in keyof IonCol & keyof IonColAttributes as `prop:${K}`]?: IonCol[K] }; + "ion-content": Omit & { [K in keyof IonContent & keyof IonContentAttributes]?: IonContent[K] } & { [K in keyof IonContent & keyof IonContentAttributes as `attr:${K}`]?: IonContentAttributes[K] } & { [K in keyof IonContent & keyof IonContentAttributes as `prop:${K}`]?: IonContent[K] }; + "ion-datetime": Omit & { [K in keyof IonDatetime & keyof IonDatetimeAttributes]?: IonDatetime[K] } & { [K in keyof IonDatetime & keyof IonDatetimeAttributes as `attr:${K}`]?: IonDatetimeAttributes[K] } & { [K in keyof IonDatetime & keyof IonDatetimeAttributes as `prop:${K}`]?: IonDatetime[K] }; + "ion-datetime-button": Omit & { [K in keyof IonDatetimeButton & keyof IonDatetimeButtonAttributes]?: IonDatetimeButton[K] } & { [K in keyof IonDatetimeButton & keyof IonDatetimeButtonAttributes as `attr:${K}`]?: IonDatetimeButtonAttributes[K] } & { [K in keyof IonDatetimeButton & keyof IonDatetimeButtonAttributes as `prop:${K}`]?: IonDatetimeButton[K] }; + "ion-fab": Omit & { [K in keyof IonFab & keyof IonFabAttributes]?: IonFab[K] } & { [K in keyof IonFab & keyof IonFabAttributes as `attr:${K}`]?: IonFabAttributes[K] } & { [K in keyof IonFab & keyof IonFabAttributes as `prop:${K}`]?: IonFab[K] }; + "ion-fab-button": Omit & { [K in keyof IonFabButton & keyof IonFabButtonAttributes]?: IonFabButton[K] } & { [K in keyof IonFabButton & keyof IonFabButtonAttributes as `attr:${K}`]?: IonFabButtonAttributes[K] } & { [K in keyof IonFabButton & keyof IonFabButtonAttributes as `prop:${K}`]?: IonFabButton[K] }; + "ion-fab-list": Omit & { [K in keyof IonFabList & keyof IonFabListAttributes]?: IonFabList[K] } & { [K in keyof IonFabList & keyof IonFabListAttributes as `attr:${K}`]?: IonFabListAttributes[K] } & { [K in keyof IonFabList & keyof IonFabListAttributes as `prop:${K}`]?: IonFabList[K] }; + "ion-footer": Omit & { [K in keyof IonFooter & keyof IonFooterAttributes]?: IonFooter[K] } & { [K in keyof IonFooter & keyof IonFooterAttributes as `attr:${K}`]?: IonFooterAttributes[K] } & { [K in keyof IonFooter & keyof IonFooterAttributes as `prop:${K}`]?: IonFooter[K] }; + "ion-grid": Omit & { [K in keyof IonGrid & keyof IonGridAttributes]?: IonGrid[K] } & { [K in keyof IonGrid & keyof IonGridAttributes as `attr:${K}`]?: IonGridAttributes[K] } & { [K in keyof IonGrid & keyof IonGridAttributes as `prop:${K}`]?: IonGrid[K] }; + "ion-header": Omit & { [K in keyof IonHeader & keyof IonHeaderAttributes]?: IonHeader[K] } & { [K in keyof IonHeader & keyof IonHeaderAttributes as `attr:${K}`]?: IonHeaderAttributes[K] } & { [K in keyof IonHeader & keyof IonHeaderAttributes as `prop:${K}`]?: IonHeader[K] }; + "ion-img": Omit & { [K in keyof IonImg & keyof IonImgAttributes]?: IonImg[K] } & { [K in keyof IonImg & keyof IonImgAttributes as `attr:${K}`]?: IonImgAttributes[K] } & { [K in keyof IonImg & keyof IonImgAttributes as `prop:${K}`]?: IonImg[K] }; + "ion-infinite-scroll": Omit & { [K in keyof IonInfiniteScroll & keyof IonInfiniteScrollAttributes]?: IonInfiniteScroll[K] } & { [K in keyof IonInfiniteScroll & keyof IonInfiniteScrollAttributes as `attr:${K}`]?: IonInfiniteScrollAttributes[K] } & { [K in keyof IonInfiniteScroll & keyof IonInfiniteScrollAttributes as `prop:${K}`]?: IonInfiniteScroll[K] }; + "ion-infinite-scroll-content": Omit & { [K in keyof IonInfiniteScrollContent & keyof IonInfiniteScrollContentAttributes]?: IonInfiniteScrollContent[K] } & { [K in keyof IonInfiniteScrollContent & keyof IonInfiniteScrollContentAttributes as `attr:${K}`]?: IonInfiniteScrollContentAttributes[K] } & { [K in keyof IonInfiniteScrollContent & keyof IonInfiniteScrollContentAttributes as `prop:${K}`]?: IonInfiniteScrollContent[K] }; + "ion-input": Omit & { [K in keyof IonInput & keyof IonInputAttributes]?: IonInput[K] } & { [K in keyof IonInput & keyof IonInputAttributes as `attr:${K}`]?: IonInputAttributes[K] } & { [K in keyof IonInput & keyof IonInputAttributes as `prop:${K}`]?: IonInput[K] }; + "ion-input-otp": Omit & { [K in keyof IonInputOtp & keyof IonInputOtpAttributes]?: IonInputOtp[K] } & { [K in keyof IonInputOtp & keyof IonInputOtpAttributes as `attr:${K}`]?: IonInputOtpAttributes[K] } & { [K in keyof IonInputOtp & keyof IonInputOtpAttributes as `prop:${K}`]?: IonInputOtp[K] }; + "ion-input-password-toggle": Omit & { [K in keyof IonInputPasswordToggle & keyof IonInputPasswordToggleAttributes]?: IonInputPasswordToggle[K] } & { [K in keyof IonInputPasswordToggle & keyof IonInputPasswordToggleAttributes as `attr:${K}`]?: IonInputPasswordToggleAttributes[K] } & { [K in keyof IonInputPasswordToggle & keyof IonInputPasswordToggleAttributes as `prop:${K}`]?: IonInputPasswordToggle[K] }; + "ion-item": Omit & { [K in keyof IonItem & keyof IonItemAttributes]?: IonItem[K] } & { [K in keyof IonItem & keyof IonItemAttributes as `attr:${K}`]?: IonItemAttributes[K] } & { [K in keyof IonItem & keyof IonItemAttributes as `prop:${K}`]?: IonItem[K] }; + "ion-item-divider": Omit & { [K in keyof IonItemDivider & keyof IonItemDividerAttributes]?: IonItemDivider[K] } & { [K in keyof IonItemDivider & keyof IonItemDividerAttributes as `attr:${K}`]?: IonItemDividerAttributes[K] } & { [K in keyof IonItemDivider & keyof IonItemDividerAttributes as `prop:${K}`]?: IonItemDivider[K] }; "ion-item-group": IonItemGroup; - "ion-item-option": IonItemOption; - "ion-item-options": IonItemOptions; - "ion-item-sliding": IonItemSliding; - "ion-label": IonLabel; - "ion-list": IonList; - "ion-list-header": IonListHeader; - "ion-loading": IonLoading; - "ion-menu": IonMenu; - "ion-menu-button": IonMenuButton; - "ion-menu-toggle": IonMenuToggle; - "ion-modal": IonModal; - "ion-nav": IonNav; - "ion-nav-link": IonNavLink; - "ion-note": IonNote; + "ion-item-option": Omit & { [K in keyof IonItemOption & keyof IonItemOptionAttributes]?: IonItemOption[K] } & { [K in keyof IonItemOption & keyof IonItemOptionAttributes as `attr:${K}`]?: IonItemOptionAttributes[K] } & { [K in keyof IonItemOption & keyof IonItemOptionAttributes as `prop:${K}`]?: IonItemOption[K] }; + "ion-item-options": Omit & { [K in keyof IonItemOptions & keyof IonItemOptionsAttributes]?: IonItemOptions[K] } & { [K in keyof IonItemOptions & keyof IonItemOptionsAttributes as `attr:${K}`]?: IonItemOptionsAttributes[K] } & { [K in keyof IonItemOptions & keyof IonItemOptionsAttributes as `prop:${K}`]?: IonItemOptions[K] }; + "ion-item-sliding": Omit & { [K in keyof IonItemSliding & keyof IonItemSlidingAttributes]?: IonItemSliding[K] } & { [K in keyof IonItemSliding & keyof IonItemSlidingAttributes as `attr:${K}`]?: IonItemSlidingAttributes[K] } & { [K in keyof IonItemSliding & keyof IonItemSlidingAttributes as `prop:${K}`]?: IonItemSliding[K] }; + "ion-label": Omit & { [K in keyof IonLabel & keyof IonLabelAttributes]?: IonLabel[K] } & { [K in keyof IonLabel & keyof IonLabelAttributes as `attr:${K}`]?: IonLabelAttributes[K] } & { [K in keyof IonLabel & keyof IonLabelAttributes as `prop:${K}`]?: IonLabel[K] }; + "ion-list": Omit & { [K in keyof IonList & keyof IonListAttributes]?: IonList[K] } & { [K in keyof IonList & keyof IonListAttributes as `attr:${K}`]?: IonListAttributes[K] } & { [K in keyof IonList & keyof IonListAttributes as `prop:${K}`]?: IonList[K] }; + "ion-list-header": Omit & { [K in keyof IonListHeader & keyof IonListHeaderAttributes]?: IonListHeader[K] } & { [K in keyof IonListHeader & keyof IonListHeaderAttributes as `attr:${K}`]?: IonListHeaderAttributes[K] } & { [K in keyof IonListHeader & keyof IonListHeaderAttributes as `prop:${K}`]?: IonListHeader[K] }; + "ion-loading": Omit & { [K in keyof IonLoading & keyof IonLoadingAttributes]?: IonLoading[K] } & { [K in keyof IonLoading & keyof IonLoadingAttributes as `attr:${K}`]?: IonLoadingAttributes[K] } & { [K in keyof IonLoading & keyof IonLoadingAttributes as `prop:${K}`]?: IonLoading[K] } & OneOf<"overlayIndex", IonLoading["overlayIndex"], IonLoadingAttributes["overlayIndex"]>; + "ion-menu": Omit & { [K in keyof IonMenu & keyof IonMenuAttributes]?: IonMenu[K] } & { [K in keyof IonMenu & keyof IonMenuAttributes as `attr:${K}`]?: IonMenuAttributes[K] } & { [K in keyof IonMenu & keyof IonMenuAttributes as `prop:${K}`]?: IonMenu[K] }; + "ion-menu-button": Omit & { [K in keyof IonMenuButton & keyof IonMenuButtonAttributes]?: IonMenuButton[K] } & { [K in keyof IonMenuButton & keyof IonMenuButtonAttributes as `attr:${K}`]?: IonMenuButtonAttributes[K] } & { [K in keyof IonMenuButton & keyof IonMenuButtonAttributes as `prop:${K}`]?: IonMenuButton[K] }; + "ion-menu-toggle": Omit & { [K in keyof IonMenuToggle & keyof IonMenuToggleAttributes]?: IonMenuToggle[K] } & { [K in keyof IonMenuToggle & keyof IonMenuToggleAttributes as `attr:${K}`]?: IonMenuToggleAttributes[K] } & { [K in keyof IonMenuToggle & keyof IonMenuToggleAttributes as `prop:${K}`]?: IonMenuToggle[K] }; + "ion-modal": Omit & { [K in keyof IonModal & keyof IonModalAttributes]?: IonModal[K] } & { [K in keyof IonModal & keyof IonModalAttributes as `attr:${K}`]?: IonModalAttributes[K] } & { [K in keyof IonModal & keyof IonModalAttributes as `prop:${K}`]?: IonModal[K] } & OneOf<"overlayIndex", IonModal["overlayIndex"], IonModalAttributes["overlayIndex"]>; + "ion-nav": Omit & { [K in keyof IonNav & keyof IonNavAttributes]?: IonNav[K] } & { [K in keyof IonNav & keyof IonNavAttributes as `attr:${K}`]?: IonNavAttributes[K] } & { [K in keyof IonNav & keyof IonNavAttributes as `prop:${K}`]?: IonNav[K] }; + "ion-nav-link": Omit & { [K in keyof IonNavLink & keyof IonNavLinkAttributes]?: IonNavLink[K] } & { [K in keyof IonNavLink & keyof IonNavLinkAttributes as `attr:${K}`]?: IonNavLinkAttributes[K] } & { [K in keyof IonNavLink & keyof IonNavLinkAttributes as `prop:${K}`]?: IonNavLink[K] }; + "ion-note": Omit & { [K in keyof IonNote & keyof IonNoteAttributes]?: IonNote[K] } & { [K in keyof IonNote & keyof IonNoteAttributes as `attr:${K}`]?: IonNoteAttributes[K] } & { [K in keyof IonNote & keyof IonNoteAttributes as `prop:${K}`]?: IonNote[K] }; "ion-picker": IonPicker; - "ion-picker-column": IonPickerColumn; - "ion-picker-column-option": IonPickerColumnOption; - "ion-picker-legacy": IonPickerLegacy; + "ion-picker-column": Omit & { [K in keyof IonPickerColumn & keyof IonPickerColumnAttributes]?: IonPickerColumn[K] } & { [K in keyof IonPickerColumn & keyof IonPickerColumnAttributes as `attr:${K}`]?: IonPickerColumnAttributes[K] } & { [K in keyof IonPickerColumn & keyof IonPickerColumnAttributes as `prop:${K}`]?: IonPickerColumn[K] }; + "ion-picker-column-option": Omit & { [K in keyof IonPickerColumnOption & keyof IonPickerColumnOptionAttributes]?: IonPickerColumnOption[K] } & { [K in keyof IonPickerColumnOption & keyof IonPickerColumnOptionAttributes as `attr:${K}`]?: IonPickerColumnOptionAttributes[K] } & { [K in keyof IonPickerColumnOption & keyof IonPickerColumnOptionAttributes as `prop:${K}`]?: IonPickerColumnOption[K] }; + "ion-picker-legacy": Omit & { [K in keyof IonPickerLegacy & keyof IonPickerLegacyAttributes]?: IonPickerLegacy[K] } & { [K in keyof IonPickerLegacy & keyof IonPickerLegacyAttributes as `attr:${K}`]?: IonPickerLegacyAttributes[K] } & { [K in keyof IonPickerLegacy & keyof IonPickerLegacyAttributes as `prop:${K}`]?: IonPickerLegacy[K] } & OneOf<"overlayIndex", IonPickerLegacy["overlayIndex"], IonPickerLegacyAttributes["overlayIndex"]>; "ion-picker-legacy-column": IonPickerLegacyColumn; - "ion-popover": IonPopover; - "ion-progress-bar": IonProgressBar; - "ion-radio": IonRadio; - "ion-radio-group": IonRadioGroup; - "ion-range": IonRange; - "ion-refresher": IonRefresher; - "ion-refresher-content": IonRefresherContent; + "ion-popover": Omit & { [K in keyof IonPopover & keyof IonPopoverAttributes]?: IonPopover[K] } & { [K in keyof IonPopover & keyof IonPopoverAttributes as `attr:${K}`]?: IonPopoverAttributes[K] } & { [K in keyof IonPopover & keyof IonPopoverAttributes as `prop:${K}`]?: IonPopover[K] } & OneOf<"overlayIndex", IonPopover["overlayIndex"], IonPopoverAttributes["overlayIndex"]>; + "ion-progress-bar": Omit & { [K in keyof IonProgressBar & keyof IonProgressBarAttributes]?: IonProgressBar[K] } & { [K in keyof IonProgressBar & keyof IonProgressBarAttributes as `attr:${K}`]?: IonProgressBarAttributes[K] } & { [K in keyof IonProgressBar & keyof IonProgressBarAttributes as `prop:${K}`]?: IonProgressBar[K] }; + "ion-radio": Omit & { [K in keyof IonRadio & keyof IonRadioAttributes]?: IonRadio[K] } & { [K in keyof IonRadio & keyof IonRadioAttributes as `attr:${K}`]?: IonRadioAttributes[K] } & { [K in keyof IonRadio & keyof IonRadioAttributes as `prop:${K}`]?: IonRadio[K] }; + "ion-radio-group": Omit & { [K in keyof IonRadioGroup & keyof IonRadioGroupAttributes]?: IonRadioGroup[K] } & { [K in keyof IonRadioGroup & keyof IonRadioGroupAttributes as `attr:${K}`]?: IonRadioGroupAttributes[K] } & { [K in keyof IonRadioGroup & keyof IonRadioGroupAttributes as `prop:${K}`]?: IonRadioGroup[K] }; + "ion-range": Omit & { [K in keyof IonRange & keyof IonRangeAttributes]?: IonRange[K] } & { [K in keyof IonRange & keyof IonRangeAttributes as `attr:${K}`]?: IonRangeAttributes[K] } & { [K in keyof IonRange & keyof IonRangeAttributes as `prop:${K}`]?: IonRange[K] }; + "ion-refresher": Omit & { [K in keyof IonRefresher & keyof IonRefresherAttributes]?: IonRefresher[K] } & { [K in keyof IonRefresher & keyof IonRefresherAttributes as `attr:${K}`]?: IonRefresherAttributes[K] } & { [K in keyof IonRefresher & keyof IonRefresherAttributes as `prop:${K}`]?: IonRefresher[K] }; + "ion-refresher-content": Omit & { [K in keyof IonRefresherContent & keyof IonRefresherContentAttributes]?: IonRefresherContent[K] } & { [K in keyof IonRefresherContent & keyof IonRefresherContentAttributes as `attr:${K}`]?: IonRefresherContentAttributes[K] } & { [K in keyof IonRefresherContent & keyof IonRefresherContentAttributes as `prop:${K}`]?: IonRefresherContent[K] }; "ion-reorder": IonReorder; - "ion-reorder-group": IonReorderGroup; - "ion-ripple-effect": IonRippleEffect; - "ion-route": IonRoute; - "ion-route-redirect": IonRouteRedirect; - "ion-router": IonRouter; - "ion-router-link": IonRouterLink; - "ion-router-outlet": IonRouterOutlet; + "ion-reorder-group": Omit & { [K in keyof IonReorderGroup & keyof IonReorderGroupAttributes]?: IonReorderGroup[K] } & { [K in keyof IonReorderGroup & keyof IonReorderGroupAttributes as `attr:${K}`]?: IonReorderGroupAttributes[K] } & { [K in keyof IonReorderGroup & keyof IonReorderGroupAttributes as `prop:${K}`]?: IonReorderGroup[K] }; + "ion-ripple-effect": Omit & { [K in keyof IonRippleEffect & keyof IonRippleEffectAttributes]?: IonRippleEffect[K] } & { [K in keyof IonRippleEffect & keyof IonRippleEffectAttributes as `attr:${K}`]?: IonRippleEffectAttributes[K] } & { [K in keyof IonRippleEffect & keyof IonRippleEffectAttributes as `prop:${K}`]?: IonRippleEffect[K] }; + "ion-route": Omit & { [K in keyof IonRoute & keyof IonRouteAttributes]?: IonRoute[K] } & { [K in keyof IonRoute & keyof IonRouteAttributes as `attr:${K}`]?: IonRouteAttributes[K] } & { [K in keyof IonRoute & keyof IonRouteAttributes as `prop:${K}`]?: IonRoute[K] } & OneOf<"component", IonRoute["component"], IonRouteAttributes["component"]>; + "ion-route-redirect": Omit & { [K in keyof IonRouteRedirect & keyof IonRouteRedirectAttributes]?: IonRouteRedirect[K] } & { [K in keyof IonRouteRedirect & keyof IonRouteRedirectAttributes as `attr:${K}`]?: IonRouteRedirectAttributes[K] } & { [K in keyof IonRouteRedirect & keyof IonRouteRedirectAttributes as `prop:${K}`]?: IonRouteRedirect[K] } & OneOf<"from", IonRouteRedirect["from"], IonRouteRedirectAttributes["from"]> & OneOf<"to", IonRouteRedirect["to"], IonRouteRedirectAttributes["to"]>; + "ion-router": Omit & { [K in keyof IonRouter & keyof IonRouterAttributes]?: IonRouter[K] } & { [K in keyof IonRouter & keyof IonRouterAttributes as `attr:${K}`]?: IonRouterAttributes[K] } & { [K in keyof IonRouter & keyof IonRouterAttributes as `prop:${K}`]?: IonRouter[K] }; + "ion-router-link": Omit & { [K in keyof IonRouterLink & keyof IonRouterLinkAttributes]?: IonRouterLink[K] } & { [K in keyof IonRouterLink & keyof IonRouterLinkAttributes as `attr:${K}`]?: IonRouterLinkAttributes[K] } & { [K in keyof IonRouterLink & keyof IonRouterLinkAttributes as `prop:${K}`]?: IonRouterLink[K] }; + "ion-router-outlet": Omit & { [K in keyof IonRouterOutlet & keyof IonRouterOutletAttributes]?: IonRouterOutlet[K] } & { [K in keyof IonRouterOutlet & keyof IonRouterOutletAttributes as `attr:${K}`]?: IonRouterOutletAttributes[K] } & { [K in keyof IonRouterOutlet & keyof IonRouterOutletAttributes as `prop:${K}`]?: IonRouterOutlet[K] }; "ion-row": IonRow; - "ion-searchbar": IonSearchbar; - "ion-segment": IonSegment; - "ion-segment-button": IonSegmentButton; + "ion-searchbar": Omit & { [K in keyof IonSearchbar & keyof IonSearchbarAttributes]?: IonSearchbar[K] } & { [K in keyof IonSearchbar & keyof IonSearchbarAttributes as `attr:${K}`]?: IonSearchbarAttributes[K] } & { [K in keyof IonSearchbar & keyof IonSearchbarAttributes as `prop:${K}`]?: IonSearchbar[K] }; + "ion-segment": Omit & { [K in keyof IonSegment & keyof IonSegmentAttributes]?: IonSegment[K] } & { [K in keyof IonSegment & keyof IonSegmentAttributes as `attr:${K}`]?: IonSegmentAttributes[K] } & { [K in keyof IonSegment & keyof IonSegmentAttributes as `prop:${K}`]?: IonSegment[K] }; + "ion-segment-button": Omit & { [K in keyof IonSegmentButton & keyof IonSegmentButtonAttributes]?: IonSegmentButton[K] } & { [K in keyof IonSegmentButton & keyof IonSegmentButtonAttributes as `attr:${K}`]?: IonSegmentButtonAttributes[K] } & { [K in keyof IonSegmentButton & keyof IonSegmentButtonAttributes as `prop:${K}`]?: IonSegmentButton[K] }; "ion-segment-content": IonSegmentContent; - "ion-segment-view": IonSegmentView; - "ion-select": IonSelect; - "ion-select-modal": IonSelectModal; - "ion-select-option": IonSelectOption; - "ion-select-popover": IonSelectPopover; - "ion-skeleton-text": IonSkeletonText; - "ion-spinner": IonSpinner; - "ion-split-pane": IonSplitPane; - "ion-tab": IonTab; - "ion-tab-bar": IonTabBar; - "ion-tab-button": IonTabButton; - "ion-tabs": IonTabs; - "ion-text": IonText; - "ion-textarea": IonTextarea; + "ion-segment-view": Omit & { [K in keyof IonSegmentView & keyof IonSegmentViewAttributes]?: IonSegmentView[K] } & { [K in keyof IonSegmentView & keyof IonSegmentViewAttributes as `attr:${K}`]?: IonSegmentViewAttributes[K] } & { [K in keyof IonSegmentView & keyof IonSegmentViewAttributes as `prop:${K}`]?: IonSegmentView[K] }; + "ion-select": Omit & { [K in keyof IonSelect & keyof IonSelectAttributes]?: IonSelect[K] } & { [K in keyof IonSelect & keyof IonSelectAttributes as `attr:${K}`]?: IonSelectAttributes[K] } & { [K in keyof IonSelect & keyof IonSelectAttributes as `prop:${K}`]?: IonSelect[K] }; + "ion-select-modal": Omit & { [K in keyof IonSelectModal & keyof IonSelectModalAttributes]?: IonSelectModal[K] } & { [K in keyof IonSelectModal & keyof IonSelectModalAttributes as `attr:${K}`]?: IonSelectModalAttributes[K] } & { [K in keyof IonSelectModal & keyof IonSelectModalAttributes as `prop:${K}`]?: IonSelectModal[K] }; + "ion-select-option": Omit & { [K in keyof IonSelectOption & keyof IonSelectOptionAttributes]?: IonSelectOption[K] } & { [K in keyof IonSelectOption & keyof IonSelectOptionAttributes as `attr:${K}`]?: IonSelectOptionAttributes[K] } & { [K in keyof IonSelectOption & keyof IonSelectOptionAttributes as `prop:${K}`]?: IonSelectOption[K] }; + "ion-select-popover": Omit & { [K in keyof IonSelectPopover & keyof IonSelectPopoverAttributes]?: IonSelectPopover[K] } & { [K in keyof IonSelectPopover & keyof IonSelectPopoverAttributes as `attr:${K}`]?: IonSelectPopoverAttributes[K] } & { [K in keyof IonSelectPopover & keyof IonSelectPopoverAttributes as `prop:${K}`]?: IonSelectPopover[K] }; + "ion-skeleton-text": Omit & { [K in keyof IonSkeletonText & keyof IonSkeletonTextAttributes]?: IonSkeletonText[K] } & { [K in keyof IonSkeletonText & keyof IonSkeletonTextAttributes as `attr:${K}`]?: IonSkeletonTextAttributes[K] } & { [K in keyof IonSkeletonText & keyof IonSkeletonTextAttributes as `prop:${K}`]?: IonSkeletonText[K] }; + "ion-spinner": Omit & { [K in keyof IonSpinner & keyof IonSpinnerAttributes]?: IonSpinner[K] } & { [K in keyof IonSpinner & keyof IonSpinnerAttributes as `attr:${K}`]?: IonSpinnerAttributes[K] } & { [K in keyof IonSpinner & keyof IonSpinnerAttributes as `prop:${K}`]?: IonSpinner[K] }; + "ion-split-pane": Omit & { [K in keyof IonSplitPane & keyof IonSplitPaneAttributes]?: IonSplitPane[K] } & { [K in keyof IonSplitPane & keyof IonSplitPaneAttributes as `attr:${K}`]?: IonSplitPaneAttributes[K] } & { [K in keyof IonSplitPane & keyof IonSplitPaneAttributes as `prop:${K}`]?: IonSplitPane[K] }; + "ion-tab": Omit & { [K in keyof IonTab & keyof IonTabAttributes]?: IonTab[K] } & { [K in keyof IonTab & keyof IonTabAttributes as `attr:${K}`]?: IonTabAttributes[K] } & { [K in keyof IonTab & keyof IonTabAttributes as `prop:${K}`]?: IonTab[K] } & OneOf<"tab", IonTab["tab"], IonTabAttributes["tab"]>; + "ion-tab-bar": Omit & { [K in keyof IonTabBar & keyof IonTabBarAttributes]?: IonTabBar[K] } & { [K in keyof IonTabBar & keyof IonTabBarAttributes as `attr:${K}`]?: IonTabBarAttributes[K] } & { [K in keyof IonTabBar & keyof IonTabBarAttributes as `prop:${K}`]?: IonTabBar[K] }; + "ion-tab-button": Omit & { [K in keyof IonTabButton & keyof IonTabButtonAttributes]?: IonTabButton[K] } & { [K in keyof IonTabButton & keyof IonTabButtonAttributes as `attr:${K}`]?: IonTabButtonAttributes[K] } & { [K in keyof IonTabButton & keyof IonTabButtonAttributes as `prop:${K}`]?: IonTabButton[K] }; + "ion-tabs": Omit & { [K in keyof IonTabs & keyof IonTabsAttributes]?: IonTabs[K] } & { [K in keyof IonTabs & keyof IonTabsAttributes as `attr:${K}`]?: IonTabsAttributes[K] } & { [K in keyof IonTabs & keyof IonTabsAttributes as `prop:${K}`]?: IonTabs[K] }; + "ion-text": Omit & { [K in keyof IonText & keyof IonTextAttributes]?: IonText[K] } & { [K in keyof IonText & keyof IonTextAttributes as `attr:${K}`]?: IonTextAttributes[K] } & { [K in keyof IonText & keyof IonTextAttributes as `prop:${K}`]?: IonText[K] }; + "ion-textarea": Omit & { [K in keyof IonTextarea & keyof IonTextareaAttributes]?: IonTextarea[K] } & { [K in keyof IonTextarea & keyof IonTextareaAttributes as `attr:${K}`]?: IonTextareaAttributes[K] } & { [K in keyof IonTextarea & keyof IonTextareaAttributes as `prop:${K}`]?: IonTextarea[K] }; "ion-thumbnail": IonThumbnail; - "ion-title": IonTitle; - "ion-toast": IonToast; - "ion-toggle": IonToggle; - "ion-toolbar": IonToolbar; + "ion-title": Omit & { [K in keyof IonTitle & keyof IonTitleAttributes]?: IonTitle[K] } & { [K in keyof IonTitle & keyof IonTitleAttributes as `attr:${K}`]?: IonTitleAttributes[K] } & { [K in keyof IonTitle & keyof IonTitleAttributes as `prop:${K}`]?: IonTitle[K] }; + "ion-toast": Omit & { [K in keyof IonToast & keyof IonToastAttributes]?: IonToast[K] } & { [K in keyof IonToast & keyof IonToastAttributes as `attr:${K}`]?: IonToastAttributes[K] } & { [K in keyof IonToast & keyof IonToastAttributes as `prop:${K}`]?: IonToast[K] } & OneOf<"overlayIndex", IonToast["overlayIndex"], IonToastAttributes["overlayIndex"]>; + "ion-toggle": Omit & { [K in keyof IonToggle & keyof IonToggleAttributes]?: IonToggle[K] } & { [K in keyof IonToggle & keyof IonToggleAttributes as `attr:${K}`]?: IonToggleAttributes[K] } & { [K in keyof IonToggle & keyof IonToggleAttributes as `prop:${K}`]?: IonToggle[K] }; + "ion-toolbar": Omit & { [K in keyof IonToolbar & keyof IonToolbarAttributes]?: IonToolbar[K] } & { [K in keyof IonToolbar & keyof IonToolbarAttributes as `attr:${K}`]?: IonToolbarAttributes[K] } & { [K in keyof IonToolbar & keyof IonToolbarAttributes as `prop:${K}`]?: IonToolbar[K] }; } } export { LocalJSX as JSX }; declare module "@stencil/core" { export namespace JSX { interface IntrinsicElements { - "ion-accordion": LocalJSX.IonAccordion & JSXBase.HTMLAttributes; - "ion-accordion-group": LocalJSX.IonAccordionGroup & JSXBase.HTMLAttributes; - "ion-action-sheet": LocalJSX.IonActionSheet & JSXBase.HTMLAttributes; - "ion-alert": LocalJSX.IonAlert & JSXBase.HTMLAttributes; - "ion-app": LocalJSX.IonApp & JSXBase.HTMLAttributes; - "ion-avatar": LocalJSX.IonAvatar & JSXBase.HTMLAttributes; - "ion-back-button": LocalJSX.IonBackButton & JSXBase.HTMLAttributes; - "ion-backdrop": LocalJSX.IonBackdrop & JSXBase.HTMLAttributes; - "ion-badge": LocalJSX.IonBadge & JSXBase.HTMLAttributes; - "ion-breadcrumb": LocalJSX.IonBreadcrumb & JSXBase.HTMLAttributes; - "ion-breadcrumbs": LocalJSX.IonBreadcrumbs & JSXBase.HTMLAttributes; - "ion-button": LocalJSX.IonButton & JSXBase.HTMLAttributes; - "ion-buttons": LocalJSX.IonButtons & JSXBase.HTMLAttributes; - "ion-card": LocalJSX.IonCard & JSXBase.HTMLAttributes; - "ion-card-content": LocalJSX.IonCardContent & JSXBase.HTMLAttributes; - "ion-card-header": LocalJSX.IonCardHeader & JSXBase.HTMLAttributes; - "ion-card-subtitle": LocalJSX.IonCardSubtitle & JSXBase.HTMLAttributes; - "ion-card-title": LocalJSX.IonCardTitle & JSXBase.HTMLAttributes; - "ion-checkbox": LocalJSX.IonCheckbox & JSXBase.HTMLAttributes; - "ion-chip": LocalJSX.IonChip & JSXBase.HTMLAttributes; - "ion-col": LocalJSX.IonCol & JSXBase.HTMLAttributes; - "ion-content": LocalJSX.IonContent & JSXBase.HTMLAttributes; - "ion-datetime": LocalJSX.IonDatetime & JSXBase.HTMLAttributes; - "ion-datetime-button": LocalJSX.IonDatetimeButton & JSXBase.HTMLAttributes; - "ion-fab": LocalJSX.IonFab & JSXBase.HTMLAttributes; - "ion-fab-button": LocalJSX.IonFabButton & JSXBase.HTMLAttributes; - "ion-fab-list": LocalJSX.IonFabList & JSXBase.HTMLAttributes; - "ion-footer": LocalJSX.IonFooter & JSXBase.HTMLAttributes; - "ion-grid": LocalJSX.IonGrid & JSXBase.HTMLAttributes; - "ion-header": LocalJSX.IonHeader & JSXBase.HTMLAttributes; - "ion-img": LocalJSX.IonImg & JSXBase.HTMLAttributes; - "ion-infinite-scroll": LocalJSX.IonInfiniteScroll & JSXBase.HTMLAttributes; - "ion-infinite-scroll-content": LocalJSX.IonInfiniteScrollContent & JSXBase.HTMLAttributes; - "ion-input": LocalJSX.IonInput & JSXBase.HTMLAttributes; - "ion-input-otp": LocalJSX.IonInputOtp & JSXBase.HTMLAttributes; - "ion-input-password-toggle": LocalJSX.IonInputPasswordToggle & JSXBase.HTMLAttributes; - "ion-item": LocalJSX.IonItem & JSXBase.HTMLAttributes; - "ion-item-divider": LocalJSX.IonItemDivider & JSXBase.HTMLAttributes; - "ion-item-group": LocalJSX.IonItemGroup & JSXBase.HTMLAttributes; - "ion-item-option": LocalJSX.IonItemOption & JSXBase.HTMLAttributes; - "ion-item-options": LocalJSX.IonItemOptions & JSXBase.HTMLAttributes; - "ion-item-sliding": LocalJSX.IonItemSliding & JSXBase.HTMLAttributes; - "ion-label": LocalJSX.IonLabel & JSXBase.HTMLAttributes; - "ion-list": LocalJSX.IonList & JSXBase.HTMLAttributes; - "ion-list-header": LocalJSX.IonListHeader & JSXBase.HTMLAttributes; - "ion-loading": LocalJSX.IonLoading & JSXBase.HTMLAttributes; - "ion-menu": LocalJSX.IonMenu & JSXBase.HTMLAttributes; - "ion-menu-button": LocalJSX.IonMenuButton & JSXBase.HTMLAttributes; - "ion-menu-toggle": LocalJSX.IonMenuToggle & JSXBase.HTMLAttributes; - "ion-modal": LocalJSX.IonModal & JSXBase.HTMLAttributes; - "ion-nav": LocalJSX.IonNav & JSXBase.HTMLAttributes; - "ion-nav-link": LocalJSX.IonNavLink & JSXBase.HTMLAttributes; - "ion-note": LocalJSX.IonNote & JSXBase.HTMLAttributes; - "ion-picker": LocalJSX.IonPicker & JSXBase.HTMLAttributes; - "ion-picker-column": LocalJSX.IonPickerColumn & JSXBase.HTMLAttributes; - "ion-picker-column-option": LocalJSX.IonPickerColumnOption & JSXBase.HTMLAttributes; - "ion-picker-legacy": LocalJSX.IonPickerLegacy & JSXBase.HTMLAttributes; - "ion-picker-legacy-column": LocalJSX.IonPickerLegacyColumn & JSXBase.HTMLAttributes; - "ion-popover": LocalJSX.IonPopover & JSXBase.HTMLAttributes; - "ion-progress-bar": LocalJSX.IonProgressBar & JSXBase.HTMLAttributes; - "ion-radio": LocalJSX.IonRadio & JSXBase.HTMLAttributes; - "ion-radio-group": LocalJSX.IonRadioGroup & JSXBase.HTMLAttributes; - "ion-range": LocalJSX.IonRange & JSXBase.HTMLAttributes; - "ion-refresher": LocalJSX.IonRefresher & JSXBase.HTMLAttributes; - "ion-refresher-content": LocalJSX.IonRefresherContent & JSXBase.HTMLAttributes; - "ion-reorder": LocalJSX.IonReorder & JSXBase.HTMLAttributes; - "ion-reorder-group": LocalJSX.IonReorderGroup & JSXBase.HTMLAttributes; - "ion-ripple-effect": LocalJSX.IonRippleEffect & JSXBase.HTMLAttributes; - "ion-route": LocalJSX.IonRoute & JSXBase.HTMLAttributes; - "ion-route-redirect": LocalJSX.IonRouteRedirect & JSXBase.HTMLAttributes; - "ion-router": LocalJSX.IonRouter & JSXBase.HTMLAttributes; - "ion-router-link": LocalJSX.IonRouterLink & JSXBase.HTMLAttributes; - "ion-router-outlet": LocalJSX.IonRouterOutlet & JSXBase.HTMLAttributes; - "ion-row": LocalJSX.IonRow & JSXBase.HTMLAttributes; - "ion-searchbar": LocalJSX.IonSearchbar & JSXBase.HTMLAttributes; - "ion-segment": LocalJSX.IonSegment & JSXBase.HTMLAttributes; - "ion-segment-button": LocalJSX.IonSegmentButton & JSXBase.HTMLAttributes; - "ion-segment-content": LocalJSX.IonSegmentContent & JSXBase.HTMLAttributes; - "ion-segment-view": LocalJSX.IonSegmentView & JSXBase.HTMLAttributes; - "ion-select": LocalJSX.IonSelect & JSXBase.HTMLAttributes; - "ion-select-modal": LocalJSX.IonSelectModal & JSXBase.HTMLAttributes; - "ion-select-option": LocalJSX.IonSelectOption & JSXBase.HTMLAttributes; - "ion-select-popover": LocalJSX.IonSelectPopover & JSXBase.HTMLAttributes; - "ion-skeleton-text": LocalJSX.IonSkeletonText & JSXBase.HTMLAttributes; - "ion-spinner": LocalJSX.IonSpinner & JSXBase.HTMLAttributes; - "ion-split-pane": LocalJSX.IonSplitPane & JSXBase.HTMLAttributes; - "ion-tab": LocalJSX.IonTab & JSXBase.HTMLAttributes; - "ion-tab-bar": LocalJSX.IonTabBar & JSXBase.HTMLAttributes; - "ion-tab-button": LocalJSX.IonTabButton & JSXBase.HTMLAttributes; - "ion-tabs": LocalJSX.IonTabs & JSXBase.HTMLAttributes; - "ion-text": LocalJSX.IonText & JSXBase.HTMLAttributes; - "ion-textarea": LocalJSX.IonTextarea & JSXBase.HTMLAttributes; - "ion-thumbnail": LocalJSX.IonThumbnail & JSXBase.HTMLAttributes; - "ion-title": LocalJSX.IonTitle & JSXBase.HTMLAttributes; - "ion-toast": LocalJSX.IonToast & JSXBase.HTMLAttributes; - "ion-toggle": LocalJSX.IonToggle & JSXBase.HTMLAttributes; - "ion-toolbar": LocalJSX.IonToolbar & JSXBase.HTMLAttributes; + "ion-accordion": LocalJSX.IntrinsicElements["ion-accordion"] & JSXBase.HTMLAttributes; + "ion-accordion-group": LocalJSX.IntrinsicElements["ion-accordion-group"] & JSXBase.HTMLAttributes; + "ion-action-sheet": LocalJSX.IntrinsicElements["ion-action-sheet"] & JSXBase.HTMLAttributes; + "ion-alert": LocalJSX.IntrinsicElements["ion-alert"] & JSXBase.HTMLAttributes; + "ion-app": LocalJSX.IntrinsicElements["ion-app"] & JSXBase.HTMLAttributes; + "ion-avatar": LocalJSX.IntrinsicElements["ion-avatar"] & JSXBase.HTMLAttributes; + "ion-back-button": LocalJSX.IntrinsicElements["ion-back-button"] & JSXBase.HTMLAttributes; + "ion-backdrop": LocalJSX.IntrinsicElements["ion-backdrop"] & JSXBase.HTMLAttributes; + "ion-badge": LocalJSX.IntrinsicElements["ion-badge"] & JSXBase.HTMLAttributes; + "ion-breadcrumb": LocalJSX.IntrinsicElements["ion-breadcrumb"] & JSXBase.HTMLAttributes; + "ion-breadcrumbs": LocalJSX.IntrinsicElements["ion-breadcrumbs"] & JSXBase.HTMLAttributes; + "ion-button": LocalJSX.IntrinsicElements["ion-button"] & JSXBase.HTMLAttributes; + "ion-buttons": LocalJSX.IntrinsicElements["ion-buttons"] & JSXBase.HTMLAttributes; + "ion-card": LocalJSX.IntrinsicElements["ion-card"] & JSXBase.HTMLAttributes; + "ion-card-content": LocalJSX.IntrinsicElements["ion-card-content"] & JSXBase.HTMLAttributes; + "ion-card-header": LocalJSX.IntrinsicElements["ion-card-header"] & JSXBase.HTMLAttributes; + "ion-card-subtitle": LocalJSX.IntrinsicElements["ion-card-subtitle"] & JSXBase.HTMLAttributes; + "ion-card-title": LocalJSX.IntrinsicElements["ion-card-title"] & JSXBase.HTMLAttributes; + "ion-checkbox": LocalJSX.IntrinsicElements["ion-checkbox"] & JSXBase.HTMLAttributes; + "ion-chip": LocalJSX.IntrinsicElements["ion-chip"] & JSXBase.HTMLAttributes; + "ion-col": LocalJSX.IntrinsicElements["ion-col"] & JSXBase.HTMLAttributes; + "ion-content": LocalJSX.IntrinsicElements["ion-content"] & JSXBase.HTMLAttributes; + "ion-datetime": LocalJSX.IntrinsicElements["ion-datetime"] & JSXBase.HTMLAttributes; + "ion-datetime-button": LocalJSX.IntrinsicElements["ion-datetime-button"] & JSXBase.HTMLAttributes; + "ion-fab": LocalJSX.IntrinsicElements["ion-fab"] & JSXBase.HTMLAttributes; + "ion-fab-button": LocalJSX.IntrinsicElements["ion-fab-button"] & JSXBase.HTMLAttributes; + "ion-fab-list": LocalJSX.IntrinsicElements["ion-fab-list"] & JSXBase.HTMLAttributes; + "ion-footer": LocalJSX.IntrinsicElements["ion-footer"] & JSXBase.HTMLAttributes; + "ion-grid": LocalJSX.IntrinsicElements["ion-grid"] & JSXBase.HTMLAttributes; + "ion-header": LocalJSX.IntrinsicElements["ion-header"] & JSXBase.HTMLAttributes; + "ion-img": LocalJSX.IntrinsicElements["ion-img"] & JSXBase.HTMLAttributes; + "ion-infinite-scroll": LocalJSX.IntrinsicElements["ion-infinite-scroll"] & JSXBase.HTMLAttributes; + "ion-infinite-scroll-content": LocalJSX.IntrinsicElements["ion-infinite-scroll-content"] & JSXBase.HTMLAttributes; + "ion-input": LocalJSX.IntrinsicElements["ion-input"] & JSXBase.HTMLAttributes; + "ion-input-otp": LocalJSX.IntrinsicElements["ion-input-otp"] & JSXBase.HTMLAttributes; + "ion-input-password-toggle": LocalJSX.IntrinsicElements["ion-input-password-toggle"] & JSXBase.HTMLAttributes; + "ion-item": LocalJSX.IntrinsicElements["ion-item"] & JSXBase.HTMLAttributes; + "ion-item-divider": LocalJSX.IntrinsicElements["ion-item-divider"] & JSXBase.HTMLAttributes; + "ion-item-group": LocalJSX.IntrinsicElements["ion-item-group"] & JSXBase.HTMLAttributes; + "ion-item-option": LocalJSX.IntrinsicElements["ion-item-option"] & JSXBase.HTMLAttributes; + "ion-item-options": LocalJSX.IntrinsicElements["ion-item-options"] & JSXBase.HTMLAttributes; + "ion-item-sliding": LocalJSX.IntrinsicElements["ion-item-sliding"] & JSXBase.HTMLAttributes; + "ion-label": LocalJSX.IntrinsicElements["ion-label"] & JSXBase.HTMLAttributes; + "ion-list": LocalJSX.IntrinsicElements["ion-list"] & JSXBase.HTMLAttributes; + "ion-list-header": LocalJSX.IntrinsicElements["ion-list-header"] & JSXBase.HTMLAttributes; + "ion-loading": LocalJSX.IntrinsicElements["ion-loading"] & JSXBase.HTMLAttributes; + "ion-menu": LocalJSX.IntrinsicElements["ion-menu"] & JSXBase.HTMLAttributes; + "ion-menu-button": LocalJSX.IntrinsicElements["ion-menu-button"] & JSXBase.HTMLAttributes; + "ion-menu-toggle": LocalJSX.IntrinsicElements["ion-menu-toggle"] & JSXBase.HTMLAttributes; + "ion-modal": LocalJSX.IntrinsicElements["ion-modal"] & JSXBase.HTMLAttributes; + "ion-nav": LocalJSX.IntrinsicElements["ion-nav"] & JSXBase.HTMLAttributes; + "ion-nav-link": LocalJSX.IntrinsicElements["ion-nav-link"] & JSXBase.HTMLAttributes; + "ion-note": LocalJSX.IntrinsicElements["ion-note"] & JSXBase.HTMLAttributes; + "ion-picker": LocalJSX.IntrinsicElements["ion-picker"] & JSXBase.HTMLAttributes; + "ion-picker-column": LocalJSX.IntrinsicElements["ion-picker-column"] & JSXBase.HTMLAttributes; + "ion-picker-column-option": LocalJSX.IntrinsicElements["ion-picker-column-option"] & JSXBase.HTMLAttributes; + "ion-picker-legacy": LocalJSX.IntrinsicElements["ion-picker-legacy"] & JSXBase.HTMLAttributes; + "ion-picker-legacy-column": LocalJSX.IntrinsicElements["ion-picker-legacy-column"] & JSXBase.HTMLAttributes; + "ion-popover": LocalJSX.IntrinsicElements["ion-popover"] & JSXBase.HTMLAttributes; + "ion-progress-bar": LocalJSX.IntrinsicElements["ion-progress-bar"] & JSXBase.HTMLAttributes; + "ion-radio": LocalJSX.IntrinsicElements["ion-radio"] & JSXBase.HTMLAttributes; + "ion-radio-group": LocalJSX.IntrinsicElements["ion-radio-group"] & JSXBase.HTMLAttributes; + "ion-range": LocalJSX.IntrinsicElements["ion-range"] & JSXBase.HTMLAttributes; + "ion-refresher": LocalJSX.IntrinsicElements["ion-refresher"] & JSXBase.HTMLAttributes; + "ion-refresher-content": LocalJSX.IntrinsicElements["ion-refresher-content"] & JSXBase.HTMLAttributes; + "ion-reorder": LocalJSX.IntrinsicElements["ion-reorder"] & JSXBase.HTMLAttributes; + "ion-reorder-group": LocalJSX.IntrinsicElements["ion-reorder-group"] & JSXBase.HTMLAttributes; + "ion-ripple-effect": LocalJSX.IntrinsicElements["ion-ripple-effect"] & JSXBase.HTMLAttributes; + "ion-route": LocalJSX.IntrinsicElements["ion-route"] & JSXBase.HTMLAttributes; + "ion-route-redirect": LocalJSX.IntrinsicElements["ion-route-redirect"] & JSXBase.HTMLAttributes; + "ion-router": LocalJSX.IntrinsicElements["ion-router"] & JSXBase.HTMLAttributes; + "ion-router-link": LocalJSX.IntrinsicElements["ion-router-link"] & JSXBase.HTMLAttributes; + "ion-router-outlet": LocalJSX.IntrinsicElements["ion-router-outlet"] & JSXBase.HTMLAttributes; + "ion-row": LocalJSX.IntrinsicElements["ion-row"] & JSXBase.HTMLAttributes; + "ion-searchbar": LocalJSX.IntrinsicElements["ion-searchbar"] & JSXBase.HTMLAttributes; + "ion-segment": LocalJSX.IntrinsicElements["ion-segment"] & JSXBase.HTMLAttributes; + "ion-segment-button": LocalJSX.IntrinsicElements["ion-segment-button"] & JSXBase.HTMLAttributes; + "ion-segment-content": LocalJSX.IntrinsicElements["ion-segment-content"] & JSXBase.HTMLAttributes; + "ion-segment-view": LocalJSX.IntrinsicElements["ion-segment-view"] & JSXBase.HTMLAttributes; + "ion-select": LocalJSX.IntrinsicElements["ion-select"] & JSXBase.HTMLAttributes; + "ion-select-modal": LocalJSX.IntrinsicElements["ion-select-modal"] & JSXBase.HTMLAttributes; + "ion-select-option": LocalJSX.IntrinsicElements["ion-select-option"] & JSXBase.HTMLAttributes; + "ion-select-popover": LocalJSX.IntrinsicElements["ion-select-popover"] & JSXBase.HTMLAttributes; + "ion-skeleton-text": LocalJSX.IntrinsicElements["ion-skeleton-text"] & JSXBase.HTMLAttributes; + "ion-spinner": LocalJSX.IntrinsicElements["ion-spinner"] & JSXBase.HTMLAttributes; + "ion-split-pane": LocalJSX.IntrinsicElements["ion-split-pane"] & JSXBase.HTMLAttributes; + "ion-tab": LocalJSX.IntrinsicElements["ion-tab"] & JSXBase.HTMLAttributes; + "ion-tab-bar": LocalJSX.IntrinsicElements["ion-tab-bar"] & JSXBase.HTMLAttributes; + "ion-tab-button": LocalJSX.IntrinsicElements["ion-tab-button"] & JSXBase.HTMLAttributes; + "ion-tabs": LocalJSX.IntrinsicElements["ion-tabs"] & JSXBase.HTMLAttributes; + "ion-text": LocalJSX.IntrinsicElements["ion-text"] & JSXBase.HTMLAttributes; + "ion-textarea": LocalJSX.IntrinsicElements["ion-textarea"] & JSXBase.HTMLAttributes; + "ion-thumbnail": LocalJSX.IntrinsicElements["ion-thumbnail"] & JSXBase.HTMLAttributes; + "ion-title": LocalJSX.IntrinsicElements["ion-title"] & JSXBase.HTMLAttributes; + "ion-toast": LocalJSX.IntrinsicElements["ion-toast"] & JSXBase.HTMLAttributes; + "ion-toggle": LocalJSX.IntrinsicElements["ion-toggle"] & JSXBase.HTMLAttributes; + "ion-toolbar": LocalJSX.IntrinsicElements["ion-toolbar"] & JSXBase.HTMLAttributes; } } } From 6ea186d96d80a94b774d4d0a51d536e0e5599935 Mon Sep 17 00:00:00 2001 From: Maria Hutt Date: Fri, 20 Feb 2026 13:36:39 -0800 Subject: [PATCH 35/55] feat(datetime): add header parts (#30945) Co-authored-by: Brandy Smith --- core/api.txt | 8 + core/src/components/datetime/datetime.tsx | 37 +++- .../datetime/test/custom/datetime.e2e.ts | 184 ++++++++++++++++++ .../datetime/test/custom/index.html | 45 +++++ 4 files changed, 267 insertions(+), 7 deletions(-) diff --git a/core/api.txt b/core/api.txt index fd21aed675a..1ae4c424116 100644 --- a/core/api.txt +++ b/core/api.txt @@ -566,7 +566,15 @@ ion-datetime,part,calendar-day ion-datetime,part,calendar-day active ion-datetime,part,calendar-day disabled ion-datetime,part,calendar-day today +ion-datetime,part,calendar-days-of-week +ion-datetime,part,calendar-header +ion-datetime,part,datetime-header +ion-datetime,part,datetime-selected-date +ion-datetime,part,datetime-title ion-datetime,part,month-year-button +ion-datetime,part,navigation-button +ion-datetime,part,next-button +ion-datetime,part,previous-button ion-datetime,part,time-button ion-datetime,part,time-button active ion-datetime,part,wheel diff --git a/core/src/components/datetime/datetime.tsx b/core/src/components/datetime/datetime.tsx index 95f97d37cf0..8c767eee5a9 100644 --- a/core/src/components/datetime/datetime.tsx +++ b/core/src/components/datetime/datetime.tsx @@ -88,14 +88,23 @@ import { checkForPresentationFormatMismatch, warnIfTimeZoneProvided } from './ut * layout with `presentation="date-time"` or `"time-date"`. * @part time-button active - The time picker button when the picker is open. * + * @part calendar-header - The calendar header manages the date navigation controls (month/year picker and previous/next buttons) and the days of the week when using a grid style layout. * @part month-year-button - The button that opens the month/year picker when * using a grid style layout. + * @part navigation-button - The buttons used to navigate to the next or previous month when using a grid style layout. + * @part previous-button - The button used to navigate to the previous month when using a grid style layout. + * @part next-button - The button used to navigate to the next month when using a grid style layout. + * @part calendar-days-of-week - The container for the day-of-the-week header (both weekdays and weekends) when using a grid style layout. * * @part calendar-day - The individual buttons that display a day inside of the datetime * calendar. * @part calendar-day active - The currently selected calendar day. * @part calendar-day today - The calendar day that contains the current day. * @part calendar-day disabled - The calendar day that is disabled. + * + * @part datetime-header - The datetime header contains the content for the `title` slot and the selected date. + * @part datetime-title - The element that contains the `title` slot content. + * @part datetime-selected-date - The element that contains the selected date. */ @Component({ tag: 'ion-datetime', @@ -2166,7 +2175,7 @@ export class Datetime implements ComponentInterface { const hostDir = this.el.getAttribute('dir') || undefined; return ( -
+
-
+ +
+ +``` + +### `content` + +**What it does:** The main user-content area of an overlay or the primary content region (e.g. modal body, toolbar’s main slot). + +- **Use when**: The element is the primary content area where users see the main content (overlay body, or primary slot inside something like a toolbar). +- **Examples**: `ion-modal`, `ion-popover`, `ion-accordion`, `ion-toolbar` (the div that wraps the default slot inside the toolbar container). + +**ion-modal** - `content` wraps the default `` which is the primary content: + +```tsx + +``` + +**ion-toolbar** - `content` wraps the default `` which is the primary content: + +```tsx +
+ + +
+ +
+ + +
+``` + +## Specialized Parts + +Components may also expose specialized parts for specific elements. The following parts are reused across multiple components: + +| Name | Description | +| --- | --- | +| `background` | Background elements (e.g., `ion-content`, `ion-toolbar`) | +| `backdrop` | Backdrop elements. **Must only be used on `` components.** (e.g., `ion-modal`, `ion-popover`, `ion-menu`) | +| `label` | Label text elements - not the HTML `
-
+
+
diff --git a/core/src/components/item/test/css-variables/index.html b/core/src/components/item/test/css-variables/index.html deleted file mode 100644 index 44dbfe0c88e..00000000000 --- a/core/src/components/item/test/css-variables/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - Item - CSS Variables - - - - - - - - - - - - - - - Item CSS variables - - - - - - - Item 1 - - - - Item 2 - - - - Item 3 - - - - - - diff --git a/core/src/components/item/test/css-variables/item.e2e.ts b/core/src/components/item/test/css-variables/item.e2e.ts deleted file mode 100644 index 7f24b1724cd..00000000000 --- a/core/src/components/item/test/css-variables/item.e2e.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { expect } from '@playwright/test'; -import { configs, test } from '@utils/test/playwright'; - -/** - * This behavior does not vary across directions - */ -configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => { - test.describe(title('item: CSS variables'), () => { - test('should not have visual regressions', async ({ page }) => { - await page.goto(`/src/components/item/test/css-variables`, config); - - await page.setIonViewport(); - - await expect(page).toHaveScreenshot(screenshot(`item-css-vars-diff`)); - }); - }); -}); diff --git a/core/src/components/item/test/css-variables/item.e2e.ts-snapshots/item-css-vars-diff-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/item/test/css-variables/item.e2e.ts-snapshots/item-css-vars-diff-ios-ltr-Mobile-Chrome-linux.png deleted file mode 100644 index e5deac11796fe591093c71521ab67b172e90d211..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8066 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 v$CSUy@>f~@_@}qO(DD~r{@)P?+WcK81cA7Oxm diff --git a/core/src/components/item/test/css-variables/item.e2e.ts-snapshots/item-css-vars-diff-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/item/test/css-variables/item.e2e.ts-snapshots/item-css-vars-diff-ios-ltr-Mobile-Firefox-linux.png deleted file mode 100644 index de756ae34fcac6266a7141c058d743612da8e800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14129 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 F_HQ(5Ya;*v diff --git a/core/src/components/item/test/css-variables/item.e2e.ts-snapshots/item-css-vars-diff-ios-ltr-Mobile-Safari-linux.png b/core/src/components/item/test/css-variables/item.e2e.ts-snapshots/item-css-vars-diff-ios-ltr-Mobile-Safari-linux.png deleted file mode 100644 index 763572ddc846fe5d82f0f318ef0bc5f9319b61b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9429 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 NCk;>J9zS>ezX8?C%=7>N diff --git a/core/src/components/item/test/css-variables/item.e2e.ts-snapshots/item-css-vars-diff-md-ltr-Mobile-Chrome-linux.png b/core/src/components/item/test/css-variables/item.e2e.ts-snapshots/item-css-vars-diff-md-ltr-Mobile-Chrome-linux.png deleted file mode 100644 index 10e9806c874cd30d0d611df9d3b2c53059c6ae9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8388 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 b_$s?DF4dBd6L}WQ4l&d-xsrGJ_T&Eo*T6oU diff --git a/core/src/components/item/test/css-variables/item.e2e.ts-snapshots/item-css-vars-diff-md-ltr-Mobile-Firefox-linux.png b/core/src/components/item/test/css-variables/item.e2e.ts-snapshots/item-css-vars-diff-md-ltr-Mobile-Firefox-linux.png deleted file mode 100644 index 24b45b3112e24442a5c1be2e47152f53f01b6782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14135 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 H|JDBi11ZS2 diff --git a/core/src/components/item/test/css-variables/item.e2e.ts-snapshots/item-css-vars-diff-md-ltr-Mobile-Safari-linux.png b/core/src/components/item/test/css-variables/item.e2e.ts-snapshots/item-css-vars-diff-md-ltr-Mobile-Safari-linux.png deleted file mode 100644 index dbcf1f27b7a4499299f4ea149b5fb6966f725ca5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9958 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 { + test.describe(title('item: custom'), () => { + test.describe('CSS shadow parts', () => { + test('should be able to customize native part', async ({ page }) => { + await page.setContent( + ` + + + + Item + + `, + config + ); + + const item = page.locator('ion-item'); + const backgroundColor = await item.evaluate((el) => { + const shadowRoot = el.shadowRoot; + const native = shadowRoot?.querySelector('.item-native'); + return native ? window.getComputedStyle(native).backgroundColor : ''; + }); + expect(backgroundColor).toBe('rgb(255, 0, 0)'); + }); + + test('should be able to customize inner part', async ({ page }) => { + await page.setContent( + ` + + + + Item + + `, + config + ); + + const item = page.locator('ion-item'); + const backgroundColor = await item.evaluate((el) => { + const shadowRoot = el.shadowRoot; + const inner = shadowRoot?.querySelector('.item-inner'); + return inner ? window.getComputedStyle(inner).backgroundColor : ''; + }); + expect(backgroundColor).toBe('rgb(0, 128, 0)'); + }); + + test('should be able to customize container part', async ({ page }) => { + await page.setContent( + ` + + + + Item + + `, + config + ); + + const item = page.locator('ion-item'); + const backgroundColor = await item.evaluate((el) => { + const shadowRoot = el.shadowRoot; + const container = shadowRoot?.querySelector('.input-wrapper'); + return container ? window.getComputedStyle(container).backgroundColor : ''; + }); + expect(backgroundColor).toBe('rgb(0, 0, 255)'); + }); + + test('should be able to customize detail-icon part', async ({ page }) => { + await page.setContent( + ` + + + + Item + + `, + config + ); + + const item = page.locator('ion-item'); + const backgroundColor = await item.evaluate((el) => { + const shadowRoot = el.shadowRoot; + const detailIcon = shadowRoot?.querySelector('.item-detail-icon'); + return detailIcon ? window.getComputedStyle(detailIcon).backgroundColor : ''; + }); + expect(backgroundColor).toBe('rgb(255, 0, 0)'); + }); + }); + + test.describe('CSS variables', () => { + test('should be able to customize background using css variables', async ({ page }) => { + await page.setContent( + ` + + + + Item + + `, + config + ); + + const item = page.locator('ion-item'); + const backgroundColor = await item.evaluate((el) => { + const shadowRoot = el.shadowRoot; + const native = shadowRoot?.querySelector('.item-native'); + return native ? window.getComputedStyle(native).backgroundColor : ''; + }); + expect(backgroundColor).toBe('rgb(255, 0, 0)'); + }); + + test('should be able to customize padding using css variables', async ({ page }) => { + await page.setContent( + ` + + + + Item + + `, + config + ); + + const item = page.locator('ion-item'); + const paddingValues = await item.evaluate((el) => { + const shadowRoot = el.shadowRoot; + const native = shadowRoot?.querySelector('.item-native'); + return { + paddingTop: native ? window.getComputedStyle(native).paddingTop : '', + paddingBottom: native ? window.getComputedStyle(native).paddingBottom : '', + paddingStart: native ? window.getComputedStyle(native).paddingLeft : '', + paddingEnd: native ? window.getComputedStyle(native).paddingRight : '', + }; + }); + expect(paddingValues.paddingTop).toBe('20px'); + expect(paddingValues.paddingBottom).toBe('20px'); + expect(paddingValues.paddingStart).toBe('10px'); + expect(paddingValues.paddingEnd).toBe('10px'); + }); + }); + }); +}); From 2be39da9d33464540c6467ab3e13c466b512f707 Mon Sep 17 00:00:00 2001 From: OS-jacobbell <228905018+OS-jacobbell@users.noreply.github.com> Date: Fri, 27 Feb 2026 09:22:36 -0700 Subject: [PATCH 42/55] docs(stencil): document `externalRuntime: false` in config (#30975) ## Does this introduce a breaking change? - [ ] Yes - [X] No --- core/stencil.config.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/stencil.config.ts b/core/stencil.config.ts index 1e457e264c6..8a090b65bff 100644 --- a/core/stencil.config.ts +++ b/core/stencil.config.ts @@ -227,6 +227,11 @@ export const config: Config = { warn: true }], includeGlobalScripts: false, + /** + * External Runtime uses default runtime settings instead of this file's definitions. Disabling it enables + * `experimentalSlotFixes` to be applied and prevents `@stencil/core/internal/client` from being imported, which + * contains a dynamic import that caused a warning in Angular. + */ externalRuntime: false, }, { From 5cdeb7fd357298f15e7ae29b14412d97bdc7c656 Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Fri, 27 Feb 2026 12:53:49 -0500 Subject: [PATCH 43/55] feat(item-divider): add inner and container parts (#30928) Issue number: N/A --------- ## What is the current behavior? The inner structural elements of item-divider are not exposed as shadow parts, preventing users from being able to customize their styles directly. ## What is the new behavior? - Exposes `inner` and `container` shadow parts - Adds e2e test coverage for customizing the shadow parts ## Does this introduce a breaking change? - [ ] Yes - [x] No --------- Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- core/api.txt | 2 + .../components/item-divider/item-divider.tsx | 7 ++- .../test/custom/item-divider.e2e.ts | 57 +++++++++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 core/src/components/item-divider/test/custom/item-divider.e2e.ts diff --git a/core/api.txt b/core/api.txt index 7d28f5139c2..fc57c79d1c2 100644 --- a/core/api.txt +++ b/core/api.txt @@ -968,6 +968,8 @@ ion-item-divider,css-prop,--padding-start,ios ion-item-divider,css-prop,--padding-start,md ion-item-divider,css-prop,--padding-top,ios ion-item-divider,css-prop,--padding-top,md +ion-item-divider,part,container +ion-item-divider,part,inner ion-item-group,none diff --git a/core/src/components/item-divider/item-divider.tsx b/core/src/components/item-divider/item-divider.tsx index ac449ffa3ad..0febf393300 100644 --- a/core/src/components/item-divider/item-divider.tsx +++ b/core/src/components/item-divider/item-divider.tsx @@ -11,6 +11,9 @@ import type { Color } from '../../interface'; * @slot - Content is placed between the named slots if provided without a slot. * @slot start - Content is placed to the left of the divider text in LTR, and to the right in RTL. * @slot end - Content is placed to the right of the divider text in LTR, and to the left in RTL. + * + * @part inner - The inner wrapper element that arranges the divider content. + * @part container - The wrapper element that contains the default slot. */ @Component({ tag: 'ion-item-divider', @@ -50,8 +53,8 @@ export class ItemDivider implements ComponentInterface { })} > -
-
+
+
diff --git a/core/src/components/item-divider/test/custom/item-divider.e2e.ts b/core/src/components/item-divider/test/custom/item-divider.e2e.ts new file mode 100644 index 00000000000..497d607a2b8 --- /dev/null +++ b/core/src/components/item-divider/test/custom/item-divider.e2e.ts @@ -0,0 +1,57 @@ +import { expect } from '@playwright/test'; +import { configs, test } from '@utils/test/playwright'; + +/** + * This behavior does not vary across modes/directions + */ +configs({ directions: ['ltr'], modes: ['md'] }).forEach(({ title, config }) => { + test.describe(title('item-divider: custom'), () => { + test.describe('CSS shadow parts', () => { + test('should be able to customize inner part', async ({ page }) => { + await page.setContent( + ` + + + Divider + `, + config + ); + + const divider = page.locator('ion-item-divider'); + const backgroundColor = await divider.evaluate((el) => { + const shadowRoot = el.shadowRoot; + const inner = shadowRoot?.querySelector('.item-divider-inner'); + return inner ? window.getComputedStyle(inner).backgroundColor : ''; + }); + expect(backgroundColor).toBe('rgb(255, 0, 0)'); + }); + + test('should be able to customize container part', async ({ page }) => { + await page.setContent( + ` + + + Divider + `, + config + ); + + const divider = page.locator('ion-item-divider'); + const backgroundColor = await divider.evaluate((el) => { + const shadowRoot = el.shadowRoot; + const container = shadowRoot?.querySelector('.item-divider-wrapper'); + return container ? window.getComputedStyle(container).backgroundColor : ''; + }); + expect(backgroundColor).toBe('rgb(0, 128, 0)'); + }); + }); + }); +}); From f8f7ffda318c0143d9bb5c79fe55b4ecb88e6ce3 Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Fri, 27 Feb 2026 13:26:01 -0500 Subject: [PATCH 44/55] feat(item-option): add inner and container parts (#30929) Issue number: N/A --------- ## What is the current behavior? The inner structural elements of item-option are not exposed as shadow parts, preventing users from being able to customize their styles directly. ## What is the new behavior? - Exposes `inner` and `container` shadow parts - Adds e2e test coverage for customizing the shadow parts ## Does this introduce a breaking change? - [ ] Yes - [x] No --------- Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- core/api.txt | 2 + .../components/item-option/item-option.tsx | 6 +- .../test/custom/item-option.e2e.ts | 80 +++++++++++++++++++ 3 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 core/src/components/item-option/test/custom/item-option.e2e.ts diff --git a/core/api.txt b/core/api.txt index fc57c79d1c2..db226fdcadc 100644 --- a/core/api.txt +++ b/core/api.txt @@ -987,6 +987,8 @@ ion-item-option,css-prop,--background,ios ion-item-option,css-prop,--background,md ion-item-option,css-prop,--color,ios ion-item-option,css-prop,--color,md +ion-item-option,part,container +ion-item-option,part,inner ion-item-option,part,native ion-item-options,none diff --git a/core/src/components/item-option/item-option.tsx b/core/src/components/item-option/item-option.tsx index 81bee8b8fef..c3cae1a9e2f 100644 --- a/core/src/components/item-option/item-option.tsx +++ b/core/src/components/item-option/item-option.tsx @@ -17,6 +17,8 @@ import type { Color } from '../../interface'; * @slot end - Content is placed to the right of the option text in LTR, and to the left in RTL. * * @part native - The native HTML button or anchor element that wraps all child elements. + * @part inner - The inner wrapper element that arranges the option content. + * @part container - The container element that wraps the start, icon-only, default, and end slots. */ @Component({ tag: 'ion-item-option', @@ -109,9 +111,9 @@ export class ItemOption implements ComponentInterface, AnchorInterface, ButtonIn })} > - + -
+
diff --git a/core/src/components/item-option/test/custom/item-option.e2e.ts b/core/src/components/item-option/test/custom/item-option.e2e.ts new file mode 100644 index 00000000000..b1a44d7dc6f --- /dev/null +++ b/core/src/components/item-option/test/custom/item-option.e2e.ts @@ -0,0 +1,80 @@ +import { expect } from '@playwright/test'; +import { configs, test } from '@utils/test/playwright'; + +/** + * This behavior does not vary across modes/directions + */ +configs({ directions: ['ltr'], modes: ['md'] }).forEach(({ title, config }) => { + test.describe(title('item-option: custom'), () => { + test.describe('CSS shadow parts', () => { + test('should be able to customize native part', async ({ page }) => { + await page.setContent( + ` + + + Option + `, + config + ); + + const itemOption = page.locator('ion-item-option'); + const backgroundColor = await itemOption.evaluate((el) => { + const shadowRoot = el.shadowRoot; + const native = shadowRoot?.querySelector('.button-native'); + return native ? window.getComputedStyle(native).backgroundColor : ''; + }); + expect(backgroundColor).toBe('rgb(255, 0, 0)'); + }); + + test('should be able to customize inner part', async ({ page }) => { + await page.setContent( + ` + + + Option + `, + config + ); + + const itemOption = page.locator('ion-item-option'); + const backgroundColor = await itemOption.evaluate((el) => { + const shadowRoot = el.shadowRoot; + const inner = shadowRoot?.querySelector('.button-inner'); + return inner ? window.getComputedStyle(inner).backgroundColor : ''; + }); + expect(backgroundColor).toBe('rgb(0, 128, 0)'); + }); + + test('should be able to customize container part', async ({ page }) => { + await page.setContent( + ` + + + Option + `, + config + ); + + const itemOption = page.locator('ion-item-option'); + const backgroundColor = await itemOption.evaluate((el) => { + const shadowRoot = el.shadowRoot; + const container = shadowRoot?.querySelector('.horizontal-wrapper'); + return container ? window.getComputedStyle(container).backgroundColor : ''; + }); + expect(backgroundColor).toBe('rgb(0, 0, 255)'); + }); + }); + }); +}); From ef73476e08670630907e775a38f9ed30a84e3f1f Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Fri, 27 Feb 2026 13:40:42 -0500 Subject: [PATCH 45/55] feat(list-header): add inner part (#30930) Issue number: N/A --------- ## What is the current behavior? The inner structural element of list-header is not exposed as a shadow part, preventing users from being able to customize its styles directly. ## What is the new behavior? - Exposes `inner` shadow part - Adds e2e test coverage for customizing the shadow part ## Does this introduce a breaking change? - [ ] Yes - [x] No --------- Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- core/api.txt | 1 + .../components/list-header/list-header.tsx | 4 ++- .../test/custom/list-header.e2e.ts | 34 +++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 core/src/components/list-header/test/custom/list-header.e2e.ts diff --git a/core/api.txt b/core/api.txt index db226fdcadc..f372d95883b 100644 --- a/core/api.txt +++ b/core/api.txt @@ -1033,6 +1033,7 @@ ion-list-header,css-prop,--color,ios ion-list-header,css-prop,--color,md ion-list-header,css-prop,--inner-border-width,ios ion-list-header,css-prop,--inner-border-width,md +ion-list-header,part,inner ion-loading,scoped ion-loading,prop,animated,boolean,true,false,false diff --git a/core/src/components/list-header/list-header.tsx b/core/src/components/list-header/list-header.tsx index 8fb939c1277..0cb2b2837c3 100644 --- a/core/src/components/list-header/list-header.tsx +++ b/core/src/components/list-header/list-header.tsx @@ -7,6 +7,8 @@ import type { Color } from '../../interface'; /** * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use. + * + * @part inner - The inner wrapper element that arranges the list header content. */ @Component({ tag: 'ion-list-header', @@ -40,7 +42,7 @@ export class ListHeader implements ComponentInterface { [`list-header-lines-${lines}`]: lines !== undefined, })} > -
+
diff --git a/core/src/components/list-header/test/custom/list-header.e2e.ts b/core/src/components/list-header/test/custom/list-header.e2e.ts new file mode 100644 index 00000000000..64a7ae105de --- /dev/null +++ b/core/src/components/list-header/test/custom/list-header.e2e.ts @@ -0,0 +1,34 @@ +import { expect } from '@playwright/test'; +import { configs, test } from '@utils/test/playwright'; + +/** + * This behavior does not vary across modes/directions + */ +configs({ directions: ['ltr'], modes: ['md'] }).forEach(({ title, config }) => { + test.describe(title('list-header: custom'), () => { + test.describe('CSS shadow parts', () => { + test('should be able to customize inner part', async ({ page }) => { + await page.setContent( + ` + + + Header + `, + config + ); + + const header = page.locator('ion-list-header'); + const backgroundColor = await header.evaluate((el) => { + const shadowRoot = el.shadowRoot; + const inner = shadowRoot?.querySelector('.list-header-inner'); + return inner ? window.getComputedStyle(inner).backgroundColor : ''; + }); + expect(backgroundColor).toBe('rgb(255, 0, 0)'); + }); + }); + }); +}); From 5bcf92184118055483bf306ab9e319b8e3e61870 Mon Sep 17 00:00:00 2001 From: Brandy Smith Date: Wed, 4 Mar 2026 10:36:50 -0500 Subject: [PATCH 46/55] feat(range): add classes and expose parts to allow individual styling of dual knobs (#30941) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue number: resolves #29862 --------- ## What is the current behavior? Range exposes a single part for both knobs & pins. This makes it impossible to style the knobs/pins differently when dual knobs is enabled. ## What is the new behavior? - Fixes a bug where the knobs would swap A & B when they cross over each other - Fixes the focus behavior so that dual knobs act the same as a single knob range when focusing a knob - Adds the following classes to the host element when `dualKnobs` is enabled: - `range-dual-knobs` - `range-pressed-a` when the knob with name A is pressed - `range-pressed-b` when the knob with name B is pressed - `range-pressed-lower` when the lower knob is pressed - `range-pressed-upper` when the upper knob is pressed - Adds parts for the following: - `knob-handle-a` — The container for the knob with the static `A` identity when `dualKnobs` is `true`. This identity does not change, even if the knobs cross and swap which one represents the lower or upper value. - `knob-handle-b` — The container for the knob with the static `B` identity when `dualKnobs` is `true`. This identity does not change, even if the knobs cross and swap which one represents the lower or upper value. - `knob-handle-lower` — The container for the knob whose current `value` is `lower` when `dualKnobs` is `true`. The lower and upper parts swap which knob handle they refer to when the knobs cross. - `knob-handle-upper` — The container for the knob whose current `value` is `upper` when `dualKnobs` is `true`. The lower and upper parts swap which knob handle they refer to when the knobs cross. - `pin-a` — The value indicator above the knob with the static `A` identity when `dualKnobs` is `true`. This identity does not change, even if the knobs cross and swap which one represents the lower or upper value. - `pin-b` — The value indicator above the knob with the static `B` identity when `dualKnobs` is `true`. This identity does not change, even if the knobs cross and swap which one represents the lower or upper value. - `pin-lower` — The value indicator above the knob whose current `value` is `lower` when `dualKnobs` is `true`. The lower and upper parts swap which pin they refer to when the knobs cross. - `pin-upper` — The value indicator above the knob whose current `value` is `upper` when `dualKnobs` is `true`. The lower and upper parts swap which pin they refer to when the knobs cross. - `knob-a` — The visual knob for the static `A` identity when `dualKnobs` is `true`. This identity does not change, even if the knobs cross and swap which one represents the lower or upper value. - `knob-b` — The visual knob for the static `B` identity when `dualKnobs` is `true`. This identity does not change, even if the knobs cross and swap which one represents the lower or upper value. - `knob-lower` — The visual knob whose current `value` is `lower` when `dualKnobs` is `true`. The lower and upper parts swap which knob they refer to when the knobs cross. - `knob-upper` — The visual knob whose current `value` is `upper` when `dualKnobs` is `true`. The lower and upper parts swap which knob they refer to when the knobs cross. - `activated` — Added to the knob-handle, knob, and pin when the knob is active. Only one set has this part at a time when `dualKnobs` is `true`. - `focused` — Added to the knob-handle, knob, and pin that currently has focus. Only one set has this part at a time when `dualKnobs` is `true`. - `hover` — Added to the knob-handle, knob, and pin when the knob has hover. Only one set has this part at a time when `dualKnobs` is `true`. - `pressed` — Added to the knob-handle, knob, and pin that is currently being pressed to drag. Only one set has this part at a time when `dualKnobs` is `true`. - Adds e2e tests for the following: - customizing label part - customizing bar parts - customizing pin parts - customizing tick parts - customizing knob parts - customizing dual knob a & b parts - customizing dual knob lower & upper parts - verifies that a & b parts stay on the original elements but lower & upper parts swap when the values swap - Adds spec tests for the following: - css classes - value state classes - boolean property classes - pressed state classes - shadow parts - static shadow parts - verifies the shadow parts exist based on the existence of certain range properties - state shadow parts - verifies the shadow parts exist based on the state of the range knob (pressed, focused, activated, hover) ## Does this introduce a breaking change? - [ ] Yes - [x] No --------- Co-authored-by: Brandy Smith <6577830+brandyscarney@users.noreply.github.com> --- core/api.txt | 17 + core/setupJest.js | 4 +- core/src/components/range/range-interface.ts | 2 + core/src/components/range/range.tsx | 285 ++++++-- .../components/range/test/basic/range.spec.ts | 22 +- .../components/range/test/custom/index.html | 360 ++++++++++ .../components/range/test/custom/range.e2e.ts | 426 ++++++++++- ...nge-custom-ios-ltr-Mobile-Chrome-linux.png | Bin 1953 -> 0 bytes ...ge-custom-ios-ltr-Mobile-Firefox-linux.png | Bin 2738 -> 0 bytes ...nge-custom-ios-ltr-Mobile-Safari-linux.png | Bin 1948 -> 0 bytes ...ange-custom-md-ltr-Mobile-Chrome-linux.png | Bin 751 -> 0 bytes ...nge-custom-md-ltr-Mobile-Firefox-linux.png | Bin 1092 -> 0 bytes ...ange-custom-md-ltr-Mobile-Safari-linux.png | Bin 782 -> 0 bytes core/src/components/range/test/range.spec.ts | 661 ++++++++++++++++-- 14 files changed, 1638 insertions(+), 139 deletions(-) delete mode 100644 core/src/components/range/test/custom/range.e2e.ts-snapshots/range-custom-ios-ltr-Mobile-Chrome-linux.png delete mode 100644 core/src/components/range/test/custom/range.e2e.ts-snapshots/range-custom-ios-ltr-Mobile-Firefox-linux.png delete mode 100644 core/src/components/range/test/custom/range.e2e.ts-snapshots/range-custom-ios-ltr-Mobile-Safari-linux.png delete mode 100644 core/src/components/range/test/custom/range.e2e.ts-snapshots/range-custom-md-ltr-Mobile-Chrome-linux.png delete mode 100644 core/src/components/range/test/custom/range.e2e.ts-snapshots/range-custom-md-ltr-Mobile-Firefox-linux.png delete mode 100644 core/src/components/range/test/custom/range.e2e.ts-snapshots/range-custom-md-ltr-Mobile-Safari-linux.png diff --git a/core/api.txt b/core/api.txt index f372d95883b..80e9632d489 100644 --- a/core/api.txt +++ b/core/api.txt @@ -1488,11 +1488,28 @@ ion-range,css-prop,--pin-background,ios ion-range,css-prop,--pin-background,md ion-range,css-prop,--pin-color,ios ion-range,css-prop,--pin-color,md +ion-range,part,activated ion-range,part,bar ion-range,part,bar-active +ion-range,part,focused +ion-range,part,hover ion-range,part,knob +ion-range,part,knob-a +ion-range,part,knob-b +ion-range,part,knob-handle +ion-range,part,knob-handle-a +ion-range,part,knob-handle-b +ion-range,part,knob-handle-lower +ion-range,part,knob-handle-upper +ion-range,part,knob-lower +ion-range,part,knob-upper ion-range,part,label ion-range,part,pin +ion-range,part,pin-a +ion-range,part,pin-b +ion-range,part,pin-lower +ion-range,part,pin-upper +ion-range,part,pressed ion-range,part,tick ion-range,part,tick-active diff --git a/core/setupJest.js b/core/setupJest.js index f2eb0e70a31..77ea127c680 100644 --- a/core/setupJest.js +++ b/core/setupJest.js @@ -8,7 +8,9 @@ expect.extend({ throw new Error('expected toHaveShadowPart to be called on an element with a shadow root'); } - const shadowPart = received.shadowRoot.querySelector(`[part="${part}"]`); + // Use attribute selector with ~= to match space-separated part values + // e.g., [part~="knob"] matches elements with part="knob" or part="knob knob-a" + const shadowPart = received.shadowRoot.querySelector(`[part~="${part}"]`); const pass = shadowPart !== null; const message = `expected ${received.tagName.toLowerCase()} to have shadow part "${part}"`; diff --git a/core/src/components/range/range-interface.ts b/core/src/components/range/range-interface.ts index 1908bbab172..9cc696d90e3 100644 --- a/core/src/components/range/range-interface.ts +++ b/core/src/components/range/range-interface.ts @@ -1,5 +1,7 @@ export type KnobName = 'A' | 'B' | undefined; +export type KnobPosition = 'lower' | 'upper' | undefined; + export type RangeValue = number | { lower: number; upper: number }; export type PinFormatter = (value: number) => number | string; diff --git a/core/src/components/range/range.tsx b/core/src/components/range/range.tsx index 431dbe4b7fe..26e5ef785dd 100644 --- a/core/src/components/range/range.tsx +++ b/core/src/components/range/range.tsx @@ -1,5 +1,5 @@ import type { ComponentInterface, EventEmitter } from '@stencil/core'; -import { Component, Element, Event, Host, Prop, State, Watch, h } from '@stencil/core'; +import { Build, Component, Element, Event, Host, Prop, State, Watch, h } from '@stencil/core'; import { findClosestIonContent, disableContentScrollY, resetContentScrollY } from '@utils/content'; import type { Attributes } from '@utils/helpers'; import { inheritAriaAttributes, clamp, debounceEvent, renderHiddenInput, isSafeNumber } from '@utils/helpers'; @@ -13,6 +13,7 @@ import { roundToMaxDecimalPlaces } from '../../utils/floating-point'; import type { KnobName, + KnobPosition, RangeChangeEventDetail, RangeKnobMoveEndEventDetail, RangeKnobMoveStartEventDetail, @@ -29,13 +30,30 @@ import type { * @slot start - Content is placed to the left of the range slider in LTR, and to the right in RTL. * @slot end - Content is placed to the right of the range slider in LTR, and to the left in RTL. * + * @part label - The label text describing the range. * @part tick - An inactive tick mark. * @part tick-active - An active tick mark. - * @part pin - The counter that appears above a knob. - * @part knob - The handle that is used to drag the range. * @part bar - The inactive part of the bar. * @part bar-active - The active part of the bar. - * @part label - The label text describing the range. + * @part knob-handle - The container that wraps the knob and handles drag interactions. + * @part knob-handle-a - The container for the knob with the static `A` identity when `dualKnobs` is `true`. This identity does not change, even if the knobs cross and swap which one represents the lower or upper value. + * @part knob-handle-b - The container for the knob with the static `B` identity when `dualKnobs` is `true`. This identity does not change, even if the knobs cross and swap which one represents the lower or upper value. + * @part knob-handle-lower - The container for the knob whose current `value` is `lower` when `dualKnobs` is `true`. The lower and upper parts swap which knob handle they refer to when the knobs cross. + * @part knob-handle-upper - The container for the knob whose current `value` is `upper` when `dualKnobs` is `true`. The lower and upper parts swap which knob handle they refer to when the knobs cross. + * @part pin - The value indicator displayed above a knob. + * @part pin-a - The value indicator above the knob with the static `A` identity when `dualKnobs` is `true`. This identity does not change, even if the knobs cross and swap which one represents the lower or upper value. + * @part pin-b - The value indicator above the knob with the static `B` identity when `dualKnobs` is `true`. This identity does not change, even if the knobs cross and swap which one represents the lower or upper value. + * @part pin-lower - The value indicator above the knob whose current `value` is `lower` when `dualKnobs` is `true`. The lower and upper parts swap which pin they refer to when the knobs cross. + * @part pin-upper - The value indicator above the knob whose current `value` is `upper` when `dualKnobs` is `true`. The lower and upper parts swap which pin they refer to when the knobs cross. + * @part knob - The visual knob element on the range track. + * @part knob-a - The visual knob for the static `A` identity when `dualKnobs` is `true`. This identity does not change, even if the knobs cross and swap which one represents the lower or upper value. + * @part knob-b - The visual knob for the static `B` identity when `dualKnobs` is `true`. This identity does not change, even if the knobs cross and swap which one represents the lower or upper value. + * @part knob-lower - The visual knob whose current `value` is `lower` when `dualKnobs` is `true`. The lower and upper parts swap which knob they refer to when the knobs cross. + * @part knob-upper - The visual knob whose current `value` is `upper` when `dualKnobs` is `true`. The lower and upper parts swap which knob they refer to when the knobs cross. + * @part activated - Added to the knob-handle, knob, and pin when the knob is active. Only one set has this part at a time when `dualKnobs` is `true`. + * @part focused - Added to the knob-handle, knob, and pin that currently has focus. Only one set has this part at a time when `dualKnobs` is `true`. + * @part hover - Added to the knob-handle, knob, and pin when the knob has hover. Only one set has this part at a time when `dualKnobs` is `true`. + * @part pressed - Added to the knob-handle, knob, and pin that is currently being pressed to drag. Only one set has this part at a time when `dualKnobs` is `true`. */ @Component({ tag: 'ion-range', @@ -57,11 +75,27 @@ export class Range implements ComponentInterface { private contentEl: HTMLElement | null = null; private initialContentScrollY = true; private originalIonInput?: EventEmitter; + /** + * Used to avoid setting the focused state on click or tap. The focused + * state is only set when the focus comes from the keyboard (e.g. Tab). + * This is set to true on pointer down (mouse/touch). + */ + private focusFromPointer = false; + /** + * Observes class changes on the knob handles to keep the activatedKnob + * state in sync with the ion-activated class. This is necessary to + * determine which knob the user is dragging when using dual knobs and + * apply the activated part correctly. + */ + private activatedObserver?: MutationObserver; @Element() el!: HTMLIonRangeElement; @State() private ratioA = 0; @State() private ratioB = 0; + @State() private activatedKnob: KnobName; + @State() private focusedKnob: KnobName; + @State() private hoveredKnob: KnobName; @State() private pressedKnob: KnobName; /** @@ -324,6 +358,34 @@ export class Range implements ComponentInterface { } }; + /** + * Observes the knob handles for the ion-activated class and syncs + * activatedKnob so the activated part is correctly set on the handle, + * knob, and pin. + */ + private setupActivatedObserver = () => { + const knobHandleA = this.el.shadowRoot!.querySelector('.range-knob-handle-a'); + const knobHandleB = this.el.shadowRoot!.querySelector('.range-knob-handle-b'); + + const syncActivated = () => { + this.activatedKnob = (knobHandleA as HTMLElement)?.classList.contains('ion-activated') + ? 'A' + : (knobHandleB as HTMLElement)?.classList.contains('ion-activated') + ? 'B' + : undefined; + }; + + if (Build.isBrowser && typeof MutationObserver !== 'undefined') { + this.activatedObserver = new MutationObserver(syncActivated); + this.activatedObserver.observe(this.el.shadowRoot!, { + attributes: true, + attributeFilter: ['class'], + subtree: true, + }); + } + syncActivated(); + }; + componentWillLoad() { /** * If user has custom ID set then we should @@ -345,6 +407,7 @@ export class Range implements ComponentInterface { this.originalIonInput = this.ionInput; this.setupGesture(); this.updateRatio(); + this.setupActivatedObserver(); this.didLoad = true; } @@ -362,6 +425,7 @@ export class Range implements ComponentInterface { */ if (this.didLoad) { this.setupGesture(); + this.setupActivatedObserver(); } const ionContent = findClosestIonContent(this.el); @@ -373,6 +437,10 @@ export class Range implements ComponentInterface { this.gesture.destroy(); this.gesture = undefined; } + if (this.activatedObserver) { + this.activatedObserver.disconnect(); + this.activatedObserver = undefined; + } } private handleKeyboard = (knob: KnobName, isIncrease: boolean) => { @@ -467,7 +535,7 @@ export class Range implements ComponentInterface { * started dragging the knob. * * This is necessary to determine which knob the user is dragging, - * especially when it's a dual knob. + * especially when using dual knobs. * Plus, it determines when to apply certain styles. * * This only needs to be done once since the knob won't change @@ -496,7 +564,7 @@ export class Range implements ComponentInterface { * dragged the knob. They just tapped on the bar. * * This is necessary to determine which knob the user is changing, - * especially when it's a dual knob. + * especially when using dual knobs. * Plus, it determines when to apply certain styles. */ if (this.pressedKnob === undefined) { @@ -515,6 +583,7 @@ export class Range implements ComponentInterface { // update the active knob's position this.update(currentX); + /** * Reset the pressed knob to undefined since the user * may start dragging a different knob in the next gesture event. @@ -559,8 +628,6 @@ export class Range implements ComponentInterface { ratio = 1 - ratio; } this.pressedKnob = !this.dualKnobs || Math.abs(this.ratioA - ratio) < Math.abs(this.ratioB - ratio) ? 'A' : 'B'; - - this.setFocus(this.pressedKnob); } private get valA() { @@ -592,9 +659,26 @@ export class Range implements ComponentInterface { private updateRatio() { const value = this.getValue() as any; const { min, max } = this; + + /** + * For dual knobs, value gives lower/upper but not which is A vs B. + * Assign (lowerRatio, upperRatio) to (ratioA, ratioB) in the way that + * minimizes change from the current ratios so the knobs don't swap. + */ if (this.dualKnobs) { - this.ratioA = valueToRatio(value.lower, min, max); - this.ratioB = valueToRatio(value.upper, min, max); + const lowerRatio = valueToRatio(value.lower, min, max); + const upperRatio = valueToRatio(value.upper, min, max); + + if ( + Math.abs(this.ratioA - lowerRatio) + Math.abs(this.ratioB - upperRatio) <= + Math.abs(this.ratioA - upperRatio) + Math.abs(this.ratioB - lowerRatio) + ) { + this.ratioA = lowerRatio; + this.ratioB = upperRatio; + } else { + this.ratioA = upperRatio; + this.ratioB = lowerRatio; + } } else { this.ratioA = valueToRatio(value, min, max); } @@ -614,20 +698,10 @@ export class Range implements ComponentInterface { this.noUpdate = false; } - private setFocus(knob: KnobName) { - if (this.el.shadowRoot) { - const knobEl = this.el.shadowRoot.querySelector(knob === 'A' ? '.range-knob-a' : '.range-knob-b') as - | HTMLElement - | undefined; - if (knobEl) { - knobEl.focus(); - } - } - } - private onBlur = () => { if (this.hasFocus) { this.hasFocus = false; + this.focusedKnob = undefined; this.ionBlur.emit(); } }; @@ -640,24 +714,20 @@ export class Range implements ComponentInterface { }; private onKnobFocus = (knob: KnobName) => { + // Clicking focuses the range which is needed for the keyboard, + // but we only want to add the ion-focused class when focused via Tab. + if (!this.focusFromPointer) { + this.focusedKnob = knob; + } else { + this.focusFromPointer = false; + this.focusedKnob = undefined; + } + + // If the knob was not already focused, emit the focus event if (!this.hasFocus) { this.hasFocus = true; this.ionFocus.emit(); } - - // Manually manage ion-focused class for dual knobs - if (this.dualKnobs && this.el.shadowRoot) { - const knobA = this.el.shadowRoot.querySelector('.range-knob-a'); - const knobB = this.el.shadowRoot.querySelector('.range-knob-b'); - - // Remove ion-focused from both knobs first - knobA?.classList.remove('ion-focused'); - knobB?.classList.remove('ion-focused'); - - // Add ion-focused only to the focused knob - const focusedKnobEl = knob === 'A' ? knobA : knobB; - focusedKnobEl?.classList.add('ion-focused'); - } }; private onKnobBlur = () => { @@ -670,20 +740,21 @@ export class Range implements ComponentInterface { if (!isStillFocusedOnKnob) { if (this.hasFocus) { this.hasFocus = false; + this.focusedKnob = undefined; this.ionBlur.emit(); } - - // Remove ion-focused from both knobs when focus leaves the range - if (this.dualKnobs && this.el.shadowRoot) { - const knobA = this.el.shadowRoot.querySelector('.range-knob-a'); - const knobB = this.el.shadowRoot.querySelector('.range-knob-b'); - knobA?.classList.remove('ion-focused'); - knobB?.classList.remove('ion-focused'); - } } }, 0); }; + private onKnobMouseEnter = (knob: KnobName) => { + this.hoveredKnob = knob; + }; + + private onKnobMouseLeave = () => { + this.hoveredKnob = undefined; + }; + /** * Returns true if content was passed to the "start" slot */ @@ -708,6 +779,9 @@ export class Range implements ComponentInterface { max, step, handleKeyboard, + activatedKnob, + focusedKnob, + hoveredKnob, pressedKnob, disabled, pin, @@ -790,6 +864,9 @@ export class Range implements ComponentInterface {
(this.rangeSlider = rangeEl)} + onPointerDown={() => { + this.focusFromPointer = true; + }} /** * Since the gesture has a threshold, the value * won't change until the user has dragged past @@ -802,6 +879,8 @@ export class Range implements ComponentInterface { * we need to listen for the "pointerUp" event. */ onPointerUp={(ev: PointerEvent) => { + this.focusFromPointer = false; + /** * If the user drags the knob on the web * version (does not occur on mobile), @@ -848,6 +927,11 @@ export class Range implements ComponentInterface { {renderKnob(rtl, { knob: 'A', + position: getKnobPosition('A', this.ratioA, this.ratioB, this.dualKnobs), + dualKnobs: this.dualKnobs, + activated: activatedKnob === 'A', + focused: focusedKnob === 'A', + hovered: hoveredKnob === 'A', pressed: pressedKnob === 'A', value: this.valA, ratio: this.ratioA, @@ -860,11 +944,18 @@ export class Range implements ComponentInterface { inheritedAttributes, onKnobFocus: this.onKnobFocus, onKnobBlur: this.onKnobBlur, + onKnobMouseEnter: this.onKnobMouseEnter, + onKnobMouseLeave: this.onKnobMouseLeave, })} {this.dualKnobs && renderKnob(rtl, { knob: 'B', + position: getKnobPosition('B', this.ratioA, this.ratioB, this.dualKnobs), + dualKnobs: this.dualKnobs, + activated: activatedKnob === 'B', + focused: focusedKnob === 'B', + hovered: hoveredKnob === 'B', pressed: pressedKnob === 'B', value: this.valB, ratio: this.ratioB, @@ -877,6 +968,8 @@ export class Range implements ComponentInterface { inheritedAttributes, onKnobFocus: this.onKnobFocus, onKnobBlur: this.onKnobBlur, + onKnobMouseEnter: this.onKnobMouseEnter, + onKnobMouseLeave: this.onKnobMouseLeave, })}
); @@ -906,6 +999,14 @@ export class Range implements ComponentInterface { const mode = getIonMode(this); + /** + * Determine the name and position of the pressed knob to apply + * Host classes for styling. + */ + const pressedKnobName = dualKnobs ? pressedKnob?.toLowerCase() : undefined; + const pressedKnobPosition = + dualKnobs && pressedKnob ? getKnobPosition(pressedKnob, this.ratioA, this.ratioB, dualKnobs) : undefined; + /** * Determine if any knob is at the min or max value to * apply Host classes for styling. @@ -924,7 +1025,10 @@ export class Range implements ComponentInterface { [mode]: true, 'in-item': inItem, 'range-disabled': disabled, + 'range-dual-knobs': dualKnobs, 'range-pressed': pressedKnob !== undefined, + [`range-pressed-${pressedKnobName}`]: pressedKnob !== undefined && pressedKnobName !== undefined, + [`range-pressed-${pressedKnobPosition}`]: pressedKnob !== undefined && pressedKnobPosition !== undefined, 'range-has-pin': pin, [`range-label-placement-${labelPlacement}`]: true, 'range-item-start-adjustment': needsStartAdjustment, @@ -956,29 +1060,41 @@ export class Range implements ComponentInterface { interface RangeKnob { knob: KnobName; + position: KnobPosition; + dualKnobs: boolean; value: number; ratio: number; min: number; max: number; disabled: boolean; pressed: boolean; + focused: boolean; + hovered: boolean; + activated: boolean; pin: boolean; pinFormatter: PinFormatter; inheritedAttributes: Attributes; handleKeyboard: (name: KnobName, isIncrease: boolean) => void; onKnobFocus: (knob: KnobName) => void; onKnobBlur: () => void; + onKnobMouseEnter: (knob: KnobName) => void; + onKnobMouseLeave: () => void; } const renderKnob = ( rtl: boolean, { knob, + position, + dualKnobs, value, ratio, min, max, disabled, + activated, + focused, + hovered, pressed, pin, handleKeyboard, @@ -986,6 +1102,8 @@ const renderKnob = ( inheritedAttributes, onKnobFocus, onKnobBlur, + onKnobMouseEnter, + onKnobMouseLeave, }: RangeKnob ) => { const start = rtl ? 'right' : 'left'; @@ -1017,16 +1135,32 @@ const renderKnob = ( }} onFocus={() => onKnobFocus(knob)} onBlur={onKnobBlur} + onMouseEnter={() => onKnobMouseEnter(knob)} + onMouseLeave={onKnobMouseLeave} class={{ 'range-knob-handle': true, - 'range-knob-a': knob === 'A', - 'range-knob-b': knob === 'B', + 'range-knob-handle-a': knob === 'A', + 'range-knob-handle-b': knob === 'B', 'range-knob-pressed': pressed, 'range-knob-min': value === min, 'range-knob-max': value === max, 'ion-activatable': true, 'ion-focusable': true, + 'ion-focused': focused, }} + part={[ + 'knob-handle', + dualKnobs && knob === 'A' && 'knob-handle-a', + dualKnobs && knob === 'B' && 'knob-handle-b', + dualKnobs && position === 'lower' && 'knob-handle-lower', + dualKnobs && position === 'upper' && 'knob-handle-upper', + pressed && 'pressed', + focused && 'focused', + hovered && 'hover', + activated && 'activated', + ] + .filter(Boolean) + .join(' ')} style={knobStyle()} role="slider" tabindex={disabled ? -1 : 0} @@ -1038,15 +1172,72 @@ const renderKnob = ( aria-valuenow={value} > {pin && ( -

-=_|8`gP|V`DebzK?uj^7n3!K?kd;t-Ub+V|iTf2-`#BS)^T4 z#I^pkRSn&Cad9EiQ2EI8lSU^dbQ_22u4-tM&&~=LrUhnqV2X~>kmt{@E&l#vN!OK* zHELn;=`y|!V9rU(q!gerJQwOZV@U1o0=B47ApbZ~>}Jy^v*R}+YP!2QapVg-|Lxnigvxp4N{rLs z4njY8dvmm~0p3TQ*>S!Q>#PohVjqtAW*2{+axi7zj*x?5oBj7OkvMg~h6dH!{hgGU z(?MCq^XcgCf(t+7;~479{>GRg*jEmERaGn`B&1hp=YRh`8G2OXji+dEXWY_~1mKl< z%kM!fyfE#AxcEm{$Bp*xl^-h2|AxfZeEmS^X$@xc>({FjRv0C#0lQj=b0#uJXOB>%6XRWSF^&OT@;;z4sl0V|Eb` zWC)^)#qnv$hMi_(iKD|xlg8wb2D6Ti&M39-&4pFP^iJ!%EcDnTbTp6a%o}OF+7~CH zRtKpUs*QASyszDROXrPjp+K z#HzrA#GdSRA}{SLwdkNeS}f=2c#?=bvj+MsEiKV*-W`Pff69F=J8=>=^Q+9vCq}|B zTWE-rA!3n1zT7T;aL^e-YRP~cenObRjJ;|+XpsH_gWnK!YVY%wj*dF$&Sj8Mzu8Bx zt+@c-Pj}qkHeefOD{dtqX*bGn>((tI5ABB2Zy?`I-QAxF)Z|{A`|2R>^|7t^=aYSI zl@JjL=n$uVRwb)(u?UBj3|z+cH^fMvm*Q5wa%E|{$8tQC!s|3A9R-j30;9j;gWO!P zOD;!C|Fper5)l!ZMPS>s{(Px(i9s-rYy)g^3!Tkr{i4wjMFK`VOuKaHl7g}_#W}Jj z%T>Wk{HiIR&sdq%465slO`~C4{x&>O7;MaL+1n`BW}l*&d?>a=NBcl%xkb)~C55Ga zTix)T!@rgy-ab)%cVTmY5U9qcriP&<>t@pEw_VlC%IC7Ay>!GIrgkQ%V zI`HHy1D$U*W#Vvs{#Dmgc|#5p1GseU#3D?t2XAlU3qX9ZE8MDQSLB;#bQES^Xr;E= zA6+;ca7Xzxg8UQe|z$o*XlGF u61f35`s<9UVw$|sgZ~Aop=@~o literal 0 HcmV?d00001 diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-md-ltr-Mobile-Chrome-linux.png b/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-md-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..574cc7307a17fbb65f6cff9f3c2fbb29d067fc94 GIT binary patch literal 14108 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 literal 0 HcmV?d00001 diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-md-ltr-Mobile-Safari-linux.png b/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-bottom-md-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..26d2d861dc4226a50924ffc1f2993cdcbf09c384 GIT binary patch literal 17780 zcmeHvbyQVt+vi4*kQSsH1qGy}IW&R^1_IJ0Al+TkAz*{jpdf;TNOy~ffPi#^fON+p z=GyQ3&YE|vnfd;iZ`PVwGcKOT$Me8Bd*A!Iuj^O05qH#7NzX8xK@f!W`ZeWy2!fLg z|2!kahgXu_@crR89Orwgib&p1rUm!|p0nb04MOuw zVryBI+6?pNVdwEqnT0)*H)}T+;|^7hj$w$ScV#k7yc-)6v#H-%E$+3F^mcy6%B5F2 zCPPhFimJ3p6#q+nD!Vk%dA{q~invd>jIG~fF4%ePAJ^sGR4T&%B;B?t9fqs%K&!e> z|ABh7{eym9=`!OWQY}hfkFuO7dF2^RpT$Le{b1wgl@*AxvWu_r8U^L^_jDL#<@1;D z$tfwXN7gGTE59)LKmX-2%Aopym>4oG+MsaDTb@r_Zv9)Q%-ghcIuV26RST62g`*l-5AzP!OLc-2eBgSs7Gey*V47X1tUukB^TJg2>9s9^tD$ete0H1rt7gwBr7(%`Btnl*`o^ zCdpGD?nUU@SD%yLeWIV=&nYWgGyeG7(bFMHejc7P?qi-=d;VHlv}CNZPdjC?B#Zs| z7DMC{8?)`6S>@(U;={wkiG_trHF;IJB*NuPpFe-TcUQuim^#FE6L(d40yfzyPVp8QR|7o)Uht@+Y^ULD9q8JIbOG z{dqn<<*Qdu-{PVQ3=C`{Evcwrh>ngf(B}Kr*%=lW7uT~UlF%XHf9&J_kdYx(gJ*Ji zd08-8B}3uvT}pm~s`&z@oW97wz*DbYzfLPEqGDlTDbV?RCtG7mDp|&x=EH{%mbSK6 zjf^G&irIte*=o4q&3(V$)6*kK=m>3(6UZnlqnn(ZT-(|T?z6h;=_&a$NjeN(SIX9i zT-`NV?9#n|pX&Sf?+(X@o*o_^bv9z07cXAp+m&CHMCP}>sL!37YzQGnKjY3F3Oofm zml~z+?(Qc+1mq_0Kh}14X~P(!Rj6rc8(UimE?l_q@zWxeNG(h0+BL!%r`Gmw4ACllwQzg# z@&QWwwqlH*K7Df7S$b$G!tia@$Scl?;>@P`V3rXMtb@wcrI%@J2bntSdk}B zo{+7&`?nIOdXGct&Mz%By}e>_M^~3vT^*|O&}cZn-bmiqnEiWuyRjf0TU@*2(tyy2 zOV4ex_M)7;JQZi>D^*ohP5VQo%gOk|sv$dW8d?wjv1pc-0c?b8*mZ3p#Fc>*b}Sza z@y}!#VgYsay&XD%Vj*IdRBuixpFKhIpNSC#1%h8oizhdkrSBLTlEcoqQOpoV&Z^?# z@^z2P7rR{gQ6tB(Fcbfby}gEp#sriw+6ngd_tT&zFJHbq@Z}Nl-@kt+R##(x{kpd_ zTuOdFODzOeS6`o5_Ha#!Pv`5kk%zD}Yo)bEq;mUh>JziGr;Bx>OUL~fVHd;08K`s@ zfCnLHJ0ybCb!VtL&U~X}l61loOCW_BB2&P337eNY*;j|pXA=~pfPJ;M(Jmn5d*FhH zhle0ePEG};tz=JGh^4S_3=g;H8 zLl~%V&G9IJouI0qfb-|aTU-T-10Q_28IRTK-KHSrM~^PJt&Btj2ji_*AMH)Y-o1A( zu&N3(U?X-bN$Om3a`N8cW~bxd-b=y3!KtvbD&1FAe0-|*DxUmKEB*7w94<6`dC94q z32GL$0MnL?y^T#1w4~EHeP>u%S!ZTvC!zmcyLL_9+uOT#lljweU{*#3Zi2YI3M^Z% zm1wReuX)G25NM8O78a)Ufv1rQ@^|)C>-Z%2xIVtVjvF)Ap{Ax`k6gQXlW{{N$hQRT zzHs?aLQyR(DtiY9CcoZam+;=<8}poF#v>qTG%qslOqQ{PEBW#EN>XU2(Xg`rqRfbG z{+BOjPY(KP@9683!tVX~Qw<#i&<~(>QMJ3xcd^@yR-8*qOPl}uw;@lzvI{n1_Wi8L zo~6-BTI|lUlD0OTj*d=&?XVbpOjO6V_s)`nx3@Ic?RUXbQzpIr{YqIq^_`vM?Ck7l z2NBs>wknto@g4t|ovi?S@YRhAaK|+Ve|di-%jhPW7cBQ12^zJ(xeVJ)$;gNe{^!QV zMrxlGmNYp-HFgR{!ngMJAjPx*&79_}6u-!|H3wy7Wdz})X%E1D9JFb1mv&2?IrN09 z$@u)4)X@J(v?ZF6o25uCMK=1d3Nv$3wi*^3EP+?l+p=Y%c>OvN!gkntr8-Db^3FbX z`nRtAxz3fMqM}0gRfEH&V=ViLV+I)sNmGaTI7vBM-NtmtuBmFQNyl<2F5z{~p7jZB9i7M!Vp_#)jRs2*6Ie6tVykn1 zI#bAzYqxGS!Nom)_3FIe1gyEoMjJOJ6VsB*5!^OY>NMUP$pjmPCgZcBPV> znVA_nd{Yp)Z1|=7nFx}ek+I&wXm8Y=eiZ*DVSi|X?7a_F-SRO%QUIXOAl4L+M4;(N!~)k3%BA@d&7)4}bbp8QMMCS*}LW z;M6@E+w93wH=SyVC|j+;vb}68aF|rAf@{6V!=vcsRnfB_ley57HJzDY_qP<^aiR{V zskL>w2D=i(MhMetZ>vYW+4`DNlKID!Wf;*y&VO#LpRCrNu;gfdZg_FwCV~{1cQm9N zZ*i|zFW7z@R$kp^St%iK3ETbKm(%QY{`~ogXz?-m8#m6t65YLjKL{Q9>N4A}JW`XT z-T9B_{ErC=3k%~#t!ajah6=3v`49hy*HV@i6H#$ZLD7sma_4wKK+vlMWr&3s5B2)YR}1=m?}`v6@<1Xu-OV`ijFQubi8l z3!83@kxXQAb8(rNBgb@Eq_~FMtxT#&OT!r)92}J+ATxqu`u5{T6WlH3S%x#!2C?wD zKW^VRE6!G~7xTVJSwmAZy)gTFVt<+AbQ8r{3`Wr6ClfU_O@pPNd{)oox96Pka{e_Q zCAmao0%|LBYW%9P#~NJVPl~i$?UQxSzdy$K%Hp$YuncvGJX`M9Sx*32Uft;%Jqik`ggQURfE>!2if~T{*jS z(uQhho29M9LfmddBJ4|RYiq`*PiN$JuUjfA2GU8%yMN?+_yy0RGx;>);pNo;?G5IV zAVV|~@ah%y;d-pUi%t(iWEzve5-eWRA6|GGfM~yd{ff{H?Ldco_&zI3TBMV7R%dE! zp@;dMb89r?+?oM-Nvv8jhF%Uk*f{|g7BxsxZ7_Z$tEts!RT#b*5gF+e)rF%{*fI^R zrH)nW27eqUfLdPr8v0{7vYrJO1bGn46_b2IzIAjCOOU;~MD1QN)~Ad;*$Fb%(_DJMEQ>vujqU?XWd}mr2Tn5Qgya@o|?` z@zGe}X&3PjO%09If&vO?U!E!J(6|7-v35&siM`szT)s>SFTk6K!=AzW@lKRDA|isU zUq!FE#&@S`Oz_2Hm5srnQ9tbRx9{H@LP;5)#m9%2l}ViE;*$D0yDRd-cIw9WeqD3` z>FVORh}Z9sa8-77-JzzYM&@f8*9u!%lr%MIc2-8CnwpfMYE0p7IBOmneQb?7*8Z#+ zwomf)$e_xDQhdarG5q`B%UfJQ2KfYnTfSebs+hQ)o$ro!1*F!=3zd!beLSrW!{`s$ zS|+iaff=A@vc}4aii%cp2Nlzlmc~Y<#GkT1eje+SdfW2ABY}B|g3{Z!Nq_b9G+*(B zqK2l4*&T8A6`LOu$0t$dddV&-dJaB0Xh7{47Tu^h@?05oMil5?)-9RfmfI&OI029dibC*;qZa@9%Q%xVOvi`oiu`#1l zmRP>3Y562R_y8+Xc6tA{Et&D8k`2}zXY{+(Qxb2|PA z-uCsCId$sP#N1-k#DozHd1;Xd9Ey|D6z29>C+I4vz&-Z&_sL3iLqkKM>*E5|0_ZUX zk8h&D4htj@MgDjS@<15us@7FTV2nvPPT>Wt48LDoToi)-=!olHvbjw|O^x^ZMo39X ziR|p+YM{}>hxAj^)68}Obn{U!-5ebqr;h$Gt7f#uKO07uOsheD|>iI090lQ-Nkf~JVF;*-aV@R2`)j`uV1J9{r%CdHs-y0 z6>8>FPEJyd`T60dYwZLsDM`by)F`NIPlj~@+Qjs;>9Z#9jhi={Grzri#{d`+rZzht zA4ywVTiJAs^s|Hn-rtF#)==j4B#*Gsk&%jz9(`zB#FrwX|5U%z{r9ict#=|sckkYv zIu;tjkr+BZ93_LnI83KsmGGIT_{76&EJAlDtDB9Ro8aafK1Yd(l%JidNh-K6+faTL zY5UblAs{P@8vsH?wfAmhDf{s1hIX}AapT)@0GH2`l1QO@eEfLPaSw3r^EYoo?Q8b& z8KUu3GAN6Si}w}{PlhaTnZx_6nq!!yo0x9^R|9?|BqW5em1HG@9snpE;9)%gDjbq3 zV-HVHKb{OiF2?Cdx&h)_UoYa0Tj5_XG~wRQ8K zOCgHgzMS2Kra%dU4f0i?=vrb~$L%*i#Kw|aSy^=r4gD3-2y?EY`*x>f9A?eT%nX~j zI4xkuE=!TAo@;qcMp#Q=&CrBWHFMH>7U18G^R2c&F=y(-JwU= zpsxZxtVnmgrmo)l=CZB>keI_={}XW#L-2h&{Wo5w7@Zs+c^qx`Hxs|-)y#D$OC9#E z0Zj#9mG&32h#qUgj7u<`bUxGAS8u=3e)InQdA%wRN9`Vx-J;VKO3P0OSmZS|-wgbq zr>BpA{=18{jIS?=IDY!x2QWfCZ+=xE5J6=Xm8rBamb0s0Hnz8$1^oAKnwgtN&ZfZH zC3{Q}6&7=fh){#FB=P0TmnQS{!6J+4$uQQH((8Qu{A8-JEX~9MRRM-af3?&SGD5x3 zM;=2D+Z4?r3O;%*;w$8IYB-{>>Lpd$|Fg8R9aY`|QPw zKzsLPMQ>e3MK95}6}W>d;^SXQWe4ZKX!C(SwYI&z>})%Sf@CWz9vVJvB%}MHUsj`9 zKPTM}^DBVcCg$eEr&@minV^eq;e8j@Z1O}cD=0QLw#R#W**yqaEh%<|sc4WSNsYkJ z&@gLrrNi&;ubM{k*B$0czymQDOk$1O`9&i^x+dvqFLKs-8S%Hbrgn`IqgQ1Nqnd@M zDw91=J?fZVX=}voGN=j@rqxcjQ zP+(YC*xtM29d2y2il3jKTDyJGU~10-8)3t1ry-GhTfa&ome2_~x39ylbn*k#yM zH$E`*WllcXx%)vS2=-#3-pcU|ejJAS7DX`5>R}<{l45OGSnIiQmVwP|LQZJ!0kaf% z#@`+sjKQ6RZePuxWYJqP6CMnB#MCCWwOd2BlkDy3N$Qchc%+l9I0uLt3Gm$fqre}R zk(r4Pf@-T0xr|8eP?Q?)31u-f-{MtPd77mUV)Ik=nP{uD% zz4am|NEM=>JI5vyVbc-%mqnYM^6V3UG4hia`b=k)Xv8xKUp#L@wB>g(&1`99rx-@oX1 zu=V(BaWM$hL?|JNjEZ^=?JX||G&Ycc-X$ae=Y9%kS0dLCu0Jv|va72Lfno;!SoU>J zo+F+20;a&K&tHGx7XIRkerU8%e2R{aLa4e*aC@lHLPCFSMaK2a^ z-W2iI($XmAw!YrpiQ41E+SLBVGz}idwFw1yyT+a#D)BK7&VZFJPiVQY`GW!VqTCI; zTH898;vdtOqotH~Cl!R^{OTPBe#06P02oX%Uev9zthD`|a08!9#~SuG=P1vf4TPcQ z11$ygsQDglX-fUts?hFB8PasG89I&hHvn^-f+em!-p+5H%Ud3=Wd)5*yVkE-A|=hG z9=obrIt5%zyUIfdwD-V`4JVs{0vu?iAX%WY63VGD2lE+IK1xbTj-XH}a=kPj{PM_S zsj&49)CT@_b^IV4p!BjR*hLjiq=Hp=FJb%;fAdd=l8cK-&Hf)oK>Q|02iqn{&B-yA zOh%doh(N^O}E6RzQz}OfZ2@-pSKd?>GyyKD=sI;nw_0ZMvlF8{knpV&b!9@PGP@J z+k<=nHHsjuG0cr1Iy9MI0is*(Jcll~`#b@ssOW=4dj|(Wu3PbJZjXnDLF<93i}Gp5 z0TciwCO-ZC{RRMsiMl7auu_HErW#x7|=G3*rLhlgRXw&fFAkf~d&39MfkK4s+dw8!tt=(%DICvTr6}4E(J30nPQ^^1L z(64n^y2R=C%d8{cx1gOS`yD(+O9JLA2#k#&f(S10hew2uw0*=wYl4S5l6_le@IHK6 zNem+}c78XaO1n`hutjz~tM6q~E15_vsrUQt&&FXfI#qLCB)=OC9URsIdIsi>;2D`5 z?ydWNH%c*IpK8{ISr3*&_=^{35BEF$Th#pz?t^Sa;yoH3K2m>9yqNUE%`q5_86_pZ zCtcy!K()7ft!V6V#RMrC8I8Bzts6H2!MX78C~H)Q&j`m3)5-Z^04IQBg8k70+C2^q z4yZDxK!s*9=$Fk4uhR>nk6%)2!Ed z_uLj|2SDPzyK)tV;Lz}JA#8-K+xAN5sHlQI+>Dz7Hbo0p1Y_~e!-o+t&=kRFXl%p< zVO+ZAaN}ko7%hP6KqzZi8Ledg;|w&}WOrp$!efmM^j3%UsjEH!V5U6m?d@~*D``@E zHi%G74+LE3e^R+AfUd_+j@?n0#7Hm|*BMwZzF)?v)0tqXam%GBVZ^yQI+IcFYVmH@czRGocS934fN?jH}e275y!=S z)f-g9ryjmQ-u$3Mr*iUZ8bD4UFB*Ir9!@v{%pHUrnz-(PfpA(wA4;UavYUfXw}b>P zg?8==35R?k3*E#sKa=54gOLjwi6`Cg(U@*FR?9_y%U01nrki_~S?zjd3pZ{EHQ zaJjK^wT3se9aJwAdg9FIJz5?qrz#zBYIofhG2^JHh_>>_Bqb$5{Q|&o9oqf`K8>m> z0ri>Y0I1SiS(izS}#@fW9lkDXqZH&hXQdkefGa7Lk>G+O6Zhx#8* zvyyEx=0;6Esrdb-V%UPiNv_}3A0uNQ=LUO8FHhBpD3DEN~>t#X-9W7n#PR=w@kG}QLfZ3XtXGd~#`Xk_PS^b^ei!A}|o5c~YuvjFe{B$)Gi z7L0&g+{;dkIcb$U#wperwb(Pg8E5jhH`_NM;2n`vPej>pzYieoX5D*}T z&i;?KJ|XF~brCEo3L2VF5K`DACFy~c%PT42x=1lYhyeiXQ~E3BB$awFdX&H;MGYpn zG`$L!He*?MEeHSr=-XhLpERKhOBf&i?H19xT13%)0a8IzcCsAc(Wq$dR(bPe$(c83AN~D|| z6;3GNZDc)0Ql$gHwGIN=0Wkj7+Z~uTfZZt)zExFMPp+=63f=}i1+Fk)C656lBT!@# z#d0Je#1S(vpuO%7yaqv+c4}%0Xf+NZ{FVd+`zfKc+I5gh<#(eA;g4kE0(kiN=^s9X z)H{D(5V)8a5_M#s)Ax64n}j+2INIfekc_OQU7(f(L7hBv^GuI|)ea*;3DWo7B92qa zK%6AVKv;)2M58)2c{w@Ob?YDmp`5JLu(i3lzNcq1vVDXxsFhTbm>J$##0DM$q_JAWN}+fC}tT)!SMU?XnYLgE9EH#{N&(5S?gmkg+zp+K_8weK?!v6PQ=$)~-1^(uI8 z&qIqQcD_RF(Rb=wDYDF{I|$NzienVbv_MmaiJ|*S@wE_ zHkcGbHV2d$1qwXW)M{!Zms{H6m#_fm!$>S4%(ZTJ!BM}(q%bunr+uNA3wwEDXB~}0 zfGYdq<;&*B5W;}S0wh&JeHxYQbw0b*t@~&uBslK)huH)yT-GHujri3tA&q^nq*=q)D*;K0AXJV5$UmTQg7Y!q5XRKyTbd9X+ZnE8 zanXa?`AW65jLgZO=u^row(u;0bMuoiNg&{h&d*z7fN4+NC)H~M`V2Z`Js8j3y}iLu zL725VTqx)_ReaE6yA40WI;`(3Okz&Qg}>*1*#@p>Ferdpw9VP!;o(BwBtIPrvO7-W zpP|R@jTI-3mENbK)c*`E<{w-2J^o(p?{y(c}kBSJpy);niDmt0opRi@_PCt91Kb% z$%|cJbFBTi(iwiT=ptn^TtW&q0RN@fW|R8$>DEHyMtpQ10E3CR`CUQzm(dyp^nDhO z2^_^lIv)ZpQRO@HAL8^=O{T=JrxogF`DIXDQ2@nAT9`}U2Zl@_vN zs5d-l6EAMhf|{?6pjX6;*)m8;OQRtwqz?L}5NuVj#yO;=8EK+UgBf-eVnnr%v@6{% z`(cO271QoaEM%pyWQbniaIa_Rbj{1lBSUq41d>Z2aX5|u^N&pc+ZDv9bLY;1iQfWV zMe{m(rA3{xQ9$R?0n=ByEh~boT4FaEsmkJs2R98u81=n-_kd{)+S7x8jvt~Zkl z*)Bvhd2!^OsP!{&OTd1mCzsix0P7IPrQhXuzF{md)5zl2P=sIu5^LA^NP=>YASiG9 z(~$t99Aq@qje)obJD4^g&?5mbW_=D8vQS^fTJuHt$Qf(QOfP621#ZhaVO(E8Eu02; z0o@=_f=@_@GLQ{HV1S@v#W`Nh@HAW(cS*f__c-(?BffnuY*A8sprwWCSZY}N{QUgY zUDrUix}KgM<9I#(ur@P>ZQ--seG&CaYD9qnkQXs-3?=n#2?-7^ON9jOXQQ=eJvz6c z(T@3HZNWc|=yyiy%!KRP+i!lKqU;t8?e`!ASrfSfP6`O;NS$rzC_ca@QbsW}VI`GB z1|1GHVZi9sf2hY%@m_2`G? zkex#(Dwu+TRUbZ_hC->YuUAW$4Yzcu1~N*4hXc9DDf@E0l{H+K@iNYrZK=JMP5lO> z*o*n=&n{lP_-$bg9zw)TMdf~Bv0}>qeHmg^hkkm3 z%@q5GcKh%9^gn>x|ASrqAAI)`;ffS&qELvmpuSMwRmx&Wyg;S}jZ?w^L=#RBchjPc z3U5KIG5u)(?Izw@BvYRBFSwwj9~>|Jd&y`(2n4~scEjU9$go!JO+}&kDAe|Su|d&2 z05R+T)(x)J*nqZRk>X1OA(LiQ>V&O^IzJG%1935VW|lp@ur;&fKe;!2>6x__Vfff* zHR9OH41rAq0cZF@jwZW+fPJoJLbzTyY+pS9rXbhhARtfA&dyGip<0UgxX%?422!x& zp25yal6H@r7PlP=M(==8+)f#Cu#lb#>Fw1(Q+BbK4MJEHG+PKxHrtgeJqsJ$pa}rf z1#}`w0?Knd$kcSXLX_nUu%hLn*1rMKl7cHB%;GiA4xtj<`MiZ(!&(+@^<-*mUdSTUqNgKDp!t!c)IL>xMyV*rKOBdsg^w`xQEpy=8mVm0Z=t8u+3FnkCkT(Jfg$?fr-IT_($%1#BJCX z1fhWfV_Z;5!A(UaGQjw0#l@}~akZYC=1XJMjJ4R&)h>{@;4!UdRag6J#9dX+Yn@<+ zB{v2U8^m%MR0=}m0T!WrC^QsbSyff(!@bEqEyL!U0@c9*0ReY)OX`j4Ks<|uO@Kaq zF|ps1b8C~086|uiPUK%k?Q0%8yRwHW(Na$S<2fk=2?qoOx~F@!AU=Y%ie>~}Y$QrL<3qmqpE4^A&6M29 zrkvxr@2)~tPx*U{vPcOX1}{l1jDW=h0qV{F@ED>lVUSECK($&iyOHo8KW+hqCHg1u zQBpRIx^3HEJ~E;Qnk_CGY=+b;geuu%1V97^pkxfB2CfXqRroYm#%N+1$obSjp(zs3 z97Ssi3?7ZSLzVy{cYl5+Ma|5ZWwrM&ZkNrz(Jeq3rkOAja4)+F_^QLoNO_@-Er%2P zZ;w1@kkv02-zIgEh(2ju7{>JRu<|Zz3>#gu< z2uX*s5kk^VyWHu57<5v|5(1#WK~CY~t^;N>+5X#y`(_sOR!eK^M#w8uP*VqkbLv3S zpBSzeBFf@q1xW<}dY_f31|jO`2(F@DnS%n;oA`J_1quWi8yiF69B{;@E}Q`1YM`W$ zRQx~_Ea+qVha1Js4b1!L6a(e+N~7qo#7}v7EszdrUgVeQ>xV3W6a>mg@Gt+Xk^MlF}I(KsVeEpU>98DiVyDbBci#d;*vb#74 z@RYUa`ue(r?|}%ak5Ex@9z)n!{=>cKp)Ww3*nynH#mxy;K_i<6-?ey_;yD)JGlZ%U zG<64(0TM85S4j#)oKeh19!~7QEET?Tr4U>v$fw2(ec|NfT!$b5lmGE%3aA@6P_Ue; zF%ythAYOqm(Oq3K%5rjiax}pWYu|FPz3A9}xfDU*a?sqph=>TAloSKVJNY#SJO*A1 z7r=^oI`n1MNz%Z3Srm=sLsSX{V|$Zf>*&*j`H@k=#NovHpVHD)qT0+9y}hyV0%6}q z|9e=LQr2cBd{LBPy;!TUrm=G98n`wyE*?fksps2wH#QWnT?;?o&cV@de4p_@?_8Jj zxiSV8XEo)FRh`jY`hPn%#$2y&(Q8$V9y05f1ah`G*dooaTn!0iEetsagKkFkcqOA) zvHpd;=IGe)1NY0ToBwKTt+(~tEu@u2Ty{+Bi(PI3izBjNjJw5E$t4clPS3yJGcUvx zC7j!1sWVRHbc*IhgI7O*>Kfl+?&u%a&P?8|S63lR1pHCdQh7`dXG)@A zkj1^JX9nZOTDu2JM`Eh+;(51KF>Z{-T3G;uDLc#;-OFSwz0^#}Ss(!mX)JbNTu_Su zwBZY)qVNT7tY*%GFRpN==|%|bl8OpCkpL|N&(q+3@n2Q~^A&v6iC@B91Ey#y6W#DiHXH)t)qdheHOn&Bp_&| z%|{dW<_Qb{0{mFUzx47l2_sAWE?%)k<9Ce4A7hD`wL+g)FU{28DLCxUH37oK4QdU+ z|FkWUGYN79VPMxB{wcr&_VZ;oJ6ih)L>Lm;2>EMiS|`e71wBTTS9N0aJB?-R+2A}? z?(9H5Zu!k`5{(m%{wow18>>qA9=+V!)vbYT5=QJvwNlHd5`obgNf?~5fJZ_>OUu3B zG}xou5|+%;US-iY%4L=LYpw3bQJH7>CW3TpE0wE}Cs;Umg0`^9P(}($N}>0j za9fbPs2?9U#C-g_?FE_-prYvO<=*Wb9nIj$V@Yb^d%+h>mu*Y{WoW92s4a+~Op5#v z)L2V<`&Q`D`ufxa)uo28NWo!Yrl5TS2+nL*8hZ_rODae%7KR+fVX;SCr?4(E2^SJW zUP{xqslf(7F&U_&oS+^;wE-$;^*=8sPRc*4p8RW!D9Y&`CPIR#7qNLEQ}Yn zz1qk$fan3SUf7($cb8rpNU+y`e7@eIP`j(IPZa+{xiDM_q#NJ7p;>|~1W1~&Bl7su z+hLKLpWp# z!0+FhAQdC>4<4KYA-!vCEG9FPEB+Q2jA2eOF`7WOEopKDPVEFk?n*ID-q!Xq*cOm@ zg9C#^AVz@F9~>G=w)c^ioIDoCS{w8T$lsbskcr4b9u)L-5F;Jw#(R75KHOWlvol%X zFS)N{3TbVykD>p=krWOoDV?e}5ANT`h3yA-1q}n8vvu<|<1(d&@EW6i6(xG6=f;i5 zz1QJSN@M_Z!lQtzM)AIs)X?N25kxp#A<@G?0xFscP(LK~b2T%tc1oF&n~>GyFQT7B zC5eLrFH2n=G`dSfNlD>%cqpJ>fhYIjtgWprY_WLibFLp)gMzH>c`GBg{q8ArPVS8F z1O*-0D^M``RW5c~icUg45ZrCJ>{AFJiZ#H`K*7kNqX6G&>NoT!g;NM{RSOQkq31zB$7)(fb08p-5`b|6SUv0uxoYR~qSd(C62PvS;{$6H7eZqL zp?dFcPJYuaHv}{deYek{s77|cDRY)g40b&#*o^wgz z(b1<7h;nm600%wjihU};$48yAHQLn`K*g;#(XGlFlAkXC%PV`dbssc`NQ+gaSu)Y& zZn9+9K!E>@;gB2%GDJi~XsWXteh%<5E&>~+z^v^oVtV3N3NAd@Uh!8f$lyfjuaYc? zQw`geLQaqK(j_90)ZuZR21PCuol>&0EX4kLJD_E(cek=~di^>NF1@jdG9JHv&C~ho zFT2wEl|E~luD`edj6ns=o!@!-#H=BwXmZYhPz6BvoV7R=C+Bl9m5wJMDVyc*lej27 zDKc`JBW~2XR}vpj2U;fdLhxA7zzH0if?T2^^Z+nrnlgzLD4^qpL0Ft!PRH-!CYVxF zQUeKl;1f1^!Vkg%>{OD#Va<;Q9p}Klfp``Gy?BwwFC?lgUh3Vvc{62wXNaY1RD&8M zu?m*hTkCLu>Hhtmf}qxit)^O)5S&M8HJq1Ggd&HWC!8`SkzpYzku!k#6+35A1w zKjLMpy=885xxBqahV$uOb}CZ?sdUDZ`sqJjvNRS2Mvh^)s{SfPHoz!MXeZzdg5~4K zj&%88$TBfuX7;07Fe={xRYQ}8D5M&BWKgtLwgxO@#;^Y8mHqEj)8WJs%p!;wPZcaJ zE%{}!M(yf?<2PJCcCDluS{&59LfRc8FlQk}-dx6NF9x!=uWSvw}AuD_K4RO8T! zFK6MTvdz7%`#h72b75Owzq04IT2_?&?dvZX6Q|LOB8WJK9s<@h$|d1QDJoHeFoJ`i zyaQ4!42+C8hlY%YAQr>#?j%x4YKbXfVFZwAYQEA^|3`=cj;oU32Q{igHvtwV#+QncHDjEutcSzpP8 zhn$|7nK}MaB71x_&Bl92dLv+^azQOog5ALX9fKZTkFE-V?7u$O&nlq-ztPeFtY<*j==!}gAQYsP5%fF5cxTzQLY@roaW2Bt9R zNnVIgO+dSC1YI6MpnGwC`dr>9n*7|3`{&qr%F&Vq>Rg~*2}<@H2;OK~E>k^a#ew6O z_x`==@w$m&fv##ul^*Q^S4Sx?v-=3Um<%@;mm-|+gXs~RA4{%reEdzj_>8QKl{FE3#!8+R{4rj-XhY8@8KgoE4yEl~OPS59{HZ^OVE&^aicOw0Uraizq=0YlhS z%pW_L4NbIXXCFWZ9Lb27UeXWUwNazDVKHsDSqnWS**GtmJV{i}EaSJxX(ol6!X@yR+-*Mu&^{NPA zklPF78;6y4TL$YN3X5@i@hIE^aJedzEu{ta{ToQB6Gz4*q4uV2LK5G(=C+wSQ@<$m|D-<5fbN*QTm(QERPLnTMA^{tui|MFrzqFEjt=);%inZ#jxy@ouy z;elMcfI;4$WkK!@s@;zC9nY5=3e>fW{xVt9N$~R2jp+!20F4IR|KShlBkl&b`R-iJ T7=^z%1-X7zO*v1|DDb}kHDloy literal 0 HcmV?d00001 diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-large-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-large-ios-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ee77f057b4edca01dbd58439ecb8b0df40e694 GIT binary patch literal 16419 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 literal 0 HcmV?d00001 diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-large-ios-ltr-Mobile-Safari-linux.png b/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-large-ios-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..f2721a2c6e87f4359ceee24f1d1e4ab78e568d01 GIT binary patch literal 21938 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 B*h2sS literal 0 HcmV?d00001 diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-large-md-ltr-Mobile-Firefox-linux.png b/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-large-md-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..900782be5d907d3bd445afdc99385dc0e4942475 GIT binary patch literal 25389 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 literal 0 HcmV?d00001 diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-ios-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..a04545790e40191454c2861e158186f1a4b8d057 GIT binary patch literal 13644 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 Ns!Cd~pbGDU{s*&+kIn!9 literal 0 HcmV?d00001 diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-ios-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..4a9bcc9aa4203ff5837139074b04ede26df308d7 GIT binary patch literal 24694 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 literal 0 HcmV?d00001 diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-ios-ltr-Mobile-Safari-linux.png b/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-ios-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..14c84c9b58ba782a041270a90e09c1921b882175 GIT binary patch literal 18768 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 literal 0 HcmV?d00001 diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-md-ltr-Mobile-Chrome-linux.png b/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-md-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..6e082daf219756069dfd79c00df4d106cb51103f GIT binary patch literal 13637 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 U^o^f#ggr#>71ZUyvgV=x4ZON<+yDRo literal 0 HcmV?d00001 diff --git a/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-md-ltr-Mobile-Firefox-linux.png b/core/src/components/popover/test/safe-area/popover.e2e.ts-snapshots/popover-safe-area-right-md-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..abbd6c1406f613c7231f5abe01bd9cff0bc3c669 GIT binary patch literal 22525 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%0D*2 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 H`}qF?32&>F literal 0 HcmV?d00001 diff --git a/core/src/components/popover/utils.ts b/core/src/components/popover/utils.ts index 794ebb20884..0d11a4dfeef 100644 --- a/core/src/components/popover/utils.ts +++ b/core/src/components/popover/utils.ts @@ -32,11 +32,79 @@ export interface PopoverStyles { originY: string; checkSafeAreaLeft: boolean; checkSafeAreaRight: boolean; + checkSafeAreaTop: boolean; + checkSafeAreaBottom: boolean; arrowTop: number; arrowLeft: number; addPopoverBottomClass: boolean; + hideArrow: boolean; } +export interface SafeAreaInsets { + top: number; + bottom: number; + left: number; + right: number; +} + +/** + * Shared per-frame cache for safe-area insets. Avoids creating a temporary + * DOM element and forcing a synchronous reflow on every call within the same + * frame (e.g., multiple popovers presenting simultaneously). Invalidated + * after the next animation frame so values stay fresh across orientation + * changes and viewport resizes. + */ +let cachedInsets: SafeAreaInsets | null = null; +let cacheInvalidationScheduled = false; + +/** + * Resolves the current --ion-safe-area-* CSS custom property values + * to actual pixel numbers. A temporary element is needed because + * getComputedStyle on :root returns the declared value of custom + * properties (e.g. "env(safe-area-inset-top)") rather than a + * resolved number. By assigning them to standard padding properties, + * the browser resolves the value. + * + * Results are cached for the current frame to avoid repeated reflows. + */ +export const getSafeAreaInsets = (doc: Document): SafeAreaInsets => { + if (cachedInsets !== null) { + return cachedInsets; + } + + if (doc.body === null) { + return { top: 0, bottom: 0, left: 0, right: 0 }; + } + + const el = doc.createElement('div'); + el.style.cssText = + 'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;' + + 'padding-top:var(--ion-safe-area-top,0px);' + + 'padding-bottom:var(--ion-safe-area-bottom,0px);' + + 'padding-left:var(--ion-safe-area-left,0px);' + + 'padding-right:var(--ion-safe-area-right,0px);'; + doc.body.appendChild(el); + const style = getComputedStyle(el); + const insets = { + top: parseFloat(style.paddingTop) || 0, + bottom: parseFloat(style.paddingBottom) || 0, + left: parseFloat(style.paddingLeft) || 0, + right: parseFloat(style.paddingRight) || 0, + }; + el.remove(); + + cachedInsets = insets; + if (!cacheInvalidationScheduled) { + cacheInvalidationScheduled = true; + raf(() => { + cachedInsets = null; + cacheInvalidationScheduled = false; + }); + } + + return insets; +}; + /** * Returns the dimensions of the popover * arrow on `ios` mode. If arrow is disabled @@ -804,6 +872,8 @@ const calculatePopoverCenterAlign = ( * Adjusts popover positioning coordinates * such that popover does not appear offscreen * or overlapping safe area bounds. + * + * @internal - This is not part of the public API. */ export const calculateWindowAdjustment = ( side: PositionSide, @@ -814,7 +884,7 @@ export const calculateWindowAdjustment = ( bodyHeight: number, contentWidth: number, contentHeight: number, - safeAreaMargin: number, + safeArea: SafeAreaInsets, contentOriginX: string, contentOriginY: string, triggerCoordinates?: ReferenceCoordinates, @@ -831,17 +901,20 @@ export const calculateWindowAdjustment = ( let originY = contentOriginY; let checkSafeAreaLeft = false; let checkSafeAreaRight = false; + let checkSafeAreaTop = false; + let checkSafeAreaBottom = false; const triggerTop = triggerCoordinates ? triggerCoordinates.top + triggerCoordinates.height : bodyHeight / 2 - contentHeight / 2; const triggerHeight = triggerCoordinates ? triggerCoordinates.height : 0; let addPopoverBottomClass = false; + const hideArrow = false; /** * Adjust popover so it does not * go off the left of the screen. */ - if (left < bodyPadding + safeAreaMargin) { + if (left < bodyPadding + safeArea.left) { left = bodyPadding; checkSafeAreaLeft = true; originX = 'left'; @@ -849,7 +922,7 @@ export const calculateWindowAdjustment = ( * Adjust popover so it does not * go off the right of the screen. */ - } else if (contentWidth + bodyPadding + left + safeAreaMargin > bodyWidth) { + } else if (contentWidth + bodyPadding + left + safeArea.right > bodyWidth) { checkSafeAreaRight = true; left = bodyWidth - contentWidth - bodyPadding; originX = 'right'; @@ -857,34 +930,54 @@ export const calculateWindowAdjustment = ( /** * Adjust popover so it does not - * go off the top of the screen. + * go off the bottom of the screen + * or overlap the bottom safe area. * If popover is on the left or the right of * the trigger, then we should not adjust top * margins. */ - if (triggerTop + triggerHeight + contentHeight > bodyHeight && (side === 'top' || side === 'bottom')) { - if (triggerTop - contentHeight > 0) { + if ( + triggerTop + triggerHeight + contentHeight > bodyHeight - safeArea.bottom && + (side === 'top' || side === 'bottom') + ) { + /** + * Calculate where the popover top would be if flipped + * above the trigger. Check whether that position clears + * the top safe area with room for bodyPadding. + */ + const idealFlipTop = triggerTop - contentHeight - triggerHeight - (arrowHeight - 1); + + if (idealFlipTop >= safeArea.top + bodyPadding) { /** - * While we strive to align the popover with the trigger - * on smaller screens this is not always possible. As a result, - * we adjust the popover up so that it does not hang - * off the bottom of the screen. However, we do not want to move - * the popover up so much that it goes off the top of the screen. - * - * We chose 12 here so that the popover position looks a bit nicer as - * it is not right up against the edge of the screen. + * Popover fits above the trigger without overlapping + * the top safe area. Use the ideal position directly — + * no safe-area CSS vars needed since it clears both edges. */ - top = Math.max(12, triggerTop - contentHeight - triggerHeight - (arrowHeight - 1)); + top = idealFlipTop; arrowTop = top + contentHeight; originY = 'bottom'; addPopoverBottomClass = true; - + } else { /** - * If not enough room for popover to appear - * above trigger, then cut it off. + * Can't flip above the trigger. Constrain the bottom + * edge while keeping the top near the trigger. This + * creates a scrollable area anchored to the trigger. */ - } else { bottom = bodyPadding; + checkSafeAreaBottom = true; + + /** + * When the trigger is near the bottom of the screen, + * the calculated top may be at or past the bottom + * constraint, leaving zero visible height. In that + * case, pull top up to the top safe area so the + * popover fills the available space between safe areas. + */ + const bottomEdge = bodyHeight - safeArea.bottom - bodyPadding; + if (top >= bottomEdge) { + top = safeArea.top + bodyPadding; + checkSafeAreaTop = true; + } } } @@ -896,9 +989,12 @@ export const calculateWindowAdjustment = ( originY, checkSafeAreaLeft, checkSafeAreaRight, + checkSafeAreaTop, + checkSafeAreaBottom, arrowTop, arrowLeft, addPopoverBottomClass, + hideArrow, }; }; From 53172d1a4035d5b510c230553aabd53dc1389e4b Mon Sep 17 00:00:00 2001 From: Shane Date: Tue, 17 Feb 2026 09:37:54 -0800 Subject: [PATCH 29/55] fix(nav-controller): reset direction state when navigation is canceled (#30955) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue number: resolves internal --------- ## What is the current behavior? When a CanDeactivate guard cancels a back navigation (like when it's initiated by ion-back-button), the NavController’s explicit direction state (back) is never consumed because consumeTransition() is not called for canceled navigations. This stale direction leaks into the next forward navigation, causing it to be incorrectly treated as a back/root navigation. ## What is the new behavior? The NavController now listens for NavigationCancel and NavigationError router events and resets direction, animated, and animationBuilder back to their defaults. This ensures stale state from a canceled navigation does not affect subsequent navigations. The reset puts the NavController into 'auto' mode, which correctly uses guessDirection for the next navigation. ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information Current dev build: ``` 8.7.18-dev.11771020096.1ca03a6d ``` --- .../common/src/providers/nav-controller.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/angular/common/src/providers/nav-controller.ts b/packages/angular/common/src/providers/nav-controller.ts index 1ae3a0a603f..4bb33a67594 100644 --- a/packages/angular/common/src/providers/nav-controller.ts +++ b/packages/angular/common/src/providers/nav-controller.ts @@ -1,6 +1,14 @@ import { Location } from '@angular/common'; import { Injectable, Optional } from '@angular/core'; -import { NavigationExtras, Router, UrlSerializer, UrlTree, NavigationStart } from '@angular/router'; +import { + NavigationExtras, + Router, + UrlSerializer, + UrlTree, + NavigationStart, + NavigationCancel, + NavigationError, +} from '@angular/router'; import type { AnimationBuilder, NavDirection, RouterDirection } from '@ionic/core/components'; import { IonRouterOutlet } from '../directives/navigation/router-outlet'; @@ -42,6 +50,14 @@ export class NavController { this.guessDirection = this.guessAnimation = id < this.lastNavId ? 'back' : 'forward'; this.lastNavId = this.guessDirection === 'forward' ? ev.id : id; } + + // Reset explicit direction when navigation is canceled (e.g., guard rejection) + // to prevent stale direction from leaking into the next navigation + if (ev instanceof NavigationCancel || ev instanceof NavigationError) { + this.direction = DEFAULT_DIRECTION; + this.animated = DEFAULT_ANIMATED; + this.animationBuilder = undefined; + } }); } From 5cea5aeb44393edab7064e5980a1eb7e607d1b8d Mon Sep 17 00:00:00 2001 From: Maria Hutt Date: Tue, 17 Feb 2026 12:50:22 -0800 Subject: [PATCH 30/55] feat(select): add wrapper and bottom shadow parts (#30951) --- core/api.txt | 3 ++ core/src/components/select/select.tsx | 13 +++-- .../select/test/custom/select.e2e.ts | 51 +++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/core/api.txt b/core/api.txt index cec14576248..33582d0fe55 100644 --- a/core/api.txt +++ b/core/api.txt @@ -1758,14 +1758,17 @@ ion-select,css-prop,--placeholder-opacity,ios ion-select,css-prop,--placeholder-opacity,md ion-select,css-prop,--ripple-color,ios ion-select,css-prop,--ripple-color,md +ion-select,part,bottom ion-select,part,container ion-select,part,error-text ion-select,part,helper-text ion-select,part,icon +ion-select,part,inner ion-select,part,label ion-select,part,placeholder ion-select,part,supporting-text ion-select,part,text +ion-select,part,wrapper ion-select-modal,scoped ion-select-modal,prop,cancelText,string,'Close',false,false diff --git a/core/src/components/select/select.tsx b/core/src/components/select/select.tsx index 97309bac332..e39856c2482 100644 --- a/core/src/components/select/select.tsx +++ b/core/src/components/select/select.tsx @@ -45,6 +45,9 @@ import type { SelectChangeEventDetail, SelectInterface, SelectCompareFn } from ' * @part supporting-text - Supporting text displayed beneath the select. * @part helper-text - Supporting text displayed beneath the select when the select is valid. * @part error-text - Supporting text displayed beneath the select when the select is invalid and touched. + * @part bottom - The container element for helper text, error text, and counter. + * @part wrapper - The clickable label element that wraps the entire form field (label text, slots, selected values or placeholder, and toggle icons). + * @part inner - The inner element of the wrapper that manages the slots, selected values or placeholder, and toggle icons. */ @Component({ tag: 'ion-select', @@ -1173,7 +1176,11 @@ export class Select implements ComponentInterface { return; } - return