From 601757093a1538ce32e28be443bbcc1ace3a0970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Mon, 23 Mar 2026 18:39:25 +0000 Subject: [PATCH 01/27] First checkpoint --- .../components/item-sliding/item-sliding.tsx | 121 ++++++++++++++++++ .../item-sliding/test/full-swipe/index.html | 108 ++++++++++++++++ 2 files changed, 229 insertions(+) create mode 100644 core/src/components/item-sliding/test/full-swipe/index.html diff --git a/core/src/components/item-sliding/item-sliding.tsx b/core/src/components/item-sliding/item-sliding.tsx index fc4d4ce2644..e13e2abae7e 100644 --- a/core/src/components/item-sliding/item-sliding.tsx +++ b/core/src/components/item-sliding/item-sliding.tsx @@ -27,6 +27,7 @@ const enum SlidingState { SwipeEnd = 1 << 5, SwipeStart = 1 << 6, + AnimatingFullSwipe = 1 << 7, } let openSlidingItem: HTMLIonItemSlidingElement | undefined; @@ -113,6 +114,15 @@ export class ItemSliding implements ComponentInterface { this.gesture = undefined; } + // Cancel animation if in progress + if ((this.state & SlidingState.AnimatingFullSwipe) !== 0) { + if (this.item) { + this.item.style.transition = ''; + this.item.style.transform = ''; + } + this.state = SlidingState.Disabled; + } + this.item = null; this.leftOptions = this.rightOptions = undefined; @@ -248,6 +258,100 @@ export class ItemSliding implements ComponentInterface { } } + /** + * Check if the given item options element contains at least one expandable option. + */ + private hasExpandableOptions(options: HTMLIonItemOptionsElement | undefined): boolean { + if (!options) return false; + + const optionElements = options.querySelectorAll('ion-item-option'); + return Array.from(optionElements).some((option: any) => { + return option.expandable === true; + }); + } + + /** + * Animate the item to a specific position using CSS transitions. + * Returns a Promise that resolves when the animation completes. + */ + private animateToPosition(position: number, duration: number): Promise { + return new Promise((resolve) => { + if (!this.item) { + return resolve(); + } + + this.item.style.transition = `transform ${duration}ms ease-out`; + this.item.style.transform = `translate3d(${-position}px, 0, 0)`; + + setTimeout(() => { + resolve(); + }, duration); + }); + } + + /** + * Calculate the swipe threshold distance required to trigger a full swipe animation. + * Returns the maximum options width plus a margin to ensure it's achievable. + */ + private getSwipeThreshold(): number { + const maxWidth = Math.max(this.optsWidthRightSide, this.optsWidthLeftSide); + return maxWidth + 2000; // Slightly larger than SWIPE_MARGIN to be achievable + } + + /** + * Animate the item through a full swipe sequence: off-screen → trigger action → return. + * This is used when an expandable option is swiped beyond the threshold. + */ + private async animateFullSwipe(direction: 'start' | 'end') { + // Prevent interruption during animation + this.state = SlidingState.AnimatingFullSwipe; + if (this.gesture) { + this.gesture.enable(false); + } + + const { el } = this; + el.classList.add('item-sliding-full-swipe'); + + try { + // Calculate which options we're using + const options = direction === 'end' ? this.rightOptions : this.leftOptions; + const optsWidth = direction === 'end' ? this.optsWidthRightSide : this.optsWidthLeftSide; + + // Phase 1: First reveal the options fully (so expandable option fills space) + const initialOpenAmount = direction === 'end' ? optsWidth : -optsWidth; + this.setOpenAmount(initialOpenAmount, false); + await new Promise((resolve) => setTimeout(resolve, 50)); + + // Phase 2: Animate off-screen from current position + const offScreenDistance = direction === 'end' ? window.innerWidth : -window.innerWidth; + await this.animateToPosition(offScreenDistance, 250); + + // Phase 3: Trigger action + if (options) { + options.fireSwipeEvent(); + } + + // Phase 4: Small delay before returning + await new Promise((resolve) => setTimeout(resolve, 500)); + + // Phase 5: Return to closed state + await this.animateToPosition(0, 250); + + // Phase 6: Reset state + if (this.item) { + this.item.style.transition = ''; + } + this.openAmount = 0; + this.state = SlidingState.Disabled; + openSlidingItem = undefined; + } finally { + el.classList.remove('item-sliding-full-swipe'); + if (this.gesture) { + this.gesture.enable(!this.disabled); + } + } + } + private async updateOptions() { const options = this.el.querySelectorAll('ion-item-options'); @@ -370,6 +474,23 @@ export class ItemSliding implements ComponentInterface { resetContentScrollY(contentEl, initialContentScrollY); } + // Check for full swipe conditions with expandable options + const rawSwipeDistance = Math.abs(gesture.deltaX); + const direction = gesture.deltaX < 0 ? 'end' : 'start'; + const options = direction === 'end' ? this.rightOptions : this.leftOptions; + const hasExpandable = this.hasExpandableOptions(options); + + const shouldTriggerFullSwipe = + hasExpandable && + (rawSwipeDistance > this.getSwipeThreshold() || + (Math.abs(gesture.velocityX) > 0.5 && + rawSwipeDistance > Math.max(this.optsWidthRightSide, this.optsWidthLeftSide) * 0.5)); + + if (shouldTriggerFullSwipe) { + this.animateFullSwipe(direction); + return; + } + const velocity = gesture.velocityX; let restingPoint = this.openAmount > 0 ? this.optsWidthRightSide : -this.optsWidthLeftSide; diff --git a/core/src/components/item-sliding/test/full-swipe/index.html b/core/src/components/item-sliding/test/full-swipe/index.html new file mode 100644 index 00000000000..d406593c76d --- /dev/null +++ b/core/src/components/item-sliding/test/full-swipe/index.html @@ -0,0 +1,108 @@ + + + + + Item Sliding - Full Swipe + + + + + + + + + + +

Full Swipe - Expandable Options

+ + + + + Expandable End (Swipe Left) + + + Delete + + + + + + + Expandable Start (Swipe Right) + + + Archive + + + + + + + Expandable Both Sides + + + Archive + + + Delete + + + + +

Non-Expandable Options (No Full Swipe)

+ + + + + Non-Expandable (Should Show Options) + + + Edit + + + + + + + Multiple Non-Expandable Options + + + Edit + Share + Delete + + + + +

Mixed Scenarios

