From e7214c85735a957c19ac34a19d15ce73774bcfec Mon Sep 17 00:00:00 2001 From: nexiumbiz-debug <265948173+nexiumbiz-debug@users.noreply.github.com> Date: Sun, 14 Jun 2026 03:37:10 -0400 Subject: [PATCH 1/2] fix: prevent opposite edge auto-scroll --- .../src/lib/gridsterScroll.ts | 20 +++++++++++++++---- .../src/lib/tests/gridsterScroll.spec.ts | 15 ++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 projects/angular-gridster2/src/lib/tests/gridsterScroll.spec.ts diff --git a/projects/angular-gridster2/src/lib/gridsterScroll.ts b/projects/angular-gridster2/src/lib/gridsterScroll.ts index 3f9adc8a..c9aa6f62 100644 --- a/projects/angular-gridster2/src/lib/gridsterScroll.ts +++ b/projects/angular-gridster2/src/lib/gridsterScroll.ts @@ -38,6 +38,10 @@ type Position = Pick; type CalculatePosition = (position: Position) => void; +export function isMovingTowardScrollEdge(lastPosition: number, currentPosition: number, scrollDirection: -1 | 1): boolean { + return scrollDirection === 1 ? lastPosition <= currentPosition : lastPosition >= currentPosition; +} + export function scroll( gridster: Gridster, left: number, @@ -73,13 +77,21 @@ export function scroll( if (elemBottomOffset < scrollSensitivity) { cancelN(); - if (!(resizeEvent && resizeEventType && !resizeEventType.south) && !scrollS) { - startVerticalScroll(1, calculateItemPosition, gridster); + if (isMovingTowardScrollEdge(lastMouse.clientY, clientY, 1)) { + if (!(resizeEvent && resizeEventType && !resizeEventType.south) && !scrollS) { + startVerticalScroll(1, calculateItemPosition, gridster); + } + } else { + cancelS(); } } else if (offsetTop > 0 && elemTopOffset < scrollSensitivity) { cancelS(); - if (!(resizeEvent && resizeEventType && !resizeEventType.north) && !scrollN) { - startVerticalScroll(-1, calculateItemPosition, gridster); + if (isMovingTowardScrollEdge(lastMouse.clientY, clientY, -1)) { + if (!(resizeEvent && resizeEventType && !resizeEventType.north) && !scrollN) { + startVerticalScroll(-1, calculateItemPosition, gridster); + } + } else { + cancelN(); } } else if (lastMouse.clientY !== clientY) { cancelVerticalScroll(); diff --git a/projects/angular-gridster2/src/lib/tests/gridsterScroll.spec.ts b/projects/angular-gridster2/src/lib/tests/gridsterScroll.spec.ts new file mode 100644 index 00000000..2632c410 --- /dev/null +++ b/projects/angular-gridster2/src/lib/tests/gridsterScroll.spec.ts @@ -0,0 +1,15 @@ +import { isMovingTowardScrollEdge } from '../gridsterScroll'; + +describe('scroll edge direction', () => { + it('allows bottom-edge scrolling only while the pointer moves down or stays in place', () => { + expect(isMovingTowardScrollEdge(100, 110, 1)).toBe(true); + expect(isMovingTowardScrollEdge(100, 100, 1)).toBe(true); + expect(isMovingTowardScrollEdge(110, 100, 1)).toBe(false); + }); + + it('allows top-edge scrolling only while the pointer moves up or stays in place', () => { + expect(isMovingTowardScrollEdge(110, 100, -1)).toBe(true); + expect(isMovingTowardScrollEdge(100, 100, -1)).toBe(true); + expect(isMovingTowardScrollEdge(100, 110, -1)).toBe(false); + }); +}); From 6660f07d4acb8e4025f3cd793c9e3d2cca3ff3bb Mon Sep 17 00:00:00 2001 From: nexiumbiz-debug <265948173+nexiumbiz-debug@users.noreply.github.com> Date: Sun, 14 Jun 2026 04:41:16 -0400 Subject: [PATCH 2/2] fix: guard horizontal edge auto-scroll --- .../angular-gridster2/src/lib/gridsterScroll.ts | 16 ++++++++++++---- .../src/lib/tests/gridsterScroll.spec.ts | 12 ++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/projects/angular-gridster2/src/lib/gridsterScroll.ts b/projects/angular-gridster2/src/lib/gridsterScroll.ts index c9aa6f62..84a788e9 100644 --- a/projects/angular-gridster2/src/lib/gridsterScroll.ts +++ b/projects/angular-gridster2/src/lib/gridsterScroll.ts @@ -106,13 +106,21 @@ export function scroll( if (elemRightOffset <= scrollSensitivity) { cancelW(); - if (!(resizeEvent && resizeEventType && !resizeEventType.east) && !scrollE) { - startHorizontalScroll(1, calculateItemPosition, gridster, isRTL); + if (isMovingTowardScrollEdge(lastMouse.clientX, clientX, 1)) { + if (!(resizeEvent && resizeEventType && !resizeEventType.east) && !scrollE) { + startHorizontalScroll(1, calculateItemPosition, gridster, isRTL); + } + } else { + cancelE(); } } else if (offsetLeft > 0 && elemLeftOffset < scrollSensitivity) { cancelE(); - if (!(resizeEvent && resizeEventType && !resizeEventType.west) && !scrollW) { - startHorizontalScroll(-1, calculateItemPosition, gridster, isRTL); + if (isMovingTowardScrollEdge(lastMouse.clientX, clientX, -1)) { + if (!(resizeEvent && resizeEventType && !resizeEventType.west) && !scrollW) { + startHorizontalScroll(-1, calculateItemPosition, gridster, isRTL); + } + } else { + cancelW(); } } else if (lastMouse.clientX !== clientX) { cancelHorizontalScroll(); diff --git a/projects/angular-gridster2/src/lib/tests/gridsterScroll.spec.ts b/projects/angular-gridster2/src/lib/tests/gridsterScroll.spec.ts index 2632c410..79180e04 100644 --- a/projects/angular-gridster2/src/lib/tests/gridsterScroll.spec.ts +++ b/projects/angular-gridster2/src/lib/tests/gridsterScroll.spec.ts @@ -12,4 +12,16 @@ describe('scroll edge direction', () => { expect(isMovingTowardScrollEdge(100, 100, -1)).toBe(true); expect(isMovingTowardScrollEdge(100, 110, -1)).toBe(false); }); + + it('allows right-edge scrolling only while the pointer moves right or stays in place', () => { + expect(isMovingTowardScrollEdge(100, 110, 1)).toBe(true); + expect(isMovingTowardScrollEdge(100, 100, 1)).toBe(true); + expect(isMovingTowardScrollEdge(110, 100, 1)).toBe(false); + }); + + it('allows left-edge scrolling only while the pointer moves left or stays in place', () => { + expect(isMovingTowardScrollEdge(110, 100, -1)).toBe(true); + expect(isMovingTowardScrollEdge(100, 100, -1)).toBe(true); + expect(isMovingTowardScrollEdge(100, 110, -1)).toBe(false); + }); });