From 1e82725c829b01418e0bf6d9632a0b3162da3630 Mon Sep 17 00:00:00 2001 From: generaltony007 <191973953+hakarrr@users.noreply.github.com> Date: Tue, 27 Oct 2026 12:46:44 +0530 Subject: [PATCH 1/2] fix(snap): use horizontal coordinate for start alignment Co-authored-by: generaltony007 <144252170+GeneralTony007@users.noreply.github.com> --- packages/snap/src/snap.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap/src/snap.ts b/packages/snap/src/snap.ts index 45b9d7d2..a6f404c2 100644 --- a/packages/snap/src/snap.ts +++ b/packages/snap/src/snap.ts @@ -175,7 +175,7 @@ export class Snap { align.forEach((align) => { if (align === 'start') { - value = rect.top + value = isHorizontal ? rect.left : rect.top } else if (align === 'center') { value = isHorizontal ? rect.left + rect.width / 2 - this.viewport.width / 2 From aaf8e6638f82520ae7fd19d7adfaf3f161b33bd5 Mon Sep 17 00:00:00 2001 From: generaltony007 <191973953+hakarrr@users.noreply.github.com> Date: Tue, 27 Oct 2026 12:47:26 +0530 Subject: [PATCH 2/2] test(snap): cover start center and end alignment on both axes Co-authored-by: generaltony007 <144252170+GeneralTony007@users.noreply.github.com> --- packages/snap/tests/align.test.js | 82 +++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 packages/snap/tests/align.test.js diff --git a/packages/snap/tests/align.test.js b/packages/snap/tests/align.test.js new file mode 100644 index 00000000..e7dc4f78 --- /dev/null +++ b/packages/snap/tests/align.test.js @@ -0,0 +1,82 @@ +import { afterAll, beforeAll, describe, expect, test } from 'bun:test' +import { Snap } from '../src/snap' + +const original = { + window: globalThis.window, + document: globalThis.document, + ResizeObserver: globalThis.ResizeObserver, + getComputedStyle: globalThis.getComputedStyle, +} + +beforeAll(() => { + globalThis.window = { + innerWidth: 800, + innerHeight: 600, + scrollX: 0, + scrollY: 0, + addEventListener() { + /* No event or observer side effects in this unit test. */ + }, + removeEventListener() { + /* No event or observer side effects in this unit test. */ + }, + } + globalThis.document = { body: {} } + globalThis.ResizeObserver = class { + observe() { + /* No event or observer side effects in this unit test. */ + } + disconnect() { + /* No event or observer side effects in this unit test. */ + } + } + globalThis.getComputedStyle = () => ({ position: 'static' }) +}) + +afterAll(() => { + Object.assign(globalThis, original) +}) + +describe('element snap alignment', () => { + for (const isHorizontal of [false, true]) { + for (const [align, horizontal, vertical] of [ + ['start', 640, 20], + ['center', 340, -180], + ['end', 40, -380], + ]) { + test(`${isHorizontal ? 'horizontal' : 'vertical'} ${align}`, () => { + let target + const lenis = { + isHorizontal, + on() { + /* No event or observer side effects in this unit test. */ + }, + off() { + /* No event or observer side effects in this unit test. */ + }, + scrollTo(value) { + target = value + }, + } + const snap = new Snap(lenis) + snap.addElement( + { + getBoundingClientRect: () => ({ left: 640, top: 20 }), + offsetWidth: 200, + offsetHeight: 200, + offsetParent: null, + scrollLeft: 0, + scrollTop: 0, + }, + { align } + ) + try { + snap.goTo(0) + expect(target).toBe(isHorizontal ? horizontal : vertical) + } finally { + snap.destroy() + } + }) + } + } +})