+ + + + + Expandable + Other Options + + + Edit + Delete + + + +
+ + + + From 994b9695e43930493c604c3d8c97c55a8bc758b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Tue, 24 Mar 2026 12:15:40 +0000 Subject: [PATCH 02/27] Second checkpoint --- .../components/item-sliding/item-sliding.tsx | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/core/src/components/item-sliding/item-sliding.tsx b/core/src/components/item-sliding/item-sliding.tsx index e13e2abae7e..44e242f4759 100644 --- a/core/src/components/item-sliding/item-sliding.tsx +++ b/core/src/components/item-sliding/item-sliding.tsx @@ -295,7 +295,7 @@ export class ItemSliding implements ComponentInterface { */ private getSwipeThreshold(): number { const maxWidth = Math.max(this.optsWidthRightSide, this.optsWidthLeftSide); - return maxWidth + 2000; // Slightly larger than SWIPE_MARGIN to be achievable + return maxWidth + 100; // Slightly larger than SWIPE_MARGIN to be achievable } /** @@ -304,7 +304,6 @@ export class ItemSliding implements ComponentInterface { */ private async animateFullSwipe(direction: 'start' | 'end') { // Prevent interruption during animation - this.state = SlidingState.AnimatingFullSwipe; if (this.gesture) { this.gesture.enable(false); } @@ -317,12 +316,17 @@ export class ItemSliding implements ComponentInterface { const options = direction === 'end' ? this.rightOptions : this.leftOptions; const optsWidth = direction === 'end' ? this.optsWidthRightSide : this.optsWidthLeftSide; - // Phase 1: First reveal the options fully (so expandable option fills space) - const initialOpenAmount = direction === 'end' ? optsWidth : -optsWidth; - this.setOpenAmount(initialOpenAmount, false); - await new Promise((resolve) => setTimeout(resolve, 50)); + // Phase 1: Reveal options beyond threshold to trigger expandable state + // This sets the SwipeEnd or SwipeStart state which expands the expandable option + const thresholdAmount = direction === 'end' ? optsWidth + SWIPE_MARGIN : -(optsWidth + SWIPE_MARGIN); + this.setOpenAmount(thresholdAmount, false); - // Phase 2: Animate off-screen from current position + // Add AnimatingFullSwipe flag while preserving the SwipeEnd/SwipeStart state + this.state = this.state | SlidingState.AnimatingFullSwipe; + + await new Promise((resolve) => setTimeout(resolve, 100)); + + // Phase 2: Animate off-screen while maintaining the expanded state const offScreenDistance = direction === 'end' ? window.innerWidth : -window.innerWidth; await this.animateToPosition(offScreenDistance, 250); @@ -332,7 +336,7 @@ export class ItemSliding implements ComponentInterface { } // Phase 4: Small delay before returning - await new Promise((resolve) => setTimeout(resolve, 500)); + await new Promise((resolve) => setTimeout(resolve, 300)); // Phase 5: Return to closed state await this.animateToPosition(0, 250); From a6f271f203c3adf5119d50946959306569447b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Tue, 24 Mar 2026 13:37:55 +0000 Subject: [PATCH 03/27] Add automatic full expand animation to items --- .../components/item-sliding/item-sliding.tsx | 25 +++++++++---------- .../item-sliding/test/full-swipe/index.html | 7 +++--- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/core/src/components/item-sliding/item-sliding.tsx b/core/src/components/item-sliding/item-sliding.tsx index 44e242f4759..aed860b48a6 100644 --- a/core/src/components/item-sliding/item-sliding.tsx +++ b/core/src/components/item-sliding/item-sliding.tsx @@ -314,34 +314,33 @@ export class ItemSliding implements ComponentInterface { try { // Calculate which options we're using const options = direction === 'end' ? this.rightOptions : this.leftOptions; - const optsWidth = direction === 'end' ? this.optsWidthRightSide : this.optsWidthLeftSide; - // Phase 1: Reveal options beyond threshold to trigger expandable state - // This sets the SwipeEnd or SwipeStart state which expands the expandable option - const thresholdAmount = direction === 'end' ? optsWidth + SWIPE_MARGIN : -(optsWidth + SWIPE_MARGIN); - this.setOpenAmount(thresholdAmount, false); - - // Add AnimatingFullSwipe flag while preserving the SwipeEnd/SwipeStart state - this.state = this.state | SlidingState.AnimatingFullSwipe; + // Trigger expandable state without moving the item + // Set state directly so expandable option fills its container, starting from + // the exact position where the user released, without any visual snap. + this.state = + direction === 'end' + ? SlidingState.End | SlidingState.SwipeEnd | SlidingState.AnimatingFullSwipe + : SlidingState.Start | SlidingState.SwipeStart | SlidingState.AnimatingFullSwipe; await new Promise((resolve) => setTimeout(resolve, 100)); - // Phase 2: Animate off-screen while maintaining the expanded state + // Animate off-screen while maintaining the expanded state const offScreenDistance = direction === 'end' ? window.innerWidth : -window.innerWidth; await this.animateToPosition(offScreenDistance, 250); - // Phase 3: Trigger action + // Trigger action if (options) { options.fireSwipeEvent(); } - // Phase 4: Small delay before returning + // Small delay before returning await new Promise((resolve) => setTimeout(resolve, 300)); - // Phase 5: Return to closed state + // Return to closed state await this.animateToPosition(0, 250); - // Phase 6: Reset state + // Reset state if (this.item) { this.item.style.transition = ''; } diff --git a/core/src/components/item-sliding/test/full-swipe/index.html b/core/src/components/item-sliding/test/full-swipe/index.html index d406593c76d..05b7e215f3c 100644 --- a/core/src/components/item-sliding/test/full-swipe/index.html +++ b/core/src/components/item-sliding/test/full-swipe/index.html @@ -96,10 +96,9 @@

Mixed Scenarios

// Log swipe events for debugging document.querySelectorAll('ion-item-sliding').forEach((item) => { const id = item.getAttribute('id'); - const options = item.querySelectorAll('ion-item-option'); - options.forEach((option) => { - option.addEventListener('ionSwipe', () => { - console.log(`[${id}] ionSwipe event fired for:`, option.textContent); + item.querySelectorAll('ion-item-options').forEach((options) => { + options.addEventListener('ionSwipe', () => { + console.log(`[${id}] ionSwipe fired on ${options.getAttribute('side')} side`); }); }); }); From 63274c0b57e0470efa40b1e93b665c333416add3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Tue, 24 Mar 2026 18:54:37 +0000 Subject: [PATCH 04/27] Tweaks --- .../components/item-sliding/item-sliding.tsx | 18 +- .../item-sliding/test/full-swipe/index.html | 155 ++++++++++-------- 2 files changed, 89 insertions(+), 84 deletions(-) diff --git a/core/src/components/item-sliding/item-sliding.tsx b/core/src/components/item-sliding/item-sliding.tsx index aed860b48a6..3481bbcce06 100644 --- a/core/src/components/item-sliding/item-sliding.tsx +++ b/core/src/components/item-sliding/item-sliding.tsx @@ -293,9 +293,9 @@ export class ItemSliding implements ComponentInterface { * Calculate the swipe threshold distance required to trigger a full swipe animation. * Returns the maximum options width plus a margin to ensure it's achievable. */ - private getSwipeThreshold(): number { - const maxWidth = Math.max(this.optsWidthRightSide, this.optsWidthLeftSide); - return maxWidth + 100; // Slightly larger than SWIPE_MARGIN to be achievable + private getSwipeThreshold(direction: 'start' | 'end'): number { + const maxWidth = direction === 'end' ? this.optsWidthRightSide : this.optsWidthLeftSide; + return maxWidth + 30; // Slightly larger than SWIPE_MARGIN to be achievable } /** @@ -312,7 +312,6 @@ export class ItemSliding implements ComponentInterface { el.classList.add('item-sliding-full-swipe'); try { - // Calculate which options we're using const options = direction === 'end' ? this.rightOptions : this.leftOptions; // Trigger expandable state without moving the item @@ -485,9 +484,9 @@ export class ItemSliding implements ComponentInterface { const shouldTriggerFullSwipe = hasExpandable && - (rawSwipeDistance > this.getSwipeThreshold() || + (rawSwipeDistance > this.getSwipeThreshold(direction) || (Math.abs(gesture.velocityX) > 0.5 && - rawSwipeDistance > Math.max(this.optsWidthRightSide, this.optsWidthLeftSide) * 0.5)); + rawSwipeDistance > (direction === 'end' ? this.optsWidthRightSide : this.optsWidthLeftSide) * 0.5)); if (shouldTriggerFullSwipe) { this.animateFullSwipe(direction); @@ -507,14 +506,7 @@ export class ItemSliding implements ComponentInterface { restingPoint = 0; } - const state = this.state; this.setOpenAmount(restingPoint, true); - - if ((state & SlidingState.SwipeEnd) !== 0 && this.rightOptions) { - this.rightOptions.fireSwipeEvent(); - } else if ((state & SlidingState.SwipeStart) !== 0 && this.leftOptions) { - this.leftOptions.fireSwipeEvent(); - } } private calculateOptsWidth() { diff --git a/core/src/components/item-sliding/test/full-swipe/index.html b/core/src/components/item-sliding/test/full-swipe/index.html index 05b7e215f3c..4f94d461cb6 100644 --- a/core/src/components/item-sliding/test/full-swipe/index.html +++ b/core/src/components/item-sliding/test/full-swipe/index.html @@ -15,83 +15,96 @@ - -

Full Swipe - Expandable Options

- - - - - Expandable End (Swipe Left) - - - Delete - - + + + + Item Sliding - Full Swipe + + - - - - Expandable Start (Swipe Right) - - - Archive - - + +
+ Full Swipe - Expandable Options +
+ + + + + Expandable End (Swipe Left) + + + Delete + + - - - - Expandable Both Sides - - - Archive - - - Delete - - - + + + + Expandable Start (Swipe Right) + + + Archive + + -

Non-Expandable Options (No Full Swipe)

- - - - - Non-Expandable (Should Show Options) - - - Edit - - + + + + Expandable Both Sides + + + Archive + + + Delete + + + - - - - Multiple Non-Expandable Options - - - Edit - Share - Delete - - -
+
+ Non-Expandable Options (No Full Swipe) +
+ + + + + Non-Expandable (Should Show Options) + + + Edit + + -

Mixed Scenarios

- - - - - Expandable + Other Options - - - Edit - Delete - - - -
+ + + + Multiple Non-Expandable Options + + + Edit + Share + Delete + + + +
+ Mixed Scenarios +
+ + + + + Expandable + Other Options + + + Edit + Delete + + + + + + @@ -24,7 +35,7 @@
- Full Swipe - Expandable Options +

Full Swipe - Expandable Options

@@ -62,7 +73,7 @@
- Non-Expandable Options (No Full Swipe) +

Non-Expandable Options (No Full Swipe)

@@ -89,7 +100,7 @@
- Mixed Scenarios +

Mixed Scenarios

diff --git a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts index 65414436a05..7092caa9706 100644 --- a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts +++ b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts @@ -27,7 +27,7 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr'] }).forEach(({ ti await dragElementBy(item, page, -190); await page.waitForTimeout(FULL_ANIMATION_MS); - expect(ionSwipe.length).toBeGreaterThan(0); + expect(ionSwipe.length).toBe(1); }); test('should fire ionSwipe when expandable option is swiped fully (start side)', async ({ page }) => { @@ -37,7 +37,7 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr'] }).forEach(({ ti await dragElementBy(item, page, 190); await page.waitForTimeout(FULL_ANIMATION_MS); - expect(ionSwipe.length).toBeGreaterThan(0); + expect(ionSwipe.length).toBe(1); }); test('should return to closed state after full swipe animation completes', async ({ page }) => { From 004e33cb6607617eb069ef2970cf9cf88646d049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Fri, 27 Mar 2026 10:42:44 +0000 Subject: [PATCH 18/27] CR --- .../components/item-sliding/test/full-swipe/item-sliding.e2e.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts index 7092caa9706..030cfacab89 100644 --- a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts +++ b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts @@ -89,7 +89,7 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => { await page.mouse.up(); await page.waitForTimeout(FULL_ANIMATION_MS); - expect(ionSwipe.length).toBeGreaterThan(0); + expect(ionSwipe.length).toBe(1); }); }); }); From f06c1ad410ebc9c04a61717bd1fcc8e0cca5583e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Fri, 27 Mar 2026 14:59:06 +0000 Subject: [PATCH 19/27] CR --- .../test/full-swipe/item-sliding.e2e.ts | 52 +++++++------------ 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts index 030cfacab89..b3f3e0d452e 100644 --- a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts +++ b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts @@ -14,7 +14,7 @@ import { configs, dragElementBy, test } from '@utils/test/playwright'; // Full animation cycle duration (100ms expand + 250ms off-screen + 300ms delay + 250ms return) const FULL_ANIMATION_MS = 1100; -configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr'] }).forEach(({ title, config }) => { +configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEach(({ title, config }) => { test.describe(title('item-sliding: full swipe'), () => { test.beforeEach(async ({ page }) => { await page.goto(`/src/components/item-sliding/test/full-swipe`, config); @@ -23,8 +23,9 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr'] }).forEach(({ ti test('should fire ionSwipe when expandable option is swiped fully (end side)', async ({ page }) => { const ionSwipe = await page.spyOnEvent('ionSwipe'); const item = page.locator('#expandable-end'); + const dragByX = config.direction === 'rtl' ? 190 : -190; - await dragElementBy(item, page, -190); + await dragElementBy(item, page, dragByX); await page.waitForTimeout(FULL_ANIMATION_MS); expect(ionSwipe.length).toBe(1); @@ -33,8 +34,9 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr'] }).forEach(({ ti test('should fire ionSwipe when expandable option is swiped fully (start side)', async ({ page }) => { const ionSwipe = await page.spyOnEvent('ionSwipe'); const item = page.locator('#expandable-start'); + const dragByX = config.direction === 'rtl' ? -190 : 190; - await dragElementBy(item, page, 190); + await dragElementBy(item, page, dragByX); await page.waitForTimeout(FULL_ANIMATION_MS); expect(ionSwipe.length).toBe(1); @@ -43,7 +45,9 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr'] }).forEach(({ ti test('should return to closed state after full swipe animation completes', async ({ page }) => { const item = page.locator('#expandable-end'); - await dragElementBy(item, page, -190); + const dragByX = config.direction === 'rtl' ? 190 : -190; + + await dragElementBy(item, page, dragByX); await page.waitForTimeout(FULL_ANIMATION_MS); await page.waitForChanges(); @@ -54,8 +58,9 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr'] }).forEach(({ ti test('should NOT trigger full swipe animation for non-expandable options', async ({ page }) => { const ionSwipe = await page.spyOnEvent('ionSwipe'); const item = page.locator('#non-expandable'); + const dragByX = config.direction === 'rtl' ? 180 : -180; - await dragElementBy(item, page, -180); + await dragElementBy(item, page, dragByX); await page.waitForTimeout(600); // Non-expandable item should never fire ionSwipe @@ -69,7 +74,7 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr'] }).forEach(({ ti * even if the raw distance alone wouldn't exceed the threshold. * This behavior does not vary across modes. */ -configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => { +configs({ modes: ['md'], directions: ['ltr', 'rtl'] }).forEach(({ title, config }) => { test.describe(title('item-sliding: full swipe velocity'), () => { test('should trigger full swipe animation with fast velocity', async ({ page }) => { await page.goto(`/src/components/item-sliding/test/full-swipe`, config); @@ -83,9 +88,15 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => { const startY = box.y + box.height / 2; const endX = box.x + 30; - await page.mouse.move(startX, startY); - await page.mouse.down(); - await page.mouse.move(endX, startY, { steps: 3 }); + if (config.direction === 'rtl') { + await page.mouse.move(endX, startY); + await page.mouse.down(); + await page.mouse.move(startX, startY, { steps: 3 }); + } else { + await page.mouse.move(startX, startY); + await page.mouse.down(); + await page.mouse.move(endX, startY, { steps: 3 }); + } await page.mouse.up(); await page.waitForTimeout(FULL_ANIMATION_MS); @@ -93,26 +104,3 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => { }); }); }); - -/** - * RTL support: swipe direction is mirrored. In RTL, swiping right - * reveals the "end" side options and should trigger the full animation. - */ -configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEach(({ title, config }) => { - test.describe(title('item-sliding: full swipe'), () => { - test('should fire ionSwipe in the correct swipe direction', async ({ page }) => { - await page.goto(`/src/components/item-sliding/test/full-swipe`, config); - - const ionSwipe = await page.spyOnEvent('ionSwipe'); - const item = page.locator('#expandable-end'); - - // In RTL the "end" side is on the left, revealed by dragging right - const dragByX = config.direction === 'rtl' ? 190 : -190; - - await dragElementBy(item, page, dragByX); - await page.waitForTimeout(FULL_ANIMATION_MS); - - expect(ionSwipe.length).toBeGreaterThan(0); - }); - }); -}); From cdbcdb7a9ce2917521e8e17c87843a715f37671d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Mon, 30 Mar 2026 15:23:21 +0100 Subject: [PATCH 20/27] CR --- core/src/components/item-sliding/item-sliding.tsx | 4 ---- .../item-sliding/test/full-swipe/item-sliding.e2e.ts | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/core/src/components/item-sliding/item-sliding.tsx b/core/src/components/item-sliding/item-sliding.tsx index cfd37dd4406..04958184cbf 100644 --- a/core/src/components/item-sliding/item-sliding.tsx +++ b/core/src/components/item-sliding/item-sliding.tsx @@ -308,9 +308,6 @@ export class ItemSliding implements ComponentInterface { this.gesture.enable(false); } - const { el } = this; - el.classList.add('item-sliding-full-swipe'); - try { const options = direction === 'end' ? this.rightOptions : this.leftOptions; @@ -347,7 +344,6 @@ export class ItemSliding implements ComponentInterface { this.state = SlidingState.Disabled; openSlidingItem = undefined; } finally { - el.classList.remove('item-sliding-full-swipe'); if (this.gesture) { this.gesture.enable(!this.disabled); } diff --git a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts index b3f3e0d452e..31ef98c3f69 100644 --- a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts +++ b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts @@ -28,7 +28,7 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEac await dragElementBy(item, page, dragByX); await page.waitForTimeout(FULL_ANIMATION_MS); - expect(ionSwipe.length).toBe(1); + expect(ionSwipe).toHaveReceivedEventTimes(1); }); test('should fire ionSwipe when expandable option is swiped fully (start side)', async ({ page }) => { @@ -39,7 +39,7 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEac await dragElementBy(item, page, dragByX); await page.waitForTimeout(FULL_ANIMATION_MS); - expect(ionSwipe.length).toBe(1); + expect(ionSwipe).toHaveReceivedEventTimes(1); }); test('should return to closed state after full swipe animation completes', async ({ page }) => { @@ -64,7 +64,7 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEac await page.waitForTimeout(600); // Non-expandable item should never fire ionSwipe - expect(ionSwipe.length).toBe(0); + expect(ionSwipe).not.toHaveReceivedEvent(); }); }); }); @@ -100,7 +100,7 @@ configs({ modes: ['md'], directions: ['ltr', 'rtl'] }).forEach(({ title, config await page.mouse.up(); await page.waitForTimeout(FULL_ANIMATION_MS); - expect(ionSwipe.length).toBe(1); + expect(ionSwipe).toHaveReceivedEventTimes(1); }); }); }); From c66de410906564f86cd4f05652ef2841be358e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Mon, 30 Mar 2026 16:45:44 +0100 Subject: [PATCH 21/27] Revert mistaken button snapshots --- ...-clear-round-ios-ltr-Mobile-Chrome-linux.png | Bin 7355 -> 0 bytes ...-color-round-ios-ltr-Mobile-Chrome-linux.png | Bin 38620 -> 0 bytes ...n-color-round-md-ltr-Mobile-Chrome-linux.png | Bin 36282 -> 0 bytes ...expand-round-ios-ltr-Mobile-Chrome-linux.png | Bin 8847 -> 0 bytes ...-expand-round-md-ltr-Mobile-Chrome-linux.png | Bin 8145 -> 0 bytes ...utline-round-ios-ltr-Mobile-Chrome-linux.png | Bin 9362 -> 0 bytes ...button-round-ios-ltr-Mobile-Chrome-linux.png | Bin 8031 -> 0 bytes .../button-round-md-ltr-Mobile-Chrome-linux.png | Bin 12063 -> 0 bytes 8 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 core/src/components/button/test/round/button.e2e.ts-snapshots/button-clear-round-ios-ltr-Mobile-Chrome-linux.png delete mode 100644 core/src/components/button/test/round/button.e2e.ts-snapshots/button-color-round-ios-ltr-Mobile-Chrome-linux.png delete mode 100644 core/src/components/button/test/round/button.e2e.ts-snapshots/button-color-round-md-ltr-Mobile-Chrome-linux.png delete mode 100644 core/src/components/button/test/round/button.e2e.ts-snapshots/button-expand-round-ios-ltr-Mobile-Chrome-linux.png delete mode 100644 core/src/components/button/test/round/button.e2e.ts-snapshots/button-expand-round-md-ltr-Mobile-Chrome-linux.png delete mode 100644 core/src/components/button/test/round/button.e2e.ts-snapshots/button-outline-round-ios-ltr-Mobile-Chrome-linux.png delete mode 100644 core/src/components/button/test/round/button.e2e.ts-snapshots/button-round-ios-ltr-Mobile-Chrome-linux.png delete mode 100644 core/src/components/button/test/round/button.e2e.ts-snapshots/button-round-md-ltr-Mobile-Chrome-linux.png diff --git a/core/src/components/button/test/round/button.e2e.ts-snapshots/button-clear-round-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/button/test/round/button.e2e.ts-snapshots/button-clear-round-ios-ltr-Mobile-Chrome-linux.png deleted file mode 100644 index 82c4a6d69b5fa6b61282f27b804f6ffddae2c949..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7355 zcma)>RZtwjlg4p(Cs|+#Zoxu;EFRn~*b>}bg6rZWxXa@1?(Pl&7Iz5*C%AL`uj(G| zp6+F8s=KGE=V5BT@7LkVic;7Z?=axt;IL(+#Z}?p;4RJ6b)NM5*eEhIfTW9l2#p}rT&6BL>5~_R<@62Q!{PzNx^Yqh z+Coqqp87?3sBu1q_am;zVOdX1gpX7Lcj!MQ_HyGo`aZoCy05i|PmW^CMa1wn2uYmD z!IN20c%oa7Oa*M2)aL{@CP+KM!Iswcp>91!~fYV_S) z22|FNt?9!dWjgjx&$+X;y2`q@N37_rUKJB9Tt24D__ z75d;g)kd7&QVEC*2v4en_iF@tCP1{}r|$F5m3=7IS7@)1{IsAf(D4M0L~mQj)c;iE z`)8TO2MCura}8dDiKZKy{ChTnYFw?6(%}N`d0ojqJiR(Vd zi1T7D>&N=5_xYn{YdDjToo4oW4~2e!$1?CH>qIa)HD`VFze{rnf z45eDsD-2?MD06Mf{E%dk3F$H;VI)P@Vlo)up$fz6|Mc?XNS$Dr+JUZ}2+{C_9h@It zba)Cs6`M0LezpOdqBW_Qw~cn~!m?vW1;grxX+ zL$t7)-KpDA_ptlhCB6)JZp7<+FEc_n=;$OQC5#Fij#p058f%woYwgMsh-hd`C_;`N&9$&hzpRm~RBY>UtQO^B*0o*9?d$B7@#^Yf;(gic?O88l}nMHihXT4@~ zo69nEm~gB{O)iWpo1Da%M1|>g=VCG!{(T{>0^z0X*4PlmpRrX-W{)#M7nlsPR1IqM z08sOgRnrgqj%>J2OQ;K4Ol-mZM#gYB+Hh^N9%a=yaP@fdg7t88~IqH73y!cTgDR_mgsj+WbxeB+0lr z$(JnQV9E!z;>QxH{GAZzg{-q?i-44==&!^!ed~Y!_5k>Pq(-R&s>v27#O072ime-2 zLjU}&X`FZFJs}4uqm;RQ^K0AS%4v#s_|rz#0+g-Sx@qE_tI*o@x}o2gnEjq1YWt$} zydpeq&4oxLYA(2XebMHWL^J2#g5K!>68}?;F;Q)PJF6!F4i)KO?&&n_w*YD7nzGVe z92Z9H?Z{zIQGDHdDKj2ds9=8*wQJXb7PdJBnV$R5U>{6n{`oaG*Q-@EGh#vI{%qJt&Sn53bXm-o4fN>-=KPwmi) z_J!t*GQ!7FW@s^8M~dAh!_jXjDp1g_o7Z=q=XNN={xp`sr^t3OAPLhK_U}luB1^%r zQvO#7owZD(dDbAJ@ZE+Sr-3{$W_iPpcgEmw>#CLu)r4Y^zT%w`$vW>0o_taIFSNye|0mdh}XY_CWvXkBuj%Rr2jip@`EtEl7!# zUCV05YLe}GZKa=Ix%En5=~1k3Q$V{*6C>K`wZcfzq*0o=h~dlciOipYHg z7%Gy|5oY_Me0)U$UiS3|C< zfD($xvlg&{XJ7j&IGdxCs8(k$?3VOag;`e$hSLmPjTn?#>YIcl3N*CF7^r8<)n8zrfT;mRy0Ztd>!( zPig9Lz6G69gE(9BHc58v^+PK99op|eL8hY&6s>F0kc3uD8+CdR&S=$1l3$Z(>y7gy z^~C*4$U??h&=52fq^A1b61VsMVe9ASL10UfUGe+Xe7}D1V}fx%vb zrd{EtU$FQ7Iz#Hl4uKBOBVJVLg=3W;-P3J9o>eZ>W~}!2@5kK;I_;QNRDj%1;_s)-S_!cj7cmHrc6)BnOn9b;MrYYb&)ldum&J|sS+3Vr+*LuC# z0WMz3kym%S)!g)aU}7dQ>!hS`B6IurMjSZjazOj=+V#d1T->BVaEao73 z*Hhtb4{0xV(qH0H?vU#9tALBfoIQ*M-E(!>tu49*?Wp>)Hrx?mt*wn({g*114s1#z z{`apr-P-Sk+ZUQ!+yl^-YaH!AX@h`53ceE~gBd$nwl(fKYs{_B!mubO<9gW|CviWo zR!mB5J-FC`3U1wv&hhJL8VqqNyfQt`mIYY!lA46OiLlc&5hq>)ma9n5Us9PRZ8Q(R2hC@u1c=PiK_l}zJd3|j zXyWGbxp&Uc*>13EZj9;Wqm%b3$+TO{^!g&r$)i?q%;712IRC+ZG~t@jX6AlC3}u=? z+=?^b&GGx0rMw_b*J~?l4o{9YS5WG!+AGX&tE~ufEqIq$5@oI*EpRUO*8zNdY5wy& zwaXk>g%Rtk>3&2G@jnp3Mz*UuoH9Lm;fh6KG@>+4=}V0a*lzRV!p2Za zW)Mn`SV4I?qsi+unXW!blJqS=BdtT;`Oia3&jFdcw+n)m)WCTt&uYYH20c_ZGb_Tz z#KxrE!r2s-3NlJmQx5Yq;v{N`&xXDA^$oNugbjH{B3K)ngD5rR;Y|^2Ga`~Y?`lF4 z@_DSJ=Mo$8=OI;Cut1^gqvRwNe0CxrIr=0A@9PUX7O(hE4?CiH;w_e^?Q*A z4h~kFw8@ZSif{0`9M3*5?Mn&xYPiK7C-Og90T4sZZjXZ%kU)uN1RNZe$$wY?LPMTT zSn_u(S7+#5h61}l;@;V9%kL^~be@ZOpXfYSb<&uqfTPe7PIyQc>C0gpJ&!gD4Qagp z+RW#+K97RAu+oD%#jiZo{EFUSXsts05tx%#2qsR&!cGig{2JK`To|F%H})yW=UcRDAa>jAg*z*h9HJa^1DsWi&?w5jzd z#|;C9=oS|oM)TW5R;a4Kg7S3C(Q?HAPnP~LmyBP#P)`442#m2dw*i?a-L^(oV3YZC ztEJHQ0~JurvcxwTut;Q*`(ra98iXz~(;LK=;|grRA+g&rVHzq#ej^uG$CjE}iPm%Q zTiPAM;2fVgWe^@MJgxHcmR`F13T4#vetJ4sI(QiZ>_C&D#Zw_}+gBFlS^eNbT7v`k zc76u#IytOdBA2#waUUaR&~+F`G%It6L@kCon`+b_dnPKWt9}?e-H`^3KwA}1nv{aF8( zxBP#Lcju#uYhr5wH2<)b(PfS~M(g^i)dy~JZ@#{PlFn(JB+ydE)%8jC2*npd_)*i|w8v;88asZ!fW#j8^*y z%QCp}W?%cznIKjQnG;tRK6^n_hP#OqGb{|8pS{yi2(+xH`4E32(qm@ASmA~r>L0j> zmHm#xHC)@^c)sQLg&CS;y?;I`eLf!$`Y$X$X&2%Y@#jGhe_Z zf>W+7{McvCU9#mj6Jw<(qP~vLI&$+Nd)?*ZAQRrotQ_^_Egx404vt%pLtnBtWXpQ% zwCG&pyJ3I{YRJcw4neI_pYToZ08k!g{FCg`AQ1y zjtRPmeLw6dUa{^jXhf@v9tUYQr}&w)Dt?a7=BrTi@T5T;en1Y4eUa7^uHKJv`t$W9 zPK+TV&Cv=~-8DmOq96kkp_I92hLN?MEgxEa5tme1tchlnBY#fdJ5sr`+voP?NH^7jr7U>{RxE!J{If~{D-RRu^5X%yL&iadH zVJ4??g_^=rvnY~Sf1RA1)88JqWavwS;l%hiH2`f!wb2|0=2kH!K|BJ4u)(wLO2yiy zM`9AHNCDG@YOyOJ*qPZvoLT@Kmi3nZICCf}d=*q@tcUWfKm5|XzbqcHO8&) zzxw%;lS}HxJoCG{pQ>6Z?gyv(kzdBVf^5D#r9@YR${+^r_M(Pw8$Q$gjFR^IORqWMjsSNhO8ArY4Pp4Xb79r3aGiS zXq=ex)6Ut`05FD(fqD)bqsGIzGrLjO6sii1R%UTdu8>49+mFx*uo?%`HRgdqGq1Kv zT_h7++8aGq!kK4|1?h63GqLDl5X|aGD_95mQnjWMP|!WnyqDv1){zLeP#7>o3zfy^ zAi#A|X|#?lFqpITPoPcH@Ehy0WB4){9BW>GG2?1_FZZJGm=GiX5x^oZ@QrLb%gf1U zH>n5_h{er-DV%mAL>nwK zX~e%1QWmM6{c+u&)yr{k0;&(6xae!cWdaLH`?(pb2yn%46C$0i+jiX)m9o<@U6-d9 zdDWt!a?-cQr%A(Ny(eG@(vak7Om!c3F=j}>xij9a*mG&Hi7mRj1Y^QW5Y3h zx8b8kads%9*)vdeCuQ=^Kd;8Y!(eT`niD%NlP93Vo8Yzk5>knVJYskC8@1}6uE4b6 zcE(9U&}iFj^h<5#L4J78hPitm#8)V!&!3JP5|-pskw!wZV{d7Tz1P|De9nA(O==dw zcm%C4)Y-hI8AG*D$LSsdr1?y!T#!{8U5c@^@s> zL2zD=f(lfmH@IkB zAz7;0J#67(3a+V4M9S4vjj?jyPJv z(AwMa8juAS-V5zFhwO28; z8Irn5d@1a0L#?iQ?u$_DnV_xSyalg})L;5Bm4p7lWZw=0&Mp(eyrZ)C9bn$igNhC8 zX>~N#g@Sa*IOXz4HsN*{9F}0pC1oG|zV%f4-%e;ub()500z_Uo1a&Plre$Amg{Vev zFcP2cqgow{QXK1S(^(WSErO;BUVEO8$cpXz5IZ47dJGa<9N0)9_d&!V@>fC#nR*&q z{!J2FVSUQnOTkPc&ekv zt7w9|czAs2j7S|yyn`WS6me3`$u3OUp3^~TM;-33nu2(6LQPCgTkcyIbpV_wN{jH0 z^TtnBaCH`~P192Ha9t4@Untd9&b-}nfg=x5F-{O{uWr;Eeop?h*qD6chLMux6`rYT zA{wQ`?~Q2_{=QNTa0`CIl!L9En{-)pH!*AHo8xJ^WQKD1O+yJOooL1@tOnG7-P9Rm z<>QIY#R;6PwlC$V`3bVLX)Zin5pUb3;@|#7Y%sw8_e%K!rxmJ^Gjm&w8UXM4MQG5B zC8ByVU=h%4#M0S{3dMP3QxHE9ImXp(B|Z-7f0xQ+1bP!=kBIj(o|>kGoyvLbV#jE2 za+FXcUqzCia$~_@;@+Ml?4*0XAoJM297DOVtIw ziO4Sw6e0*btOu4bZ*e5rue)JtCYxm)&bg^?f-**(mYlM*R0YjSwGq|edTu%Yf&24__NTZZ<%BErGFzUo^I@Vt#6QU2pM5aGH*Ca#l+6h_}7a555#;+0|s0sjRa CMoGK? diff --git a/core/src/components/button/test/round/button.e2e.ts-snapshots/button-color-round-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/button/test/round/button.e2e.ts-snapshots/button-color-round-ios-ltr-Mobile-Chrome-linux.png deleted file mode 100644 index 471104abec288f93bc4ea43823dff839cafd6e76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38620 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 TuS0GQaD_}?+gPjcj$OzvySw2T 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 f-N5>{ZZH9FMhiOWGtFys4E^%wp4ZQt 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 diff --git a/core/src/components/button/test/round/button.e2e.ts-snapshots/button-round-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/button/test/round/button.e2e.ts-snapshots/button-round-ios-ltr-Mobile-Chrome-linux.png deleted file mode 100644 index 02a7a6def7fc04eceec37b7456aa5e06d2fbf77c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8031 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 From 9f5e28ac04ed5a8a5f8af1b8456e4210044ea95e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Mon, 30 Mar 2026 20:10:17 +0100 Subject: [PATCH 22/27] CR --- .../components/item-sliding/item-sliding.tsx | 7 +++ .../test/full-swipe/item-sliding.e2e.ts | 47 +++++++++++-------- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/core/src/components/item-sliding/item-sliding.tsx b/core/src/components/item-sliding/item-sliding.tsx index 04958184cbf..a509b9397eb 100644 --- a/core/src/components/item-sliding/item-sliding.tsx +++ b/core/src/components/item-sliding/item-sliding.tsx @@ -502,7 +502,14 @@ export class ItemSliding implements ComponentInterface { restingPoint = 0; } + const state = this.state; this.setOpenAmount(restingPoint, true); + + if ((state & SlidingState.SwipeEnd) !== 0 && this.rightOptions) { + this.rightOptions.fireSwipeEvent(); + } else if ((state & SlidingState.SwipeStart) !== 0 && this.leftOptions) { + this.leftOptions.fireSwipeEvent(); + } } private calculateOptsWidth() { diff --git a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts index 31ef98c3f69..5bbbb2607b4 100644 --- a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts +++ b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts @@ -25,8 +25,7 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEac const item = page.locator('#expandable-end'); const dragByX = config.direction === 'rtl' ? 190 : -190; - await dragElementBy(item, page, dragByX); - await page.waitForTimeout(FULL_ANIMATION_MS); + await dragElementBy(item, page, dragByX);await ionSwipe.next() expect(ionSwipe).toHaveReceivedEventTimes(1); }); @@ -37,7 +36,7 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEac const dragByX = config.direction === 'rtl' ? -190 : 190; await dragElementBy(item, page, dragByX); - await page.waitForTimeout(FULL_ANIMATION_MS); + await ionSwipe.next(); expect(ionSwipe).toHaveReceivedEventTimes(1); }); @@ -56,15 +55,29 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEac }); test('should NOT trigger full swipe animation for non-expandable options', async ({ page }) => { - const ionSwipe = await page.spyOnEvent('ionSwipe'); const item = page.locator('#non-expandable'); const dragByX = config.direction === 'rtl' ? 180 : -180; await dragElementBy(item, page, dragByX); - await page.waitForTimeout(600); - // Non-expandable item should never fire ionSwipe - expect(ionSwipe).not.toHaveReceivedEvent(); + // Wait long enough for the full swipe animation to complete if it had triggered + await page.waitForTimeout(FULL_ANIMATION_MS); + + // The full swipe animation closes the item (openAmount === 0) after completing. + // For a non-expandable item, no animation runs and the item stays open at optsWidth. + const openAmount = await item.evaluate((el: HTMLIonItemSlidingElement) => el.getOpenAmount()); + expect(Math.abs(openAmount)).toBeGreaterThan(0); + }); + + test('should fire ionSwipe when non-expandable options are swiped past the threshold', async ({ page }) => { + const ionSwipe = await page.spyOnEvent('ionSwipe'); + const item = page.locator('#non-expandable'); + const dragByX = config.direction === 'rtl' ? 190 : -190; + + await dragElementBy(item, page, dragByX); + await ionSwipe.next(); + + expect(ionSwipe).toHaveReceivedEventTimes(1); }); }); }); @@ -84,21 +97,15 @@ configs({ modes: ['md'], directions: ['ltr', 'rtl'] }).forEach(({ title, config const box = (await item.boundingBox())!; // Few steps = high velocity gesture - const startX = box.x + box.width - 10; + const startX = config.direction === 'rtl' ? box.x + 30 : box.x + box.width - 10; + const endX = config.direction === 'rtl' ? box.x + box.width - 10 : box.x + 30; const startY = box.y + box.height / 2; - const endX = box.x + 30; - - if (config.direction === 'rtl') { - await page.mouse.move(endX, startY); - await page.mouse.down(); - await page.mouse.move(startX, startY, { steps: 3 }); - } else { - await page.mouse.move(startX, startY); - await page.mouse.down(); - await page.mouse.move(endX, startY, { steps: 3 }); - } + + await page.mouse.move(startX, startY); + await page.mouse.down(); + await page.mouse.move(endX, startY, { steps: 3 }); await page.mouse.up(); - await page.waitForTimeout(FULL_ANIMATION_MS); + await ionSwipe.next(); expect(ionSwipe).toHaveReceivedEventTimes(1); }); From 754be741e01fd192ebadcab008f6099ed2d0f5b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Tue, 31 Mar 2026 10:44:06 +0100 Subject: [PATCH 23/27] Leverage tmr pattern --- .../components/item-sliding/item-sliding.tsx | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/core/src/components/item-sliding/item-sliding.tsx b/core/src/components/item-sliding/item-sliding.tsx index a509b9397eb..c210f035c72 100644 --- a/core/src/components/item-sliding/item-sliding.tsx +++ b/core/src/components/item-sliding/item-sliding.tsx @@ -114,6 +114,11 @@ export class ItemSliding implements ComponentInterface { this.gesture = undefined; } + if (this.tmr !== undefined) { + clearTimeout(this.tmr); + this.tmr = undefined; + } + // Cancel animation if in progress if ((this.state & SlidingState.AnimatingFullSwipe) !== 0) { if (this.item) { @@ -283,7 +288,10 @@ export class ItemSliding implements ComponentInterface { this.item.style.transition = `transform ${duration}ms ease-out`; this.item.style.transform = `translate3d(${-position}px, 0, 0)`; - setTimeout(() => { + // tmr is shared with setOpenAmount's close timer; this is safe because + // animateFullSwipe only runs while the gesture is disabled. + this.tmr = setTimeout(() => { + this.tmr = undefined; resolve(); }, duration); }); @@ -319,7 +327,12 @@ export class ItemSliding implements ComponentInterface { ? SlidingState.End | SlidingState.SwipeEnd | SlidingState.AnimatingFullSwipe : SlidingState.Start | SlidingState.SwipeStart | SlidingState.AnimatingFullSwipe; - await new Promise((resolve) => setTimeout(resolve, 100)); + await new Promise((resolve) => { + this.tmr = setTimeout(() => { + this.tmr = undefined; + resolve(); + }, 100); + }); // Animate off-screen while maintaining the expanded state const offScreenDistance = direction === 'end' ? window.innerWidth : -window.innerWidth; @@ -331,7 +344,12 @@ export class ItemSliding implements ComponentInterface { } // Small delay before returning - await new Promise((resolve) => setTimeout(resolve, 300)); + await new Promise((resolve) => { + this.tmr = setTimeout(() => { + this.tmr = undefined; + resolve(); + }, 300); + }); // Return to closed state await this.animateToPosition(0, 250); From 5a64eacbcf968dbc9876cd0e720e7c7a74c319b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Tue, 31 Mar 2026 12:57:02 +0100 Subject: [PATCH 24/27] CR + fix lint issue --- core/src/components/item-sliding/item-sliding.tsx | 4 ++-- .../item-sliding/test/full-swipe/item-sliding.e2e.ts | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/src/components/item-sliding/item-sliding.tsx b/core/src/components/item-sliding/item-sliding.tsx index c210f035c72..f78aa9e8bcb 100644 --- a/core/src/components/item-sliding/item-sliding.tsx +++ b/core/src/components/item-sliding/item-sliding.tsx @@ -353,7 +353,7 @@ export class ItemSliding implements ComponentInterface { // Return to closed state await this.animateToPosition(0, 250); - + } finally { // Reset state if (this.item) { this.item.style.transition = ''; @@ -361,7 +361,7 @@ export class ItemSliding implements ComponentInterface { this.openAmount = 0; this.state = SlidingState.Disabled; openSlidingItem = undefined; - } finally { + if (this.gesture) { this.gesture.enable(!this.disabled); } diff --git a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts index 5bbbb2607b4..33539c3a529 100644 --- a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts +++ b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts @@ -25,7 +25,8 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEac const item = page.locator('#expandable-end'); const dragByX = config.direction === 'rtl' ? 190 : -190; - await dragElementBy(item, page, dragByX);await ionSwipe.next() + await dragElementBy(item, page, dragByX); + await ionSwipe.next(); expect(ionSwipe).toHaveReceivedEventTimes(1); }); From b63ddfccea5237c0288d71d55178ef9296bd7cb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Tue, 31 Mar 2026 16:21:22 +0100 Subject: [PATCH 25/27] CR --- .../test/full-swipe/item-sliding.e2e.ts | 107 +++++++++++++++--- 1 file changed, 92 insertions(+), 15 deletions(-) diff --git a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts index 33539c3a529..75fedb87cbc 100644 --- a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts +++ b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts @@ -16,13 +16,23 @@ const FULL_ANIMATION_MS = 1100; configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEach(({ title, config }) => { test.describe(title('item-sliding: full swipe'), () => { - test.beforeEach(async ({ page }) => { - await page.goto(`/src/components/item-sliding/test/full-swipe`, config); - }); - test('should fire ionSwipe when expandable option is swiped fully (end side)', async ({ page }) => { + await page.setContent( + ` + + + Expandable End (Swipe Left) + + + Delete + + + `, + config + ); + const ionSwipe = await page.spyOnEvent('ionSwipe'); - const item = page.locator('#expandable-end'); + const item = page.locator('ion-item-sliding'); const dragByX = config.direction === 'rtl' ? 190 : -190; await dragElementBy(item, page, dragByX); @@ -32,8 +42,22 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEac }); test('should fire ionSwipe when expandable option is swiped fully (start side)', async ({ page }) => { + await page.setContent( + ` + + + Expandable Start (Swipe Right) + + + Archive + + + `, + config + ); + const ionSwipe = await page.spyOnEvent('ionSwipe'); - const item = page.locator('#expandable-start'); + const item = page.locator('ion-item-sliding'); const dragByX = config.direction === 'rtl' ? -190 : 190; await dragElementBy(item, page, dragByX); @@ -43,26 +67,53 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEac }); test('should return to closed state after full swipe animation completes', async ({ page }) => { - const item = page.locator('#expandable-end'); - + await page.setContent( + ` + + + Expandable End (Swipe Left) + + + Delete + + + `, + config + ); + + const item = page.locator('ion-item-sliding'); const dragByX = config.direction === 'rtl' ? 190 : -190; await dragElementBy(item, page, dragByX); await page.waitForTimeout(FULL_ANIMATION_MS); - await page.waitForChanges(); const openAmount = await item.evaluate((el: HTMLIonItemSlidingElement) => el.getOpenAmount()); expect(openAmount).toBe(0); }); test('should NOT trigger full swipe animation for non-expandable options', async ({ page }) => { - const item = page.locator('#non-expandable'); + await page.setContent( + ` + + + Non-Expandable (Should Show Options) + + + Edit + + + `, + config + ); + + const ionSwipe = await page.spyOnEvent('ionSwipe'); + const item = page.locator('ion-item-sliding'); const dragByX = config.direction === 'rtl' ? 180 : -180; await dragElementBy(item, page, dragByX); - // Wait long enough for the full swipe animation to complete if it had triggered - await page.waitForTimeout(FULL_ANIMATION_MS); + await ionSwipe.next(); + await page.waitForChanges(); // The full swipe animation closes the item (openAmount === 0) after completing. // For a non-expandable item, no animation runs and the item stays open at optsWidth. @@ -71,8 +122,22 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEac }); test('should fire ionSwipe when non-expandable options are swiped past the threshold', async ({ page }) => { + await page.setContent( + ` + + + Non-Expandable (Should Show Options) + + + Edit + + + `, + config + ); + const ionSwipe = await page.spyOnEvent('ionSwipe'); - const item = page.locator('#non-expandable'); + const item = page.locator('ion-item-sliding'); const dragByX = config.direction === 'rtl' ? 190 : -190; await dragElementBy(item, page, dragByX); @@ -91,10 +156,22 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEac configs({ modes: ['md'], directions: ['ltr', 'rtl'] }).forEach(({ title, config }) => { test.describe(title('item-sliding: full swipe velocity'), () => { test('should trigger full swipe animation with fast velocity', async ({ page }) => { - await page.goto(`/src/components/item-sliding/test/full-swipe`, config); + await page.setContent( + ` + + + Expandable End (Swipe Left) + + + Delete + + + `, + config + ); const ionSwipe = await page.spyOnEvent('ionSwipe'); - const item = page.locator('#expandable-end'); + const item = page.locator('ion-item-sliding'); const box = (await item.boundingBox())!; // Few steps = high velocity gesture From 1130b7ed8d55eff08b81e00a884b5717922d20f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Tue, 31 Mar 2026 19:32:24 +0100 Subject: [PATCH 26/27] Indentation --- .../test/full-swipe/item-sliding.e2e.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts index 75fedb87cbc..1ba692bf5a3 100644 --- a/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts +++ b/core/src/components/item-sliding/test/full-swipe/item-sliding.e2e.ts @@ -94,15 +94,15 @@ configs({ modes: ['ios', 'md', 'ionic-md'], directions: ['ltr', 'rtl'] }).forEac test('should NOT trigger full swipe animation for non-expandable options', async ({ page }) => { await page.setContent( ` - - - Non-Expandable (Should Show Options) - - - Edit - - - `, + + + Non-Expandable (Should Show Options) + + + Edit + + + `, config ); From 9a58724fd019bbe913637e8e83a75047cf4f6a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Louren=C3=A7o?= Date: Wed, 1 Apr 2026 15:06:44 +0100 Subject: [PATCH 27/27] CR --- .../components/item-sliding/item-sliding.tsx | 99 ++++++++++++------- 1 file changed, 65 insertions(+), 34 deletions(-) diff --git a/core/src/components/item-sliding/item-sliding.tsx b/core/src/components/item-sliding/item-sliding.tsx index f78aa9e8bcb..1d70cbc12d4 100644 --- a/core/src/components/item-sliding/item-sliding.tsx +++ b/core/src/components/item-sliding/item-sliding.tsx @@ -48,6 +48,7 @@ export class ItemSliding implements ComponentInterface { private optsWidthLeftSide = 0; private sides = ItemSide.None; private tmr?: ReturnType; + private animationAbortController?: AbortController; private leftOptions?: HTMLIonItemOptionsElement; private rightOptions?: HTMLIonItemOptionsElement; private optsDirty = true; @@ -119,14 +120,9 @@ export class ItemSliding implements ComponentInterface { this.tmr = undefined; } - // Cancel animation if in progress - if ((this.state & SlidingState.AnimatingFullSwipe) !== 0) { - if (this.item) { - this.item.style.transition = ''; - this.item.style.transform = ''; - } - this.state = SlidingState.Disabled; - } + // Abort any in-progress animation. The abort handler rejects the pending + // promise, causing animateFullSwipe's finally block to run cleanup. + this.animationAbortController?.abort(); this.item = null; this.leftOptions = this.rightOptions = undefined; @@ -168,6 +164,10 @@ export class ItemSliding implements ComponentInterface { */ @Method() async open(side: Side | undefined) { + if ((this.state & SlidingState.AnimatingFullSwipe) !== 0) { + return; + } + /** * It is possible for the item to be added to the DOM * after the item-sliding component was created. As a result, @@ -231,6 +231,9 @@ export class ItemSliding implements ComponentInterface { */ @Method() async close() { + if ((this.state & SlidingState.AnimatingFullSwipe) !== 0) { + return; + } this.setOpenAmount(0, true); } @@ -275,12 +278,31 @@ export class ItemSliding implements ComponentInterface { }); } + /** + * Returns a Promise that resolves after `ms` milliseconds, or rejects if the + * given AbortSignal is fired before the timer expires. + */ + private delay(ms: number, signal: AbortSignal): Promise { + return new Promise((resolve, reject) => { + const id = setTimeout(resolve, ms); + signal.addEventListener( + 'abort', + () => { + clearTimeout(id); + reject(new DOMException('Animation cancelled', 'AbortError')); + }, + { once: true } + ); + }); + } + /** * Animate the item to a specific position using CSS transitions. - * Returns a Promise that resolves when the animation completes. + * Returns a Promise that resolves when the animation completes, or rejects if + * the given AbortSignal is fired. */ - private animateToPosition(position: number, duration: number): Promise { - return new Promise((resolve) => { + private animateToPosition(position: number, duration: number, signal: AbortSignal): Promise { + return new Promise((resolve, reject) => { if (!this.item) { return resolve(); } @@ -288,12 +310,15 @@ export class ItemSliding implements ComponentInterface { this.item.style.transition = `transform ${duration}ms ease-out`; this.item.style.transform = `translate3d(${-position}px, 0, 0)`; - // tmr is shared with setOpenAmount's close timer; this is safe because - // animateFullSwipe only runs while the gesture is disabled. - this.tmr = setTimeout(() => { - this.tmr = undefined; - resolve(); - }, duration); + const id = setTimeout(resolve, duration); + signal.addEventListener( + 'abort', + () => { + clearTimeout(id); + reject(new DOMException('Animation cancelled', 'AbortError')); + }, + { once: true } + ); }); } @@ -303,7 +328,7 @@ export class ItemSliding implements ComponentInterface { */ private getSwipeThreshold(direction: 'start' | 'end'): number { const maxWidth = direction === 'end' ? this.optsWidthRightSide : this.optsWidthLeftSide; - return maxWidth + 30; // Slightly larger than SWIPE_MARGIN to be achievable + return maxWidth + SWIPE_MARGIN; } /** @@ -311,6 +336,10 @@ export class ItemSliding implements ComponentInterface { * This is used when an expandable option is swiped beyond the threshold. */ private async animateFullSwipe(direction: 'start' | 'end') { + const abortController = new AbortController(); + this.animationAbortController = abortController; + const { signal } = abortController; + // Prevent interruption during animation if (this.gesture) { this.gesture.enable(false); @@ -327,16 +356,11 @@ export class ItemSliding implements ComponentInterface { ? SlidingState.End | SlidingState.SwipeEnd | SlidingState.AnimatingFullSwipe : SlidingState.Start | SlidingState.SwipeStart | SlidingState.AnimatingFullSwipe; - await new Promise((resolve) => { - this.tmr = setTimeout(() => { - this.tmr = undefined; - resolve(); - }, 100); - }); + await this.delay(100, signal); // Animate off-screen while maintaining the expanded state const offScreenDistance = direction === 'end' ? window.innerWidth : -window.innerWidth; - await this.animateToPosition(offScreenDistance, 250); + await this.animateToPosition(offScreenDistance, 250, signal); // Trigger action if (options) { @@ -344,23 +368,26 @@ export class ItemSliding implements ComponentInterface { } // Small delay before returning - await new Promise((resolve) => { - this.tmr = setTimeout(() => { - this.tmr = undefined; - resolve(); - }, 300); - }); + await this.delay(300, signal); // Return to closed state - await this.animateToPosition(0, 250); + await this.animateToPosition(0, 250, signal); + } catch { + // Animation was aborted (e.g. component disconnected). finally handles cleanup. } finally { + this.animationAbortController = undefined; + // Reset state if (this.item) { this.item.style.transition = ''; + this.item.style.transform = ''; } this.openAmount = 0; this.state = SlidingState.Disabled; - openSlidingItem = undefined; + + if (openSlidingItem === this.el) { + openSlidingItem = undefined; + } if (this.gesture) { this.gesture.enable(!this.disabled); @@ -503,7 +530,11 @@ export class ItemSliding implements ComponentInterface { rawSwipeDistance > (direction === 'end' ? this.optsWidthRightSide : this.optsWidthLeftSide) * 0.5)); if (shouldTriggerFullSwipe) { - this.animateFullSwipe(direction); + this.animateFullSwipe(direction).catch(() => { + if (this.gesture) { + this.gesture.enable(!this.disabled); + } + }); return; }