diff --git a/src/lib/timelineEdgeAutoScroll.js b/src/lib/timelineEdgeAutoScroll.js index 1757eb5..21c829d 100644 --- a/src/lib/timelineEdgeAutoScroll.js +++ b/src/lib/timelineEdgeAutoScroll.js @@ -51,6 +51,7 @@ export function createTimelineEdgeAutoScroller({ trackElement, pointerType, time (pointerType === "touch" && isMobile) || (["mouse", "pen"].includes(pointerType) && !isMobile) ); + const usesDesktopTrailingSpacer = enabled && !isMobile; const rulerElement = enabled ? trackElement.closest?.(".timeline-board")?.querySelector?.(".timeline-ruler-canvas") : null; if (enabled) { trackElement.classList?.add("is-trimming"); @@ -79,7 +80,7 @@ export function createTimelineEdgeAutoScroller({ trackElement, pointerType, time spacerElement.style.width = `${geometry.width}px`; }; - if (enabled && scrollElement?.ownerDocument?.createElement) { + if (usesDesktopTrailingSpacer && scrollElement?.ownerDocument?.createElement) { const previousSpacer = scrollElement.querySelector?.("[data-timeline-trim-scroll-spacer]"); previousSpacer?.__timelineTrimCleanup?.(); previousSpacer?.remove?.(); diff --git a/src/lib/timelineEdgeAutoScroll.test.js b/src/lib/timelineEdgeAutoScroll.test.js index b58e762..08da88a 100644 --- a/src/lib/timelineEdgeAutoScroll.test.js +++ b/src/lib/timelineEdgeAutoScroll.test.js @@ -66,6 +66,29 @@ describe("mobile timeline edge auto-scroll", () => { expect(rulerClasses.has("is-trimming")).toBe(false); }); + it("never creates or settles a desktop trailing spacer on mobile", () => { + let appended = 0; + const scrollElement = { + clientWidth: 400, + scrollLeft: 120, + ownerDocument: { createElement: () => ({}) }, + appendChild: () => { appended += 1; }, + }; + const track = { + classList: { add() {}, remove() {} }, + closest: () => null, + parentElement: scrollElement, + }; + const scroller = createTimelineEdgeAutoScroller({ + trackElement: track, + pointerType: "touch", + win: { matchMedia: () => ({ matches: true }), requestAnimationFrame: () => 1, cancelAnimationFrame() {} }, + }); + scroller.stop(); + expect(appended).toBe(0); + expect(scrollElement.scrollLeft).toBe(120); + }); + it("enables the same edge-scroll lifecycle for desktop mouse trimming", () => { const values = new Set(); const track = {